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