Selenium: Запуск браузера хром в «скрытом» режиме

Аргумент запуска —headless хоть и работает, но многие сайты к сожалению работают в таком «скрытом» режиме не вполне корректно. Интернет говорит, что скорее всего дело в том, что браузер запускается с не понятным размером окна. Однако принудительное выставление размера, в моём случае не помогло. Решением оказалось запуск браузера «за пределами экрана». А именно что-то вроде:

chromeOptions.addArguments("--window-position=4000,0");

1С: Получить таблицы из Html

Задача: в неком html файле содержится несколько таблиц. Необходимо их распарсить и обработать силами 1С

Решение: воспользуемся построителем DOM. Результатом работы функции будет массив таблиц html документа.

&НаСервере
Функция УбратьНеОбрабатываемыеСимволы(стр)
	стр=стрзаменить(стр," ","_");
	стр=стрзаменить(стр,"№","N");
	стр=стрзаменить(стр,"-","_");
	стр=стрзаменить(стр,".","_");
	стр=стрзаменить(стр,",","_");
	стр=стрзаменить(стр,"/","_");
	возврат стр;
конецфункции	
&НаСервере
Функция ПреобразоватьФайлHtmlВМассивТаблиц(АдресХранилищаФайла)	
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилищаФайла);
	ИмяВременногоФайлаСпр = ПолучитьИмяВременногоФайла("html");
	ДвоичныеДанные.Записать(ИмяВременногоФайлаСпр);     
	
	ЧтениеHTML = Новый ЧтениеHTML;
	ЧтениеHTML.ОткрытьФайл(ИмяВременногоФайлаСпр, "UTF-8");

	ПостроительDOM = Новый ПостроительDOM;
	ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
	ЭлементыТаблицы = ДокументHTML.ПолучитьЭлементыПоИмени("table");
	
	МассивТаблиц=Новый Массив();	
	для каждого таблица из	ЭлементыТаблицы цикл
	  ТЗ=Новый ТаблицаЗначений();	
	  строкиТаблицы=таблица.ПолучитьЭлементыПоИмени("tr");	
	      ПрочитаноСтрок=0;
		  для каждого строкаТаблицы из	строкиТаблицы цикл
		  	колонки=строкаТаблицы.ПолучитьЭлементыПоИмени("td");			
			ПрочитаноКолонок=0;
			для каждого колонка из колонки цикл
				если ПрочитаноСтрок=0 тогда
					ТЗ.Колонки.Добавить(УбратьНеОбрабатываемыеСимволы(колонка.ТекстовоеСодержимое));
				иначе
					если ПрочитаноКолонок=0 тогда
					 нс=ТЗ.Добавить()
				    конецесли;		 
				    нс[ПрочитаноКолонок]=колонка.ТекстовоеСодержимое;
				конецесли;	
				ПрочитаноКолонок=ПрочитаноКолонок+1;
			конеццикла;		
			ПрочитаноСтрок=ПрочитаноСтрок+1;
		  конеццикла;
	  МассивТаблиц.Добавить(ТЗ);
	конеццикла;	
	ЧтениеHTML.Закрыть();											
	
конецфункции

&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
    Фильтр = НСтр("ru = 'Текст'; en = 'Text'")+ "(*.xls)|*.xlsx";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файлы";
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
		ФайлСМС="";
		Для Каждого ИмяФайла Из МассивФайлов Цикл
			ФайлСМС=ИмяФайла;
		конеццикла;
		если ФайлСМС<>"" тогда 			
					АдресХранилищаФайла = "";			
					Состояние("Перемещаю файл на сервер");
		            ПоместитьФайл(АдресХранилищаФайла, ФайлСМС, , Ложь, ЭтаФорма.УникальныйИдентификатор);   					
					Состояние("Обрабатывается файл "+ФайлСМС);							
					таблицы=ПреобразоватьФайлHtmlВМассивТаблиц(АдресХранилищаФайла);					
		иначе
			сообщить("Файл не выбран");
		конецесли;	
	конецесли;	        
КонецПроцедуры

1C: Выбор из нескольких вариантов макета отчета СКД

Задача: в зависимости от внешних условий, выводить тот или иной вариант отчёта СКД.

Решение:

Добавим в отчёт два макета СКД:

Далее, в зависимости от нажатой кнопки, формируем разные данные:

&НаСервере
Процедура РукамиНаСервере(ТаблДок,мак)
	 ОбъектОтчетНаСервере = РеквизитФормыВЗначение("Отчет");
     СхемаСКД = ОбъектОтчетНаСервере.ПолучитьМакет(мак);
	 
	// с парамертрами по умолчанию 
	//КомпоновщикНастроекДанныхОтчета = Новый КомпоновщикНастроекКомпоновкиДанных;
	//КомпоновщикНастроекДанныхОтчета.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаСКД));
	//КомпоновщикНастроекДанныхОтчета.ЗагрузитьНастройки(СхемаСКД.НастройкиПоУмолчанию);
	//КомпоновщикНастроекДанныхОтчета.ЗагрузитьПользовательскиеНастройки(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);
	//КомпоновщикМакетаОСКД = Новый КомпоновщикМакетаКомпоновкиДанных;
	//Макет = КомпоновщикМакетаОСКД.Выполнить(СхемаСКД, КомпоновщикНастроекДанныхОтчета.ПолучитьНастройки());

	// задаем сами
     НастройкиСхемыОСКД = СхемаСКД.НастройкиПоУмолчанию;
	 ПараметрыДанныхОСКД = НастройкиСхемыОСКД.ПараметрыДанных.Элементы;
	 
	 ЭлементНачалоПериода = ПараметрыДанныхОСКД.Найти("Период");
	 ЭлементНачалоПериода.Использование = Истина;	 
	 
	 ДатаНачала = ФильтрПериод.ДатаНачала;
	 ДатаОкончания = ФильтрПериод.ДатаОкончания;
	 
     ЭлементНачалоПериода.Значение.ДатаНачала        = НачалоМесяца(ДатаНачала);
     ЭлементНачалоПериода.Значение.ДатаОкончания    = КонецМесяца(ДатаОкончания);	 
	 
	 ЭлементНачалоПериода = ПараметрыДанныхОСКД.Найти("СетеваяОрганизация");
	 ЭлементНачалоПериода.Использование = Истина;	 
	 ЭлементНачалоПериода.Значение=отчет.Сетевая;

	 ЭлементНачалоПериода = ПараметрыДанныхОСКД.Найти("Фильтр");
	 ЭлементНачалоПериода.Использование = Истина;	 
	 ЭлементНачалоПериода.Значение=отчет.Фильтр;
	 	 
	 
	 КомпоновщикМакетаОСКД = Новый КомпоновщикМакетаКомпоновкиДанных;
	 Макет = КомпоновщикМакетаОСКД.Выполнить(СхемаСКД, НастройкиСхемыОСКД);
	 Фильтр=отчет.Фильтр;
	 

	ПроцессорКомпоновкиОСКД = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиОСКД.Инициализировать(Макет);
	ТаблДок.Очистить();
	ПроцессорВыводаОСКД = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВыводаОСКД.УстановитьДокумент(ТаблДок);
	ПроцессорВыводаОСКД.Вывести(ПроцессорКомпоновкиОСКД);	
	ПроцессорВыводаОСКД.ЗакончитьВывод();
КонецПроцедуры

&НаКлиенте
Процедура ОтчетПоЕМК(Команда)
	РукамиНаСервере(Результат,"ОсновнаяСхемаКомпоновкиДанных");
	Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;
	Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;		
КонецПроцедуры

&НаКлиенте
Процедура ОтчетПоЛС(Команда)
	РукамиНаСервере(Результат,"ОсновнаяСхемаКомпоновкиДанных1");
	Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;
	Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;		
	
КонецПроцедуры

Grafana: правильное выставление времени на графике

К сожалению так и не смог докопаться до истины, почему при отображении графика на панели, время сбивается в непонятные значения +3 часа. Хотя и в настройках панели и в настройках отображения везде установлено руками UTC+3. Пришлось решать проблему кардинально, изменив время в запросе:

SELECT CONVERT_TZ(m_data.dt,'+00:00','-03:00') as dt ,CAST(m_data.value as int) as 'Mikrotik'  FROM m_data.m_data 
WHERE m_data.place=10 and m_data.source=12 and m_data.value_type=1 order by dt limit 500

Microtik: включение API и вывод уровня сигнала wifi соеднинений

Вывести уровни сигнала соединений:

/interface wireless registration-table> print

Включить сервис API:

/ip service> enable 5
1 54 55 56 57 58 308