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

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

В процессе разработки интерфейсов в системе «1С:Предприятие» перед программистом часто возникает задача визуального выделения данных. Яркий пример — подсветка ячеек табличной части при выполнении определенных условий (например, выделение просроченных дат красным цветом, больших сумм — зеленым, или нулевых остатков — серым). Это помогает пользователям мгновенно ориентироваться в массивах информации и минимизирует количество ошибок при вводе данных.

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

---

Часть 1. Обычные формы: выбор оптимального события и реализация

Для начала разберем особенности работы с обычными формами. В табличном поле обычных форм для оформления строк и ячеек традиционно используются два основных события: ПриВыводеСтроки и ПриПолученииДанных. Давайте проанализируем их принципиальные различия, чтобы понять, какой инструмент использовать правильнее и эффективнее.

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

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

  1. Собрать все ссылки на объекты из видимых строк в один массив.
  2. Выполнить всего один пакетный запрос к базе данных по этому массиву.
  3. В быстром цикле сопоставить результаты запроса с оформлением строк и раскрасить нужные ячейки.

Именно поэтому для раскраски ячеек мы настоятельно рекомендуем использовать событие ПриПолученииДанных. Рассмотрим детальный пример его реализации в коде.

Представим, что у нас есть табличная часть «Товары», и нам нужно подсветить светло-зеленым фоном ячейку «Сумма», если значение в ней превышает 100 000 рублей. Создадим обработчик события для нашего табличного поля:


Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
    
    // Проходим циклом по всем строкам, которые система подготовила к выводу на экран
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        
        // Получаем данные текущей строки табличной части
        ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
        
        // Обязательно проверяем, что данные строки существуют (строка не пустая)
        Если ДанныеСтроки <> Неопределено Тогда
            
            // Проверяем наше условие по сумме
            Если ДанныеСтроки.Сумма > 100000 Тогда
                // Подсвечиваем фоном конкретную ячейку "Сумма"
                ОформлениеСтроки.Ячейки.Сумма.ЦветФона = WebЦвета.СветлоЗеленый;
            Иначе
                // Сбрасываем цвет на автоматический/дефолтный
                ОформлениеСтроки.Ячейки.Сумма.ЦветФона = Новый Цвет(); // или WebЦвета.Белый
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Обратите внимание на крайне важную деталь в коде — ветку Иначе. Если вы задаете цвет ячейки по условию, вы обязательно должны предусмотреть сброс этого цвета, если условие перестает выполняться. Если этого не сделать, то при изменении пользователем суммы на меньшую или при быстром скроллинге таблицы старый цвет «залипнет» на ячейке, искажая данные на экране.

---

Часть 2. Как мгновенно обновить цвет при изменении данных

Часто программисты сталкиваются со следующей проблемой: пользователь прямо на форме редактирует число в ячейке, сумма становится больше 100 000, но ячейка не красится мгновенно. Цвет меняется только после того, как строка скрывается из виду и снова появляется на экране.

Дело в том, что напрямую из обработчика события изменения реквизита (например, ПриИзменении для поля «Сумма») мы не имеем доступа к объекту оформления строки. Чтобы принудительно заставить платформу перерисовать таблицу и вызвать наше событие ПриПолученииДанных, мы должны использовать метод обновления строк.

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


Процедура ТоварыСуммаПриИзменении(Элемент)
    
    // Заставляем табличное поле перерисовать активные строки
    ЭлементыФормы.Товары.ОбновитьСтроки();
    
КонецПроцедуры

Метод ОбновитьСтроки() мгновенно инициирует событие ПриПолученииДанных для текущих видимых строк, и цвет вашей ячейки обновится «на лету» прямо во время работы пользователя.

---

Часть 3. Способы задания цвета в платформе 1С

Для заполнения свойства ЦветФона в системе 1С существует несколько удобных подходов. Мы можем использовать предопределенные системные палитры или задавать цвет вручную:

  1. Web-цвета (предопределенная кроссплатформенная палитра): Это самый простой способ получить красивый и стандартный оттенок без необходимости подбирать RGB-коды. Доступ к ним осуществляется через глобальный контекст WebЦвета. Например: ОформлениеСтроки.Ячейки.Сумма.ЦветФона = WebЦвета.СветлоЖелтый;
  2. Абсолютные цвета (RGB): Если корпоративный стиль или дизайн-макет требуют точного соблюдения цветовой гаммы, вы можете задать цвет с помощью трех составляющих (Красный, Зеленый, Синий) в диапазоне от 0 до 255: ОформлениеСтроки.Ячейки.Сумма.ЦветФона = Новый Цвет(255, 230, 230); (нежно-красный оттенок).
  3. Цвета стиля: Это системные цвета, зашитые в метаданных вашей конфигурации. Преимущество их использования заключается в том, что если пользователь изменит общую тему оформления операционной системы или 1С, цвета стиля автоматически подстроятся под новые параметры. Пример использования: ОформлениеСтроки.Ячейки.Сумма.ЦветФона = ЦветаСтиля.ЦветФонаВыделения;

---

Часть 4. Управляемые формы: современный подход без кода и с кодом

В управляемом приложении (платформа 1С 8.3) концепция работы с интерфейсом кардинально поменялась. Событий ПриПолученииДанных и ПриВыводеСтроки для табличных частей здесь больше нет. Платформа полностью взяла на себя отрисовку интерфейса на клиенте на основе декларативных правил. Для настройки раскраски используется мощный механизм — Условное оформление.

Разберем два способа настройки условного оформления в управляемых формах: интерактивный (в конфигураторе) и программный.

Способ А. Интерактивная настройка (без единой строчки кода)

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

  1. Откройте форму нужного документа или справочника в конфигураторе.
  2. В окне свойств формы (в правом нижнем углу) перейдите на вкладку «Условное оформление» и нажмите кнопку открыть (лупа или три точки).
  3. В открывшемся окне нажмите кнопку «Добавить».
  4. В поле «Оформление» выберите свойство «Цвет фона» и укажите нужный цвет (например, зеленый).
  5. В поле «Условие» настройте отбор. Нажмите «Добавить», выберите левое значение Объект.Товары.Сумма, вид сравнения — «Больше», правое значение — 100 000.
  6. В поле «Оформляемые поля» добавьте поле вашей колонки (например, ТоварыСумма). Это критически важно! Если оставить это поле пустым, платформа раскрасит всю строку целиком, а нам требуется выделить только конкретную ячейку.

Способ Б. Программная настройка (в модуле управляемой формы)

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

Рассмотрим пример создания программного условного оформления:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Шаг 1. Создаем новый элемент условного оформления формы
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // Шаг 2. Задаем оформление (в нашем случае - цвет фона)
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);
    
    // Шаг 3. Настраиваем условие отбора (Товары.Сумма > 100 000)
    ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Сумма");
    ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
    ЭлементУсловия.ПравоеЗначение = 100000;
    ЭлементУсловия.Использование = Истина;
    
    // Шаг 4. Указываем конкретное оформляемое поле (ячейку "ТоварыСумма")
    ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТоварыСумма");
    ОформляемоеПоле.Использование = Истина;
    
КонецПроцедуры

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

← На главную