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