Как раскрасить строки табличной части документа через внешнюю обработку в обычных формах 1С?

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

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

Ограничения платформы и особенности оформления в обычных формах

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

Если мы просто попробуем разово обойти элементы табличного поля в коде и задать цвет ячейкам, это оформление сбросится при первом же обновлении интерфейса — например, при прокрутке списка, смене текущей строки или перерисовке формы.

Архитектура внешней обработки заполнения ТЧ

Внешняя обработка заполнения табличной части подключается к платформе через экспортируемую процедуру Инициализировать. Проанализируем её сигнатуру:


Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта) Экспорт
	// Код обработки
КонецПроцедуры

Параметр ТабличноеПолеОбъекта как раз и передает ссылку на элемент управления формы документа. Однако разовое изменение свойства оформления ячеек внутри этой процедуры не даст долговечного результата из-за особенностей перерисовки формы.

Способы решения задачи

Проанализируем практические варианты реализации подсвечивания строк, которые можно применить при разработке.

Вариант 1. Комбинированный метод (служебный флаг в ТЧ + событие формы)

Этот вариант является наиболее надежным и рекомендуемым с точки зрения архитектуры обычного приложения:

  1. Во внешней обработке при вызове процедуры Инициализировать обходим табличную часть документа, находим нужные строки (например, с номенклатурой, помеченной на удаление) и проставляем признак подсвечивания в служебный реквизит ТЧ (например, булевый реквизит ВыделитьСтроку).
  2. В модуле формы самого документа в обработчике события ПриВыводеСтроки или ПриПолученииДанных табличного поля проверяем значение этого флага и задаем оформление.

Рассмотрим пример кода для события ПриВыводеСтроки в модуле формы документа:


Процедура ТабличноеПоле1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	Если ДанныеСтроки.ВыделитьСтроку Тогда
		ОформлениеСтроки.ЦветФона = WebЦвета.СветлоРозовый;
	КонецЕсли;
КонецПроцедуры

Вариант 2. Программная установка действия на события формы

Посмотрим на вариант динамического назначения обработчика события через параметр ТабличноеПолеОбъекта. С помощью метода УстановитьДействие можно назначить процедуру для событий ПриВыводеСтроки или ПриПолученииДанных прямо из внешней обработки.


Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта) Экспорт
	ТабличноеПолеОбъекта.УстановитьДействие("ПриВыводеСтроки", Новый Действие("ТабличноеПолеПриВыводеСтроки"));
КонецПроцедуры

Важное ограничение: Чтобы данный метод работал корректно и не вызывал ошибок при перерисовке, экземпляр внешней обработки должен постоянно находиться в памяти (быть открыт в виде формы или сохранен в переменной формы документа). В противном случае платформа 1С выдаст ошибку из-за отсутствия обработчика в контексте.

Вариант 3. Использование внешней обработки со своей формой

Выясним еще один альтернативный подход — создание внешней обработки с собственной формой:

  1. При вызове внешней обработки данные из табличной части документа считываются и передаются во внутреннее табличное поле формы обработки.
  2. В форме внешней обработки настраивается событие ПриВыводеСтроки, где вычисляются статусы номенклатуры (например, проверка пометки на удаление) и задается цвет фона строк.
  3. Пользователь видит подсвеченные строки в форме обработки, вносит необходимые изменения и по кнопке переноса возвращает обновленные данные в документ.

Оптимизация производительности: событие ПриПолученииДанных

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

Для оптимизации рекомендуется использовать событие ПриПолученииДанных. В нем массив выводимых строк передается единовременно, что позволяет получить статусы пометки на удаление одним запросом к базе данных и быстро применить визуальное оформление.

← На главную