Как сделать поле ввода недоступным до тех пор, пока не заполнено другое поле в 1С?

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

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

Реализация через обработчик «ПриИзменении»

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

Для начала разберем наиболее лаконичный вариант, который работает исключительно на стороне клиента, так как свойство Доступность элементов формы является свойством интерфейса:


&НаКлиенте
Процедура Спр1ПриИзменении(Элемент)
    Элементы.Спр2.Доступность = ЗначениеЗаполнено(Объект.Спр1);
КонецПроцедуры

В этом примере мы используем функцию ЗначениеЗаполнено(), которая возвращает Истина, если поле Спр1 заполнено, и Ложь в противном случае. Результат присваивается свойству Доступность элемента Спр2.

Инициализация формы при создании

Чтобы поле Спр2 было недоступным сразу при открытии формы (если элемент новый или создается копированием), нам необходимо вызвать нашу процедуру проверки при создании формы на сервере. Для этого используем стандартный обработчик ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    УстановитьДоступностьПолей();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьПолей()
    Элементы.Спр2.Доступность = ЗначениеЗаполнено(Объект.Спр1);
КонецПроцедуры

Оптимизация: использование общей процедуры

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


&НаКлиенте
Процедура УстановитьДоступностьПолей()
    Элементы.Спр2.Доступность = ЗначениеЗаполнено(Объект.Спр1);
    // Здесь можно добавить проверку других полей
КонецПроцедуры

Эту процедуру мы вызываем в:

  1. Обработчике ПриСозданииНаСервере (через клиентский вызов или напрямую, если процедура чисто серверная).
  2. Обработчике Спр1ПриИзменении.

Важные замечания по архитектуре

При работе с директивами компиляции важно помнить следующее:

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

← На главную