Как в управляемых формах 1С обработать выбор поля и управлять видимостью связанных элементов?

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

При разработке интерфейсов на управляемых формах часто возникает задача динамического показа вспомогательной информации: например, отобразить панель связанных документов или подсказать контакты в момент, когда пользователь кликает мышью по полю ввода или переходит в него с клавиатуры. Разберем особенности работы событий элементов формы и выясним, как правильно решить такую задачу в 1С:Предприятии 8.3.

Ограничение платформы: событие получения фокуса

Проанализируем архитектуру элементов управляемой формы. В стандартных элементах типа Поле (ПолеФормы: поле ввода, поле надписи и т. д.) отсутствует штатное событие входа в поле или клика на него (аналог веб-события OnFocus или OnSetFocus). Платформа 1С оптимизирует трафик между клиентом и сервером и не генерирует события формы при простой смене курсора между полями.

События для поля ввода срабатывают только при совершении явного действия со стороны пользователя:

  1. Начало интерактивного набора данных или выбор из списка.
  2. Смена значения и уход из элемента.
  3. Нажатие кнопок поля (кнопка выбора, кнопка списка, кнопка открытия).

События активизации (ПриАктивизацииПоля, ПриАктивизацииСтроки) поддерживаются только коллекциями и элементами типа ТаблицаФормы. Рассмотрим практические способы реализации требуемого интерфейсного поведения.

Способ 1. Обработка ввода текста на лету через АвтоПодбор и ОкончаниеВводаТекста

Если необходимо выводить связанную таблицу при начале взаимодействия с полем, используем событие АвтоПодбор. Оно вызывается на клиенте при каждом изменении текста в процессе ввода, что позволяет мгновенно включить видимость нужной группы и применить отбор.

Для скрытия элементов после завершения редактирования используем событие ОкончаниеВводаТекста или ПриИзменении. Посмотрим на пример программного кода:


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

&НаКлиенте
Процедура КонтактEmailОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
    // При завершении ввода скрываем панель, если поле пустое
    Если ПустаяСтрока(Текст) И Не ЗначениеЗаполнено(Объект.Контакт) Тогда
        Элементы.ГруппаСвязанныеДокументы.Видимость = Ложь;
    КонецЕсли;
КонецПроцедуры

Способ 2. Использование событий НачалоВыбора и НачалоВыбораИзСписка

Если требуется показать панель именно в момент интерактивного выбора контакта пользователем, включаем у поля ввода свойство КнопкаВыбора или КнопкаСпискаВыбора. В обработчике события НачалоВыбора можно переопределить стандартное поведение и показать собственную панель на форме:


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

Способ 3. Отслеживание текущего элемента через обработчик ожидания

В исключительных случаях, когда необходимо строго отслеживать факт нахождения курсора в определенном поле до ввода текста, применяем периодический опрос свойства формы ТекущийЭлемент с помощью обработчика ожидания.

Разберем по шагам, как подключить такую проверку:

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПодключитьОбработчикОжидания("ПроверитьФокусПоля", 0.2);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьФокусПоля()
    НаходитсяВПоле = (ТекущийЭлемент = Элементы.КонтактEmail);
    Если Элементы.ГруппаСвязанныеДокументы.Видимость <> НаходитсяВПоле Тогда
        Элементы.ГруппаСвязанныеДокументы.Видимость = НаходитсяВПоле;
    КонецЕсли;
КонецПроцедуры

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

Рекомендуемые интерфейсные решения

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

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