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