Как реализовать условное оформление в 1С 8.3 на основе реквизитов ссылочных полей

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

В разработке на управляемых формах 1С программисты часто сталкиваются с задачей визуального выделения строк в табличных частях документов. Типичный пример: нужно раскрасить строки номенклатуры в зависимости от её производителя, категории или другого свойства, которое хранится в справочнике. Однако стандартный механизм условного оформления управляемой формы имеет существенное ограничение — в нем невозможно выбрать поле «через точку» от ссылочного реквизита (например, Номенклатура.Производитель).

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

Почему нельзя просто выбрать реквизит через точку

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

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

Важное примечание: Это ограничение касается только табличных частей (объектов). В Динамических списках мы можем использовать любые связанные поля, так как там данные выбираются запросом на сервере.

Решение 1: Добавление служебного реквизита в таблицу

Самый надежный и распространенный способ — это создание вспомогательного (служебного) реквизита непосредственно в самой таблице. Разберем этот процесс по шагам.

  1. Создание реквизита: В дереве метаданных документа (или непосредственно в реквизитах формы, если таблица не сохраняется в БД) добавьте в табличную часть новый реквизит. Например, ПроизводительДляОформления с типом СправочникСсылка.Производители.
  2. Размещение на форме: Перетащите этот реквизит в элементы формы (в таблицу). Если пользователю не нужно видеть это поле, установите свойство Видимость в значение Ложь. Важно: для работы условного оформления поле должно присутствовать в элементах формы, даже если оно скрыто.
  3. Настройка Условного оформления: Теперь в настройках УО формы вы сможете выбрать поле Объект.Товары.ПроизводительДляОформления в качестве условия.

Решение 2: Автоматизация заполнения данных

Чтобы избежать риска «рассинхронизации» данных, когда номенклатура изменилась, а производитель в служебном поле остался старым, необходимо правильно обработать событие изменения. Рассмотрим пример кода для события ПриИзменении колонки номенклатуры:


&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    Если ТекущаяСтрока <> Неопределено Тогда
        // Получаем данные производителя с сервера
        ТекущаяСтрока.ПроизводительДляОформления = ПолучитьПроизводителяСервер(ТекущаяСтрока.Номенклатура);
    КонецЕсли;
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьПроизводителяСервер(Знач НоменклатураСсылка)
    Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НоменклатураСсылка, "Производитель");
КонецФункции

Проанализируем этот код: мы используем легкий серверный вызов &НаСервереБезКонтекста, чтобы получить только одно нужное значение. Это минимизирует объем передаваемых данных между клиентом и сервером.

Решение 3: Программное создание правил оформления

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

Рассмотрим пример, как программно раскрасить строки:


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

Советы по UI/UX: Как не «ослепить» пользователя

Выясним причину, почему яркие цвета в интерфейсе — это не всегда хорошо. Разные матрицы мониторов передают цвета по-разному. То, что на вашем мониторе выглядит как «приятный пастельный», у бухгалтера на старом мониторе может превратиться в «ядовито-зеленый», на котором не видно черного текста.

Рекомендуемые практики:

Подведем итоги

Мы выяснили, что для реализации условного оформления по реквизитам связанных объектов в 1С 8.3 необходимо выполнить три ключевых действия:

  1. Создать служебный реквизит в структуре данных таблицы.
  2. Обеспечить его актуальность через обработчики событий (ПриИзменении, ПриЧтенииНаСервере).
  3. Настроить правила Условного оформления, ссылаясь на этот вспомогательный реквизит.

Такой подход гарантирует стабильную работу интерфейса, отсутствие лишних задержек при прокрутке списка и корректное отображение данных у всех пользователей системы.

← На главную