При разработке сложных интерфейсов в 1С:Предприятие часто возникает задача выделить цветом конкретные ячейки таблицы в зависимости от данных. Традиционный подход через ручную настройку условного оформления в конфигураторе не всегда удобен, особенно когда колонок десятки, а условия зависят от сложного расчета или внешнего запроса. Рассмотрим подробнее, как реализовать динамическую раскраску ячеек, разберем по шагам различные методы и выясним, какой из них наиболее эффективен для управляемых и обычных форм.
Для управляемых форм (платформа 8.3) основным и самым правильным инструментом является Условное оформление. Вместо того чтобы создавать сотни правил вручную, мы можем реализовать этот процесс кодом при создании формы. Это позволяет гибко управлять оформлением, даже если состав колонок меняется динамически.
Проанализируем ситуацию: нам нужно раскрасить ячейку, сравнивая её значение с данными из запроса. Чтобы не создавать для каждой колонки отдельное скрытое поле, мы можем использовать программный цикл. Разберем пример реализации в процедуре ПриСозданииНаСервере:
// Пример программного создания условного оформления
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Очистим старые правила, если это необходимо
УсловноеОформление.Элементы.Очистить();
// Создаем новое правило оформления
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// 1. Настраиваем оформление (что именно меняем)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
// 2. Указываем условие (когда красить)
// Например, если в колонке "Статус" значение равно 1
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТабличнаяЧасть.Статус");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.ПравоеЗначение = 1;
// 3. Указываем поля, которые нужно оформить (какие именно колонки)
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТабличнаяЧастьКолонка1");
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТабличнаяЧастьКолонка2");
КонецПроцедуры
Этот подход избавляет от необходимости вручную прокликивать свойства каждой колонки и позволяет централизованно управлять логикой визуализации.
Если логика раскраски слишком сложна для простых условий отбора (например, нужно сравнивать данные с результатами сложного временного расчета), рекомендуется использовать одну скрытую служебную колонку. Посмотрим, как это упрощает структуру данных.
Вместо того чтобы добавлять скрытую колонку для каждой основной колонки, мы добавляем в таблицу реквизит ИндексОформления (тип Число или Строка). В процессе заполнения таблицы (после выполнения запроса) мы сразу вычисляем «код цвета» для каждой строки и записываем его в этот реквизит.
Преимущества этого способа:
ИндексОформления.Выясним причину, по которой авторы часто избегают этого метода: кажется, что данных становится больше. Однако с точки зрения производительности 1С, одна дополнительная числовая колонка практически не влияет на скорость, в отличие от десятков сложных правил оформления с вложенными условиями.
Если ваша задача — создать интерактивный отчет или шахматку, где каждая ячейка может иметь уникальный цвет, шрифт и даже примечание, стандартная Таблица может оказаться неудобной. В этом случае рассмотрим использование элемента Поле табличного документа.
В табличном документе мы можем обращаться к каждой конкретной ячейке напрямую по координатам. Разберем по шагам, как это работает:
// Пример прямой раскраски ячеек в ТабДоке
ОбластьЯчейка = ТабДок.Область(5, 3); // Строка 5, Колонка 3
ОбластьЯчейка.ЦветФона = Новый Цвет(255, 0, 0); // Красный
ОбластьЯчейка.Текст = "Критично";
Этот метод идеально подходит для задач отображения, но менее удобен для массового ввода данных пользователем, так как требует ручной обработки событий изменения каждой ячейки.
Важно помнить, что подходы кардинально различаются в зависимости от типа используемых форм. Проанализируем эти различия:
В обычных формах (толстый клиент) доступно событие ПриВыводеСтроки. В нем объект ОформлениеСтроки позволяет напрямую менять свойства любой ячейки «на лету» во время отрисовки. Это именно то, что искал автор в сообщении №5: ОформлениеСтроки.Ячейки.ИмяКолонки.ЦветФона. Однако этот метод считается устаревшим и не поддерживается в веб-клиенте и современных конфигурациях.
В управляемых формах события ПриВыводеСтроки не существует. Попытки имитировать его через циклы по элементам формы приведут к катастрофическому падению производительности, так как каждое обращение к оформлению элемента формы требует передачи данных между клиентом и сервером. Поэтому в управляемом приложении используем только Условное оформление (программное или визуальное).
При работе с большими таблицами (десятки колонок и сотни строк) следуйте этим правилам:
WebЦвета для стандартных решений — они корректно отображаются во всех браузерах при работе через веб-клиент.Подводя итог, наиболее профессиональным и расширяемым решением для современной платформы 1С является сочетание подготовки данных на сервере (вычисление статуса) и программного наложения условного оформления. Это обеспечивает баланс между производительностью системы и гибкостью интерфейса.