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