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

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

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

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

Разберем основную причину: несоответствие типов данных

Проанализируем ситуацию, описанную в первом сообщении темы. Автор пытается использовать вид сравнения ВидСравненияКомпоновкиДанных.ВСписке и передает в качестве правого значения Массив. Это одна из самых коварных ловушек платформы 1С.

Механизм условного оформления формы базируется на системе компоновки данных (СКД). Для СКД при использовании оператора «В списке» принципиально важно, чтобы передаваемый объект был именно типа СписокЗначений. Если вы передаете обычный Массив, платформа часто не выдает ошибку исполнения, но условие всегда возвращает Ложь, так как механизм сравнения не может корректно обработать коллекцию элементов массива.

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


// Неправильно:
// ОтборЭлемента.ПравоеЗначение = МассивТоварыУсловияВхождения; 

// Правильно:
СписокДляОформления = Новый СписокЗначений;
СписокДляОформления.ЗагрузитьЗначения(МассивТоварыУсловияВхождения);
ОтборЭлемента.ПравоеЗначение = СписокДляОформления;

Правильное указание полей: Имя vs Путь к данным

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

ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.КорзинаНоменклатура.Имя);

В объекте УсловноеОформление мы работаем не с визуальными элементами (кнопками или полями), а с данными. Поэтому в конструктор ПолеКомпоновкиДанных необходимо передавать именно ПутьКДанным. Например, если колонка называется КорзинаНоменклатура, но она отображает реквизит Объект.Корзина.Номенклатура, то именно этот путь и нужно указывать.

Важный нюанс для табличных частей: если оформление настраивается для конкретной таблицы, то в отборах и оформляемых полях часто нужно указывать путь без префикса таблицы. То есть вместо Объект.Корзина.Номенклатура следует использовать просто Номенклатура. Это связано с тем, что условное оформление применяется к каждой строке коллекции в контексте этой строки.

Конфликты с типовыми механизмами (на примере УТ 11.4)

Если вы работаете в типовой конфигурации, такой как УТ 11.4 или ERP 2.5, ваше программное оформление может «исчезать» из-за работы стандартных процедур. В модулях форм многих типовых объектов существует процедура УстановитьУсловноеОформление.

Проанализируем логику работы формы:

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

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

Универсальный инструмент для добавления условного оформления

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


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

Чек-лист для проверки неработающего оформления

Если после написания кода оформление все равно не применяется, пройдемся по следующим пунктам:

  1. Свойство «Использование»: Проверьте, что у созданного элемента ЭлементУО.Использование = Истина;. По умолчанию при программном добавлении оно может быть в значении Ложь.
  2. Видимость полей: Поля, используемые в отборе (ЛевоеЗначение), должны присутствовать в данных формы. Если вы пытаетесь сделать отбор по реквизиту, который не выведен в таблицу и не является частью данных, оформление может не сработать.
  3. Приоритет: Новые элементы добавляются в конец коллекции. Если выше по списку есть другое правило, которое перекрывает ваше (например, окрашивает ту же ячейку в другой цвет), то применится последнее. Используйте метод Вставить(0) вместо Добавить(), чтобы ваше правило стало приоритетным.
  4. Обновление отображения: В редких случаях, когда данные меняются динамически без стандартного серверного вызова, может потребоваться вызов метода ЭтаФорма.ОбновитьОтображениеДанных().
  5. Вид сравнения: Если вы используете «В иерархии», убедитесь, что в правом значении переданы ссылки на группы, а не просто строки.

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

← На главную