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