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

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

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

Причина 1. Программная очистка коллекции условного оформления в коде

Самая распространенная и коварная причина — наличие в модуле формы или общих модулях типового кода, который сбрасывает настройки. Часто при открытии формы в процедурах ПриСозданииНаСервере или ПриОткрытии разработчики или типовые библиотеки БСП инициализируют оформление динамически. В начале таких процедур нередко вызывается метод очистки:


// Сброс условного оформления самой формы
УсловноеОформление.Элементы.Очистить();

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

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


// Очистка условного оформления динамического списка
СписокУсловноеОформление = Список.КомпоновщикНастроек.Настройки.УсловноеОформление;
СписокУсловноеОформление.Элементы.Очистить();

// Очистка условного оформления формы
УсловноеОформление.Элементы.Очистить();

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

Причина 2. Перезапись пользовательскими настройками формы

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

Для гарантированного применения программного оформления динамического списка используйте следующие подходы:

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

Причина 3. Путаница между оформлением формы и динамического списка

Условное оформление формы и условное оформление динамического списка — это два независимых механизма со своими правилами адресации полей:

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

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

Причина 4. Некорректные условия отбора и значения NULL

Если правила оформления не удаляются кодом, но подсветка строк не срабатывает, проанализируйте значения данных в выборке:

  1. Значения NULL при соединениях: если в запросе динамического списка используется левое соединение, ненайденные значения реквизитов принимают тип NULL. Стандартные проверки условия СКД вроде «Равно ПустаяСсылка» или «Не заполнено» для значений NULL могут вести себя некорректно. Оборачивайте поля в запросе с помощью функции ЕСТЬNULL(Поле, &ЗначениеПоУмолчанию).
  2. Флаг обязательного использования: если поле отбора участвует в условном оформлении списка, но не выведено в виде отдельной колонки на форму, платформа может не выбирать его из базы данных. Убедитесь, что для данного поля в настройках динамического списка установлен флаг «Использовать всегда».

Причина 5. Неподдерживаемые свойства оформления строк

Платформа накладывает архитектурные ограничения на параметры оформления отдельных ячеек в динамических списках:

  1. Видимость: свойство «Видимость» в условном оформлении не поддерживается платформой для отдельных ячеек строки. Нельзя скрыть ячейку только в одной строке списка — видимость применяется исключительно ко всей колонке целиком.
  2. Доступность и ТолькоПросмотр: установка свойства «Доступность» для строк динамического списка часто игнорируется платформой. Для блокировки редактирования значений в строках таблицы управляемой формы используйте параметр «ТолькоПросмотр».

Алгоритм локализации проблемы

Если условное оформление не работает, выполним быструю пошаговую диагностику:

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