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