Как правильно изменять доступность поля при открытии управляемой формы?

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

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

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

Разберем ситуацию, когда нам нужно установить доступность поля один раз при инициализации формы. Использование клиентского события ПриОткрытии может привести к эффекту «мигания» интерфейса: пользователь сначала увидит форму в стандартном состоянии, и только через мгновение код заблокирует поле. Чтобы этого избежать, проанализируем выполнение кода на сервере.

Рассмотрим пример кода в модуле формы:


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

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

Способ 2. Оптимизация через «ПредопределенноеЗначение» на клиенте

Если логика требует изменения доступности не только при открытии, но и динамически (например, при смене статуса пользователем в самой форме), нам нужно реализовать это на стороне клиента. Чтобы лишний раз не обращаться к серверу для получения значения перечисления, используем функцию ПредопределенноеЗначение.

Выясним, как это выглядит в коде:


&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
    ПриСменеСтатуса();
КонецПроцедуры

&НаКлиенте
Процедура ПриСменеСтатуса()
    // Сравниваем статус напрямую на клиенте без вызова сервера
    НужныйСтатус = ПредопределенноеЗначение("Перечисление.СтатусЗадачи.Завершена");
    Элементы.Оплачено.Доступность = (Объект.Статус = НужныйСтатус);        
КонецПроцедуры

Этот метод считается профессиональным, так как он минимизирует количество серверных вызовов, что критично для работы в веб-клиенте или при медленном соединении.

Способ 3. Внеконтекстные серверные функции

Иногда логика проверки статуса может быть сложной (например, проверка прав или дополнительных условий в базе данных). В этом случае рекомендуется использовать функции с директивой &НаСервереБезКонтекста. Посмотрим на пример реализации:


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

&НаСервереБезКонтекста
Функция ПроверитьСтатусЗавершения(ТекущийСтатус)
    // Внеконтекстный вызов работает быстрее, так как не передает данные всей формы
    Возврат ТекущийСтатус = Перечисления.СтатусЗадачи.Завершена;
КонецФункции

Обратите внимание на нейминг: функции лучше давать смысловое название, отвечающее на вопрос «что она делает», например, СтатусЗавершен или ПроверитьСтатусЗавершения.

Способ 4. Условное оформление (самый оптимальный метод)

Проанализируем наиболее современный подход, который вообще не требует написания кода в процедурах открытия. Это Условное оформление формы. Оно работает на уровне платформы и автоматически обновляет интерфейс при изменении данных.

  1. Перейдем на вкладку «Условное оформление» в свойствах формы.
  2. Добавим новое правило: в условии укажем Объект.Статус Равно Значение(Перечисление.СтатусЗадачи.Завершена).
  3. В оформлении установим свойство Доступность (или Только просмотр) для нужного поля.

Важный нюанс: С точки зрения UX (пользовательского опыта) часто лучше использовать свойство ТолькоПросмотр (ReadOnly). В отличие от Доступность, это свойство оставляет текст в поле читаемым и доступным для выделения или копирования, но запрещает его редактирование.

Рекомендации по групповому управлению

Если от одного условия зависит доступность сразу десяти полей, не стоит прописывать каждое поле в коде. Объединим эти элементы в одну Группу формы и будем управлять доступностью всей группы сразу:

Элементы.ГруппаФинансовыеДанные.Доступность = УсловиеВыполнено;

Это делает код чище и упрощает дальнейшую поддержку конфигурации.

← На главную