Flutter: рисуем форму авторизации с маской ввода

Задача: нарисовать форму ввода телефона для авторизации, с учётом маски и проверкой корректности ввода номера. Должно получиться что-то вроде:

Решение:

Для накладывания маски на TextFormField воспользуемся пакетом flutter_multi_formatter:

                                      Text('Введите номер телефона'),
                                      Container(
                                          padding: const EdgeInsets.all(0),
                                          width: 150,
                                          child:
                                          TextFormField(
                                                keyboardType: TextInputType.phone,
                                                inputFormatters: [
                                                  PhoneInputFormatter(
                                                  )
                                                ],
                                                style: TextStyle(fontSize: 16),
                                                controller: _controllerPhone
                                            ),
                                          ),

Для того, чтобы подсвечивать кнопку разным цветом, в зависимости от введенного текста, добавим флажек phone_is_ok и два стиля оформления, на которые будет переключаться стиль кнопки в зависимости от флажка:

   final ButtonStyle raisedButtonStyleFail = ElevatedButton.styleFrom(
     onPrimary: Colors.black87,
     primary: Colors.grey[300],
     minimumSize: Size(88, 36),
     padding: EdgeInsets.symmetric(horizontal: 16),
     shape: const RoundedRectangleBorder(
       borderRadius: BorderRadius.all(Radius.circular(10)),
     ),
   );
   final ButtonStyle raisedButtonStyleSuccess = ElevatedButton.styleFrom(
     onPrimary: Colors.black87,
     primary: Colors.orangeAccent,
     minimumSize: Size(88, 36),
     padding: EdgeInsets.symmetric(horizontal: 16),
     shape: const RoundedRectangleBorder(
       borderRadius: BorderRadius.all(Radius.circular(10)),
     ),
   );

Саму кнопку нарисуем как:

                                      Container(
                                          padding: const EdgeInsets.only(top: 16),
                                          width: 150,
                                          child:
                                              ElevatedButton(
                                                style: phone_is_ok?raisedButtonStyleSuccess:raisedButtonStyleFail,
                                                onPressed: (){},
                                                child: Text('Далее', style: TextStyle(fontSize: 15)),
                                          )   ,
                                      ),

Переключение флажка будем делать, отслеживая введенный текст:

class _LoginState extends State<Login> {
   final scaffoldKey = GlobalKey<ScaffoldState>();
   final _controllerPhone = TextEditingController();
   bool phone_is_ok=false;
...
   @override
  void initState() {
     super.initState();
    _controllerPhone.text="+7";
    _controllerPhone.addListener(() {
      print(_controllerPhone.text);
      if (_controllerPhone.text.length==18){
        phone_is_ok=true;
      } else {
        phone_is_ok=false;
      };
setState(() {
     });
    });
  }

Windows: удаление папок по маске

К сожалению нормального решения не из командной строки не нашел. Так что открываем CMD, переходим туда, где лежат папки для удаления и выполняем команду вида:

for /d %a in ("*маска*") do rd /s /q "%a"

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");
	Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;
	Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;		
	
КонецПроцедуры
1 54 55 56 57 58 310