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