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