При разработке интерфейсов на управляемых формах часто возникает задача динамического показа вспомогательной информации: например, отобразить панель связанных документов или подсказать контакты в момент, когда пользователь кликает мышью по полю ввода или переходит в него с клавиатуры. Разберем особенности работы событий элементов формы и выясним, как правильно решить такую задачу в 1С:Предприятии 8.3.
Проанализируем архитектуру элементов управляемой формы. В стандартных элементах типа Поле (ПолеФормы: поле ввода, поле надписи и т. д.) отсутствует штатное событие входа в поле или клика на него (аналог веб-события OnFocus или OnSetFocus). Платформа 1С оптимизирует трафик между клиентом и сервером и не генерирует события формы при простой смене курсора между полями.
События для поля ввода срабатывают только при совершении явного действия со стороны пользователя:
События активизации (ПриАктивизацииПоля, ПриАктивизацииСтроки) поддерживаются только коллекциями и элементами типа ТаблицаФормы. Рассмотрим практические способы реализации требуемого интерфейсного поведения.
Если необходимо выводить связанную таблицу при начале взаимодействия с полем, используем событие АвтоПодбор. Оно вызывается на клиенте при каждом изменении текста в процессе ввода, что позволяет мгновенно включить видимость нужной группы и применить отбор.
Для скрытия элементов после завершения редактирования используем событие ОкончаниеВводаТекста или ПриИзменении. Посмотрим на пример программного кода:
&НаКлиенте
Процедура КонтактEmailАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
// Отображаем скрытую группу с документами контрагента
Если Элементы.ГруппаСвязанныеДокументы.Видимость = Ложь Тогда
Элементы.ГруппаСвязанныеДокументы.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КонтактEmailОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
// При завершении ввода скрываем панель, если поле пустое
Если ПустаяСтрока(Текст) И Не ЗначениеЗаполнено(Объект.Контакт) Тогда
Элементы.ГруппаСвязанныеДокументы.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Если требуется показать панель именно в момент интерактивного выбора контакта пользователем, включаем у поля ввода свойство КнопкаВыбора или КнопкаСпискаВыбора. В обработчике события НачалоВыбора можно переопределить стандартное поведение и показать собственную панель на форме:
&НаКлиенте
Процедура КонтактEmailНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартное диалоговое окно выбора
СтандартнаяОбработка = Ложь;
// Включаем видимость вспомогательной таблицы документов на форме
Элементы.ГруппаСвязанныеДокументы.Видимость = Истина;
// Переводим фокус на таблицу для удобства пользователя
ТекущийЭлемент = Элементы.ТаблицаСвязанныеДокументы;
КонецПроцедуры
В исключительных случаях, когда необходимо строго отслеживать факт нахождения курсора в определенном поле до ввода текста, применяем периодический опрос свойства формы ТекущийЭлемент с помощью обработчика ожидания.
Разберем по шагам, как подключить такую проверку:
ПодключитьОбработчикОжидания с минимальным интервалом.ТекущийЭлемент целевому полю, и управляем свойством Видимость.ОтключитьОбработчикОжидания.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ПроверитьФокусПоля", 0.2);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьФокусПоля()
НаходитсяВПоле = (ТекущийЭлемент = Элементы.КонтактEmail);
Если Элементы.ГруппаСвязанныеДокументы.Видимость <> НаходитсяВПоле Тогда
Элементы.ГруппаСвязанныеДокументы.Видимость = НаходитсяВПоле;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
ОтключитьОбработчикОжидания("ПроверитьФокусПоля");
КонецПроцедуры
Чтобы не перегружать интерфейс сложной логикой переключения видимости, рекомендуется использовать стандартные механизмы платформы 1С:
Свертываемая, предоставив пользователю возможность самостоятельно открывать панель кликом по заголовку.ОткрытьФорму.