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

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

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

Метод 1. Программное создание элементов условного оформления

Для управляемых форм (платформа 8.3) основным и самым правильным инструментом является Условное оформление. Вместо того чтобы создавать сотни правил вручную, мы можем реализовать этот процесс кодом при создании формы. Это позволяет гибко управлять оформлением, даже если состав колонок меняется динамически.

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


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

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

Этот подход избавляет от необходимости вручную прокликивать свойства каждой колонки и позволяет централизованно управлять логикой визуализации.

Метод 2. Использование скрытой колонки-статуса («Карта цветов»)

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

Вместо того чтобы добавлять скрытую колонку для каждой основной колонки, мы добавляем в таблицу реквизит ИндексОформления (тип Число или Строка). В процессе заполнения таблицы (после выполнения запроса) мы сразу вычисляем «код цвета» для каждой строки и записываем его в этот реквизит.

Преимущества этого способа:

  1. Логика расчета цвета выполняется один раз на сервере при получении данных.
  2. Условное оформление настраивается всего один раз для всей таблицы, опираясь на значение ИндексОформления.
  3. Минимальная нагрузка на клиентское приложение при отрисовке формы.

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

Метод 3. Поле табличного документа (для сложной аналитики)

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

В табличном документе мы можем обращаться к каждой конкретной ячейке напрямую по координатам. Разберем по шагам, как это работает:


// Пример прямой раскраски ячеек в ТабДоке
ОбластьЯчейка = ТабДок.Область(5, 3); // Строка 5, Колонка 3
ОбластьЯчейка.ЦветФона = Новый Цвет(255, 0, 0); // Красный
ОбластьЯчейка.Текст = "Критично";

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

Важные различия: Управляемые vs Обычные формы

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

В обычных формах (толстый клиент) доступно событие ПриВыводеСтроки. В нем объект ОформлениеСтроки позволяет напрямую менять свойства любой ячейки «на лету» во время отрисовки. Это именно то, что искал автор в сообщении №5: ОформлениеСтроки.Ячейки.ИмяКолонки.ЦветФона. Однако этот метод считается устаревшим и не поддерживается в веб-клиенте и современных конфигурациях.

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

Рекомендации по оптимизации

При работе с большими таблицами (десятки колонок и сотни строк) следуйте этим правилам:

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

← На главную