Почему не работает условное оформление в Бухгалтерии 3.0 и как это исправить программно?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

Часто при разработке в среде 1С:Предприятие 8.3 программисты сталкиваются с ситуацией: в конфигураторе во вкладке «Условное оформление» формы настроены правила (например, выделение цветом фона ячейки при выполнении условия), но в режиме «1С:Предприятие» эти настройки попросту не применяются. Особенно остро эта проблема проявляется в современных типовых решениях, таких как 1С:Бухгалтерия предприятия 3.0, УТ 11 или ERP.

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

Выясняем причину: почему пропадают настройки из конфигуратора?

Проанализируем поведение системы. В типовых конфигурациях, построенных на базе БСП (Библиотеки стандартных подсистем), управление внешним видом форм часто берет на себя программный код. Рассмотрим стандартный сценарий: при открытии формы документа (например, «Счет на оплату покупателю») вызывается процедура ПриСозданииНаСервере. Внутри этой процедуры или в связанных с ней общих модулях часто встречается код следующего вида:

УсловноеОформление.Элементы.Очистить();

Эта команда полностью удаляет все правила, которые вы так бережно настраивали в конфигураторе. Программа делает это для того, чтобы затем динамически сформировать правила оформления на основе функциональных опций, прав пользователя или текущих настроек конкретной организации. Например, система может программно подсвечивать отрицательные остатки или выделять цветом строки со специфическими статусами.

Чтобы убедиться, что проблема именно в этом, достаточно воспользоваться отладчиком. Установите точку останова в конце процедуры ПриСозданииНаСервере и проверьте количество элементов в коллекции УсловноеОформление.Элементы. Если ваша настройка там отсутствует, значит, она была удалена типовым механизмом.

Универсальное решение: программное добавление оформления

Разберем, как правильно добавить условное оформление программно, чтобы оно не конфликтовало с типовым кодом. Оптимальным вариантом будет создание отдельной процедуры, которую мы вызовем в самом конце процесса инициализации формы.

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

Шаг 1. Создание процедуры оформления

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


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

Шаг 2. Вызов процедуры в расширении

Поскольку мы работаем с типовой конфигурацией «Бухгалтерия 3.0», крайне не рекомендуется снимать форму с поддержки. Лучше всего использовать механизм расширений. Добавим обработчик ПриСозданииНаСервере с типом вызова &После.


&После("ПриСозданииНаСервере")
Процедура мПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    // Вызываем нашу процедуру после того, как типовые механизмы закончили очистку
    мУстановитьУсловноеОформление();
КонецПроцедуры

Тонкости и нюансы использования Полей Компоновки Данных

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

  1. ЛевоеЗначение отбора: Здесь мы всегда указываем путь к данным. Например, если данные хранятся в табличной части, пишем Объект.Товары.ИмяРеквизита.
  2. Поле оформления: Здесь мы указываем имя элемента на форме. В конфигураторе на форме колонка может называться ТоварыЦена, хотя путь к её данным — Объект.Товары.Цена. Если вы ошибетесь и укажете путь к данным в оформляемых полях, система не поймет, какую именно визуальную ячейку красить, и оформление не сработает.

Работа с несколькими вкладками

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


// Добавляем первое поле (основная вкладка)
Поле1 = ЭлементОформления.Поля.Элементы.Добавить();
Поле1.Поле = Новый ПолеКомпоновкиДанных("ТоварыРеквизитНаОсновнойВкладке");

// Добавляем второе поле (дополнительная вкладка)
Поле2 = ЭлементОформления.Поля.Элементы.Добавить();
Поле2.Поле = Новый ПолеКомпоновкиДанных("ТоварыРеквизитНаДопВкладке");

В этом случае правило оформления будет применено к обоим визуальным элементам одновременно.

Сложные условия и группировка

Иногда требуется настроить оформление по нескольким условиям сразу (например, «ИЛИ»). Посмотрим на пример реализации сложной логики:


ГруппаОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

// Условие 1: Значение больше 100
Элемент1 = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Элемент1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество");
Элемент1.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
Элемент1.ПравоеЗначение = 100;

// Условие 2: Специфический статус
Элемент2 = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Элемент2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Статус");
Элемент2.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Элемент2.ПравоеЗначение = ПредопределенноеЗначение("Перечисление.Статусы.Важное");

Использование объекта ГруппаЭлементовОтбораКомпоновкиДанных позволяет создавать гибкие правила любой вложенности.

Заключение

Мы выяснили, что основная причина нерабочего условного оформления в Бухгалтерии 3.0 — это программная очистка коллекции элементов оформления типовым кодом БСП. Чтобы решить эту проблему, следует внедрять правила оформления программно через расширение, используя процедуру ПриСозданииНаСервере.

Помните ключевые моменты:

Такой подход делает ваш код надежным и устойчивым к обновлениям типовой конфигурации.

← На главную