Как отследить ввод текста в поле ввода на обычной форме 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на обычных формах часто возникает задача динамической валидации данных: например, сделать доступными основные кнопки или элементы управления только тогда, когда пользователь заполнил все обязательные параметры. Для реквизитов с типами справочников, документов или перечислений стандартное событие ПриИзменении отрабатывает сразу после выбора значения из списка или диалога. Однако при работе с обычным строковым полем ввода стандартное событие ПриИзменении вызывается только в момент завершения редактирования — при нажатии клавиши Enter или при переходе фокуса на другой элемент управления.

Если текстовое поле заполняется пользователем в последнюю очередь, возникает неудобство: текст набран, но связанные элементы остаются заблокированными, пока пользователь не кликнет мышью вне поля или не нажмет Enter. Рассмотрим, как отследить ввод текста в обычном приложении и какие есть подходы к решению этой задачи.

Способ 1. Использование события «АвтоПодборТекста»

В платформе «1С:Предприятие» для элемента управления ПолеВвода в обычном приложении нет низкоуровневых событий нажатия клавиш клавиатуры. Однако перехватить ввод до потери фокуса можно с помощью стандартного события АвтоПодборТекста. Платформа вызывает этот обработчик с небольшой системной задержкой (около 1 секунды после приостановки набора текста).

Разберем важные особенности работы с этим событием:

  1. Параметр Текст: набранная пользователем строка передается именно в этот параметр. Сам реквизит формы в этот момент еще не содержит нового значения, поэтому в процедуре проверки необходимо анализировать переданный параметр Текст.
  2. Отключение стандартной обработки: чтобы платформа не пыталась автоматически дополнять строку значениями из истории или списка выбора и не сбивала позицию курсора, параметру СтандартнаяОбработка следует присвоить значение Ложь.

Посмотрим на пример реализации обработчика:


Процедура ПолеВводаСтрокиАвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
    
    // Отключаем стандартный поиск и дополнение строк
    СтандартнаяОбработка = Ложь;
    
    // Проверяем заполненность набранного текста
    Если Не ПустаяСтрока(СокрЛП(Текст)) Тогда
        // Выполняем логику разблокировки элементов
        ЭлементыФормы.КнопкаВыполнить.Доступность = Истина;
    Иначе
        ЭлементыФормы.КнопкаВыполнить.Доступность = Ложь;
    КонецЕсли;

КонецПроцедуры

Способ 2. Фоновая проверка через обработчик ожидания

Если задержка автоподбора не подходит или на форме расположено несколько полей со сложными условиями взаимной проверки, можно применить периодическую проверку состояния формы через обработчик ожидания. Метод ПодключитьОбработчикОжидания запускает процедуру с заданным интервалом (минимальный интервал — 1 секунда).

Разберем по шагам подключение и логику работы такого механизма:

  1. При открытии формы подключаем фоновую процедуру проверки состояния реквизитов.
  2. В теле фоновой процедуры проверяем заполненность необходимых реквизитов и управляем доступностью элементов.
  3. При закрытии формы обязательно отключаем обработчик ожидания методом ОтключитьОбработчикОжидания.

Процедура ПриОткрытии()
    ПодключитьОбработчикОжидания("ПроверитьЗаполнениеФормы", 1, Ложь);
КонецПроцедуры

Процедура ПроверитьЗаполнениеФормы()
    // Проверяем значения реквизитов формы
    ВсеЗаполнено = ЗначениеЗаполнено(РеквизитСправочник) 
                   И Не ПустаяСтрока(СокрЛП(РеквизитСтрока));
                   
    ЭлементыФормы.ПанельДействий.Доступность = ВсеЗаполнено;
КонецПроцедуры

Процедура ПриЗакрытии()
    ОтключитьОбработчикОжидания("ПроверитьЗаполнениеФормы");
КонецПроцедуры

Способ 3. Перехват через событие «ОкончаниеВводаТекста»

Событие ОкончаниеВводаТекста вызывается в момент, когда платформа преобразует набранную пользователем строку в значение (при нажатии клавиши Enter или при потере фокуса). В обработчик передается параметр Текст, что позволяет сразу присвоить значение реквизиту и выполнить общую проверку без ожидания стандартного срабатывания ПриИзменении:


Процедура ПолеВводаСтрокиОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
    
    // Принудительно фиксируем значение в реквизите
    РеквизитСтрока = СокрЛП(Текст);
    
    // Вызываем общую процедуру валидации формы
    ПроверитьИРазблокироватьЭлементы();

КонецПроцедуры

Рекомендуемый UX-подход: валидация при выполнении действия

Динамическая блокировка элементов управления при незаполненных параметрах часто усложняет пользовательский сценарий. Согласно стандартам разработки 1С, более удобным и надежным решением является проверка данных непосредственно в момент нажатия целевой кнопки (например, «Сформировать» или «Выполнить»).

Проанализируем типовой алгоритм:

  1. Оставляем все элементы управления и кнопки доступными пользователю.
  2. Для обязательных полей включаем свойство АвтоОтметкаНезаполненного или устанавливаем свойство ОтметкаНезаполненного = Истина. Поле будет визуально выделено красным пунктиром.
  3. При нажатии основной кнопки проверяем заполнение всех ключевых полей. Если поле не заполнено, выводим предупреждение и программно переносим курсор на незаполненный элемент с помощью свойства ЭтаФорма.ТекущийЭлемент:

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Если ПустаяСтрока(СокрЛП(РеквизитСтрока)) Тогда
        Предупреждение("Необходимо заполнить обязательный строковый параметр!");
        ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ПолеВводаСтроки;
        Возврат;
    КонецЕсли;
    
    // Основной алгоритм обработки
    ВыполнитьОбработкуДанных();

КонецПроцедуры

Такой подход избавляет от необходимости отслеживать промежуточный посимвольный ввод, сохраняет предсказуемость интерфейса и полностью соответствует стандартам разработки в среде «1С:Предприятие».

← На главную