При разработке интерфейсов в обычных формах часто возникает задача динамического оформления ячеек табличного поля. Например, когда в таблице представлены дни месяца с именами колонок от ДД1 до ДД31, и требуется выделить цветом ячейку, номер которой вычисляется в ходе работы алгоритма. Разберем по шагам, как правильно формировать имя ячейки, обращаться к ней программно и оптимизировать визуальное оформление таблицы.
В типовом коде прямое обращение к свойству объекта выполняется через точку:
ОформлениеСтроки.Ячейки.ДД15.ЦветФона = Новый Цвет(134, 134, 255);
Однако имя свойства в данном случае фиксировано. Если номер ячейки хранится в переменной, использовать обращение через точку невозможно. Выясним причину: коллекция Ячейки объекта ОформлениеСтроки поддерживает доступ по индексу и по строковому имени элемента через оператор квадратных скобок [].
Посмотрим на базовый пример подстановки строкового имени:
ОформлениеСтроки.Ячейки["ДД15"].ЦветФона = Новый Цвет(134, 134, 255);
Рассмотрим ситуацию, когда номер дня хранится в числовой переменной. Чтобы корректно составить строковое имя колонки, разберем нюансы приведения чисел к строкам в платформе 1С.
Если для получения имени применить обычную функцию Строка(й), то при числах от 1000 и выше платформа автоматически вставит неразрывный пробел в качестве разделителя триад. В случае дней месяца числа не превышают 31, однако следование хорошим практикам разработки гарантирует отсутствие скрытых ошибок в будущем. Рекомендуется использовать явное форматирование без разделителей групп либо функцию СтрШаблон:
// Вариант с явным отключением разделителя групп
ИмяКолонки = "ДД" + Формат(й, "ЧГ=0");
// Либо с использованием шаблона строки
ИмяКолонки = СтрШаблон("ДД%1", Формат(й, "ЧГ=0"));
Проанализируем потенциальную проблему: если обратиться напрямую через квадратные скобки ОформлениеСтроки.Ячейки[ИмяКолонки] к колонке, которой физически нет в таблице (например, день 31 в феврале), платформа вызовет ошибку времени выполнения и прервет работу пользователя.
Чтобы избежать аварийного завершения программы, реализуем безопасный поиск ячейки с помощью метода Найти:
ИмяКолонки = "ДД" + Формат(й, "ЧГ=0");
Ячейка = ОформлениеСтроки.Ячейки.Найти(ИмяКолонки);
Если Ячейка <> Неопределено Тогда
Ячейка.ЦветФона = НужныйЦвет;
КонецЕсли;
События оформления строк вызываются многократно при каждой перерисовке и прокрутке таблицы. Ошибки в этих процедурах напрямую влияют на отзывчивость интерфейса. Разберем ключевые правила оптимизации:
Новый Цвет(...) не должен вызываться на каждой строке или ячейке. Постоянное создание новых объектов цвета создает избыточную нагрузку на память и процессор. Создадим переменную цвета один раз на уровне модуля формы (например, в событии ПриОткрытии) или воспользуемся предопределенными цветами из коллекций WebЦвета, ЦветаWindows или ЦветаСтиля.ПриВыводеСтроки срабатывает индивидуально для каждой отображаемой строки. Если логика раскрашивания требует сложных выборок или сопоставления данных, целесообразно перенести ее в обработчик ПриПолученииДанных, куда передается сразу массив видимых строк ОформленияСтрок. Это существенно снижает количество обращений и ускоряет рендеринг таблицы.Важно помнить, что объект ОформлениеСтроки, коллекция Ячейки и события ПриВыводеСтроки / ПриПолученииДанных функционируют исключительно в обычных формах (толстый клиент).
В управляемых формах данный подход не применим. Для динамического оформления элементов и ячеек там используется механизм Условного оформления (коллекция УсловноеОформление). Настройка условного оформления выполняется либо интерактивно в свойствах формы, либо программно на стороне сервера (например, в процедуре ПриСозданииНаСервере) с добавлением элементов оформления, условий и оформляемых полей.