При разработке интерфейсов на обычных формах часто возникает задача динамической валидации данных: например, сделать доступными основные кнопки или элементы управления только тогда, когда пользователь заполнил все обязательные параметры. Для реквизитов с типами справочников, документов или перечислений стандартное событие ПриИзменении отрабатывает сразу после выбора значения из списка или диалога. Однако при работе с обычным строковым полем ввода стандартное событие ПриИзменении вызывается только в момент завершения редактирования — при нажатии клавиши Enter или при переходе фокуса на другой элемент управления.
Если текстовое поле заполняется пользователем в последнюю очередь, возникает неудобство: текст набран, но связанные элементы остаются заблокированными, пока пользователь не кликнет мышью вне поля или не нажмет Enter. Рассмотрим, как отследить ввод текста в обычном приложении и какие есть подходы к решению этой задачи.
В платформе «1С:Предприятие» для элемента управления ПолеВвода в обычном приложении нет низкоуровневых событий нажатия клавиш клавиатуры. Однако перехватить ввод до потери фокуса можно с помощью стандартного события АвтоПодборТекста. Платформа вызывает этот обработчик с небольшой системной задержкой (около 1 секунды после приостановки набора текста).
Разберем важные особенности работы с этим событием:
Текст: набранная пользователем строка передается именно в этот параметр. Сам реквизит формы в этот момент еще не содержит нового значения, поэтому в процедуре проверки необходимо анализировать переданный параметр Текст.СтандартнаяОбработка следует присвоить значение Ложь.Посмотрим на пример реализации обработчика:
Процедура ПолеВводаСтрокиАвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
// Отключаем стандартный поиск и дополнение строк
СтандартнаяОбработка = Ложь;
// Проверяем заполненность набранного текста
Если Не ПустаяСтрока(СокрЛП(Текст)) Тогда
// Выполняем логику разблокировки элементов
ЭлементыФормы.КнопкаВыполнить.Доступность = Истина;
Иначе
ЭлементыФормы.КнопкаВыполнить.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры
Если задержка автоподбора не подходит или на форме расположено несколько полей со сложными условиями взаимной проверки, можно применить периодическую проверку состояния формы через обработчик ожидания. Метод ПодключитьОбработчикОжидания запускает процедуру с заданным интервалом (минимальный интервал — 1 секунда).
Разберем по шагам подключение и логику работы такого механизма:
ОтключитьОбработчикОжидания.
Процедура ПриОткрытии()
ПодключитьОбработчикОжидания("ПроверитьЗаполнениеФормы", 1, Ложь);
КонецПроцедуры
Процедура ПроверитьЗаполнениеФормы()
// Проверяем значения реквизитов формы
ВсеЗаполнено = ЗначениеЗаполнено(РеквизитСправочник)
И Не ПустаяСтрока(СокрЛП(РеквизитСтрока));
ЭлементыФормы.ПанельДействий.Доступность = ВсеЗаполнено;
КонецПроцедуры
Процедура ПриЗакрытии()
ОтключитьОбработчикОжидания("ПроверитьЗаполнениеФормы");
КонецПроцедуры
Событие ОкончаниеВводаТекста вызывается в момент, когда платформа преобразует набранную пользователем строку в значение (при нажатии клавиши Enter или при потере фокуса). В обработчик передается параметр Текст, что позволяет сразу присвоить значение реквизиту и выполнить общую проверку без ожидания стандартного срабатывания ПриИзменении:
Процедура ПолеВводаСтрокиОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
// Принудительно фиксируем значение в реквизите
РеквизитСтрока = СокрЛП(Текст);
// Вызываем общую процедуру валидации формы
ПроверитьИРазблокироватьЭлементы();
КонецПроцедуры
Динамическая блокировка элементов управления при незаполненных параметрах часто усложняет пользовательский сценарий. Согласно стандартам разработки 1С, более удобным и надежным решением является проверка данных непосредственно в момент нажатия целевой кнопки (например, «Сформировать» или «Выполнить»).
Проанализируем типовой алгоритм:
АвтоОтметкаНезаполненного или устанавливаем свойство ОтметкаНезаполненного = Истина. Поле будет визуально выделено красным пунктиром.ЭтаФорма.ТекущийЭлемент:
Процедура КнопкаВыполнитьНажатие(Кнопка)
Если ПустаяСтрока(СокрЛП(РеквизитСтрока)) Тогда
Предупреждение("Необходимо заполнить обязательный строковый параметр!");
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ПолеВводаСтроки;
Возврат;
КонецЕсли;
// Основной алгоритм обработки
ВыполнитьОбработкуДанных();
КонецПроцедуры
Такой подход избавляет от необходимости отслеживать промежуточный посимвольный ввод, сохраняет предсказуемость интерфейса и полностью соответствует стандартам разработки в среде «1С:Предприятие».