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

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

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

Синтаксис обращения к элементам коллекции ячеек

В типовом коде прямое обращение к свойству объекта выполняется через точку:

ОформлениеСтроки.Ячейки.ДД15.ЦветФона = Новый Цвет(134, 134, 255);

Однако имя свойства в данном случае фиксировано. Если номер ячейки хранится в переменной, использовать обращение через точку невозможно. Выясним причину: коллекция Ячейки объекта ОформлениеСтроки поддерживает доступ по индексу и по строковому имени элемента через оператор квадратных скобок [].

Посмотрим на базовый пример подстановки строкового имени:

ОформлениеСтроки.Ячейки["ДД15"].ЦветФона = Новый Цвет(134, 134, 255);

Динамическое формирование имени колонки

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

Если для получения имени применить обычную функцию Строка(й), то при числах от 1000 и выше платформа автоматически вставит неразрывный пробел в качестве разделителя триад. В случае дней месяца числа не превышают 31, однако следование хорошим практикам разработки гарантирует отсутствие скрытых ошибок в будущем. Рекомендуется использовать явное форматирование без разделителей групп либо функцию СтрШаблон:


// Вариант с явным отключением разделителя групп
ИмяКолонки = "ДД" + Формат(й, "ЧГ=0");

// Либо с использованием шаблона строки
ИмяКолонки = СтрШаблон("ДД%1", Формат(й, "ЧГ=0"));

Безопасное обращение к ячейке через метод Найти

Проанализируем потенциальную проблему: если обратиться напрямую через квадратные скобки ОформлениеСтроки.Ячейки[ИмяКолонки] к колонке, которой физически нет в таблице (например, день 31 в феврале), платформа вызовет ошибку времени выполнения и прервет работу пользователя.

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


ИмяКолонки = "ДД" + Формат(й, "ЧГ=0");
Ячейка = ОформлениеСтроки.Ячейки.Найти(ИмяКолонки);

Если Ячейка <> Неопределено Тогда
    Ячейка.ЦветФона = НужныйЦвет;
КонецЕсли;

Оптимизация производительности при выводе строк

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

  1. Кэширование цвета. Конструктор Новый Цвет(...) не должен вызываться на каждой строке или ячейке. Постоянное создание новых объектов цвета создает избыточную нагрузку на память и процессор. Создадим переменную цвета один раз на уровне модуля формы (например, в событии ПриОткрытии) или воспользуемся предопределенными цветами из коллекций WebЦвета, ЦветаWindows или ЦветаСтиля.
  2. Выбор события таблицы. Обработчик ПриВыводеСтроки срабатывает индивидуально для каждой отображаемой строки. Если логика раскрашивания требует сложных выборок или сопоставления данных, целесообразно перенести ее в обработчик ПриПолученииДанных, куда передается сразу массив видимых строк ОформленияСтрок. Это существенно снижает количество обращений и ускоряет рендеринг таблицы.

Различия между обычными и управляемыми формами

Важно помнить, что объект ОформлениеСтроки, коллекция Ячейки и события ПриВыводеСтроки / ПриПолученииДанных функционируют исключительно в обычных формах (толстый клиент).

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

← На главную