Как программно задать цвет конкретной колонки в динамическом списке 1С 8.3

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

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

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

Выясняем причину: почему красится вся строка?

Давайте проанализируем типичный код, который часто пишут разработчики при попытке настроить оформление программно:


ЭлементУсловногоОформления = Форма.Список.УсловноеОформление.Элементы.Добавить();

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

ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Льняной);

Этот код успешно отрабатывает, но имеет побочный эффект: он закрашивает всю строку целиком. Почему так происходит?

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

Разница между условным оформлением формы и динамического списка

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

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

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

Вариант 1. Настройка оформления на "чистом" коде платформы

Рассмотрим по шагам решение задачи без использования сторонних библиотек. Нам нужно настроить оформление для колонки СтатусПКО в динамическом списке Список при значении статуса «Ждем».

Пропишем следующий код в процедуре ПриСозданииНаСервере модуля управляемой формы:


// 1. Добавляем новый элемент условного оформления непосредственно в динамический список
ЭлементУО = Список.УсловноеОформление.Элементы.Добавить();
ЭлементУО.Использование = Истина;

// 2. Указываем конкретную колонку, которую мы хотим оформить (БЕЗ префикса "Список")
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("СтатусПКО");
ОформляемоеПоле.Использование = Истина;

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

// 4. Устанавливаем параметры оформления (например, цвет текста)
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПросроченныеДанныеЦвет);

Благодаря добавлению поля в коллекцию ЭлементУО.Поля, система окрасит только ячейку в колонке СтатусПКО, оставив остальные ячейки строки с дефолтным оформлением.

Вариант 2. Решение с использованием Библиотеки Стандартных Подсистем (БСП)

Если вы работаете в типовой конфигурации 1С (например, «Бухгалтерия предприятия 3.0», «ERP Управление предприятием», «Управление торговлей 11» и др.), писать громоздкий код инициализации объектов компоновки данных вручную не обязательно. В составе БСП есть удобные общие модули, упрощающие этот процесс.

Для программной настройки условного оформления списка через БСП используем следующий шаблон:


// Добавляем элемент условного оформления в список
ЭлементУО = Список.УсловноеОформление.Элементы.Добавить();
ЭлементУО.Использование = Истина;

// С помощью функций БСП добавляем конкретное оформляемое поле (без префиксов)
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "СтатусПКО");

// С помощью БСП добавляем элемент отбора
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ЭлементУО.Отбор, 
    "СтатусПКО", 
    ВидСравненияКомпоновкиДанных.Равно, 
    Перечисления.К_СтатусПКО.Ждем);

// Задаем параметры оформления
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПросроченныеДанныеЦвет);

Этот способ значительно сокращает объем кода, делает его более читаемым и снижает вероятность совершения синтаксических ошибок.

Важнейший подводный камень: свойство «Использовать всегда»

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

Платформа 1С оптимизирует SQL-запросы к базе данных динамического списка. Если колонка (в нашем примере — СтатусПКО) по какой-то причине скрыта пользователем на форме (через меню «Еще — Изменить форму») или её видимость отключена программно, платформа полностью исключает это поле из выборки запроса. Так как данных по этому полю в таблице на клиенте нет, условие отбора условного оформления физически не может выполниться, и раскраска «тихо» ломается.

Чтобы гарантировать стабильную работу условного оформления вне зависимости от видимости колонки на форме, обязательно используйте метод УстановитьОбязательноеИспользование в процедуре ПриСозданииНаСервере:

Список.УстановитьОбязательноеИспользование("СтатусПКО", Истина);

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

← На главную