Почему не работает конструктор условного оформления в расширении 1С и как это программно исправить?

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

Многие разработчики при адаптации типовых конфигураций (таких как УТ, КА или ERP) сталкиваются с неприятной ситуацией: визуально настроенное условное оформление формы через конструктор в расширении попросту не работает. На первый взгляд кажется, что платформа 1С некорректно обрабатывает настройки, добавленные в расширение. Давайте вместе разберем эту ситуацию, выясним истинную причину такого поведения и рассмотрим надежные способы программной настройки визуального поведения элементов формы.

Проанализируем причину: почему визуальное оформление "затирается"

На уровне самой платформы 1С:Предприятие визуально заданное условное оформление в расширениях поддерживается и отрабатывает корректно. Механизм успешно объединяет настройки основной формы и формы, заимствованной в расширение. Однако проблема кроется не в платформе, а в логике прикладного кода библиотек (в частности, БСП), на которых построены современные конфигурации.

Согласно внутренним стандартам разработки сложных форм, настройка условного оформления часто выполняется программно. Для этого в модуле формы обычно существует метод УстановитьУсловноеОформление или его аналоги. Посмотрим на типовое поведение: первой же строкой в таких процедурах, как правило, идет жесткая команда очистки УсловноеОформление.Элементы.Очистить().

Именно эта команда и является виновником того, что всё условное оформление, которое мы так старательно настраивали мышкой в конфигураторе, безвозвратно удаляется сервером при открытии формы. Таким образом, визуальный конструктор становится практически бесполезным для форм, где работает подобная переопределяющая логика.

Рассмотрим решение: программное добавление условного оформления в расширении

Раз визуальные настройки стираются, мы должны добавить свои правила программным путем. Сделаем это через расширение серверных методов. Нам нужно перехватить управление строго после того, как типовой код очистит элементы и применит свои базовые настройки.

Разберем по шагам пример кода, который необходимо поместить в расширение формы:


&НаСервере
&После("УстановитьУсловноеОформление")
Процедура МК_УстановитьУсловноеОформление()
    
    // Создаем новый элемент условного оформления
    ЭлементУО = УсловноеОформление.Элементы.Добавить();
    
    // 1. Указываем оформляемое поле (где будет меняться визуал)
    ПолеЭлемента = ЭлементУО.Поля.Элементы.Добавить();
    ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МК_ТекстОригиналПолучен.Имя);
    
    // 2. Задаем условие отбора (когда менять визуал)
    ОтборЭлемента = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МК_ОригиналПолучен");
    ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборЭлемента.ПравоеЗначение = Ложь;
    
    // 3. Устанавливаем само оформление (какой цвет, шрифт и т.д.)
    ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста);
    
КонецПроцедуры

В этом примере мы используем аннотацию &После для процедуры УстановитьУсловноеОформление. Если в форме нет такой выделенной процедуры, можно привязаться к ПриСозданииНаСервере.

Проанализируем еще один пример оформления, где мы меняем цвет текста декорации в зависимости от значения реквизита:


&НаСервере
&После("ПриСозданииНаСервере")
Процедура МК_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    Элемент = УсловноеОформление.Элементы.Добавить();
    
    ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
    ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Декорация1.Имя);
    
    ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Реквизит1");
    ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборЭлемента.ПравоеЗначение = Истина;
    
    Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветВажного);
    
КонецПроцедуры

Ограничения платформы: как обойти проблему с текстом флажка

В процессе работы с условным оформлением мы можем столкнуться с ограничениями платформы 1С. Например, выясним причину, почему через условное оформление не меняется текст элемента управления типа "Поле флажка".

Дело в том, что это задокументированное ограничение платформы. Условным оформлением формы можно с легкостью менять такие параметры как:

  1. Цвет текста и фона
  2. Шрифт
  3. Доступность (свойство Доступность)
  4. Видимость (свойство Видимость)
  5. Текст для обычных полей ввода или декораций

Однако подмена текста (заголовка) интерактивного флажка не поддерживается. Если есть задача динамически менять текст рядом с галочкой, применим каноничный обходной путь:

  1. Скроем стандартный заголовок у самого реквизита флажка (установим свойство ПоложениеЗаголовка в значение Нет).
  2. Рядом на форме разместим элемент типа ДекорацияНадпись.
  3. Настроим условное оформление именно на эту декорацию, чтобы она меняла свой текст и цвет в зависимости от значения (Истина/Ложь) нашего флажка-реквизита. Визуально для пользователя это будет неотличимо от обычного поля флажка.

Особенности работы с динамическими списками

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

Обращаться нужно напрямую к свойству УсловноеОформление элемента динамического списка или через его компоновщик настроек (КомпоновщикНастроек.Настройки.УсловноеОформление). Такой подход работает значительно быстрее и не перегружает саму форму при частых обновлениях.

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

Производительность и перерисовка "на лету"

Разберем еще одно важное правило хорошего тона при работе с UI в 1С. Крайне не рекомендуется переписывать программный код условного оформления "на лету" (например, привязывать удаление и добавление элементов оформления к событиям изменения реквизитов).

Все правила (как типовые, так и добавленные через ваше расширение) должны формироваться строго один раз — в момент вызова серверного обработчика при открытии или создании формы. Если вам нужно, чтобы интерфейс реагировал на действия пользователя (как переключение флажка), платформа сделает всё сама: она автоматически и мгновенно перерисует форму, как только изменится значение реквизита, привязанного к ЛевоеЗначение в вашем отборе. Главное — правильно сформировать структуру отбора при инициализации.

← На главную