Как выделить цветом строки в форме списка в управляемом приложении 1С?

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

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

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

Анализ типичной ошибки: почему окрашивается весь список целиком?

Рассмотрим пример кода, в котором выполняется попытка раскрасить строки списка договоров:


&НаСервере
Процедура ПроверитьСрокиОкончанияНаСервере()
    ТекДата = ТекущаяДата();
    Выборка = Справочники.Договоры.Выбрать();
    Пока Выборка.Следующий() Цикл
        Если Выборка.ДатаОкончания - ТекДата <= 5184000 И Выборка.ДатаОкончания >= ТекДата Тогда
            Элементы.СписокДоговоров.ТекущийЭлемент.ЦветФона = WebЦвета.Красный;
            Сообщить("Договор № " + Выборка.Наименование + " заканчивается " + Формат(Выборка.ДатаОкончания, "ДЛФ=ДД"));
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Проанализируем, почему этот алгоритм работает некорректно:

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

Для решения задач динамического оформления строк в управляемом приложении используется штатный механизм платформы — Условное оформление.

Способ 1. Программная настройка условного оформления формы

Рассмотрим, как настроить условное оформление формы программно в процедуре-обработчике ПриСозданииНаСервере. Мы создадим правило, которое будет сравнивать дату окончания договора с текущей датой сеанса.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

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

    // Если список оформляемых полей пуст, выделяется вся строка целиком.
    // Если нужно выделить только поле "ДатаОкончания", раскомментируйте код ниже:
    // ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    // ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ДатаОкончания");

КонецПроцедуры

Обратите внимание на важный нюанс: если в коллекцию Поля элемента оформления не добавлять конкретные поля, то платформа применит цвет ко всей строке целиком.

Способ 2. Вычисление условия в запросе динамического списка

Если условие раскраски содержит сложную логику (например, попадание даты в интервал «договор истекает в течение ближайших 60 дней»), удобнее всего рассчитать признак непосредственно в тексте запроса динамического списка.

Разберем по шагам, как это реализовать:

  1. Откроем форму списка и перейдем к свойствам реквизита Список (тип ДинамическийСписок).
  2. Включим флаг Произвольный запрос и добавим в текст запроса вычисляемое булево поле с помощью конструкции ВЫБОР:

ВЫБРАТЬ
    СправочникДоговоры.Ссылка КАК Ссылка,
    СправочникДоговоры.Наименование КАК Наименование,
    СправочникДоговоры.ДатаОкончания КАК ДатаОкончания,
    ВЫБОР
        КОГДА ДОБАВИТЬКДАТЕ(СправочникДоговоры.ДатаОкончания, ДЕНЬ, -60) <= &ТекДата
            И СправочникДоговоры.ДатаОкончания >= &ТекДата
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК ДоговорЗаканчивается
ИЗ
    Справочник.Договоры КАК СправочникДоговоры
  1. В модуле формы в событии ПриСозданииНаСервере установим значение параметра &ТекДата:

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

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

Способ 3. Интерактивная настройка пользователем в режиме «1С:Предприятие»

Если нет необходимости вносить изменения в конфигурацию, любой пользователь может настроить выделение строк самостоятельно прямо в режиме «1С:Предприятие»:

  1. Откройте форму списка справочника или документов.
  2. Нажмите кнопку Еще в командной панели таблицы и выберите пункт Настроить список...
  3. Перейдите на закладку Условное оформление и добавьте новый элемент.
  4. На закладке Оформление укажите цвет фона или текста.
  5. На закладке Условие задайте отбор (например, Дата окончания Меньше или равно [Текущая дата]).
  6. На закладке Оформляемые поля укажите конкретные колонки или оставьте список пустым для раскрашивания всей строки.

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

← На главную