В платформе 1С 7.7 штатные средства визуализации табличных частей довольно ограничены. Для решения задач динамического оформления, таких как выделение цветом строк или отдельных ячеек в зависимости от состояния данных, программисты часто используют внешнюю компоненту FormEx. Рассмотрим типичную ситуацию: в документе необходимо выделить красным цветом ячейку с товаром, если этот товар помечен на удаление в справочнике. Это позволяет оператору сразу увидеть некорректные данные и заменить дублирующийся элемент на актуальный.
Часто начинающие разработчики пытаются перенести логику работы со справочниками в документы без изменений. Проанализируем исходный код, который может вызывать проблемы:
Function FormEx_Check()
DeleteGood = CreateObject("Reference.Good");
If DeleteGood.FindByCode(Good.Code,0)=1 Then
If DeleteGood.DeleteMark()=1 Then
Return "BRUSH["+GetColour(255,0,0)+"]COUNT[1]INDENT[3]"
EndIf;
EndIf;
EndFunction
В данном примере мы видим две критические ошибки, которые приводят к «тормозам» интерфейса и некорректному отображению:
CreateObject и FindByCode внутри такого цикла создает колоссальную нагрузку на базу данных.Для правильной работы раскраски нам нужно максимально упростить код функции, чтобы она возвращала результат мгновенно. Выясним причину, почему прямой вызов DeleteMark() предпочтительнее. Поскольку в контексте строки документа переменная Товар (или Good) уже содержит объект, мы можем обращаться к его свойствам напрямую.
Рассмотрим правильный вариант функции:
Функция РаскраситьЯчейкуТовара()
// Проверяем, выбрано ли значение в текущей строке
Если Выбран() = 0 Тогда
Возврат "";
КонецЕсли;
// Проверяем пометку на удаление напрямую через ссылку
Если Товар.ПометкаУдаления() = 1 Тогда
// Возвращаем управляющую строку FormEx
// BRUSH - цвет фона (красный)
// COUNT[1] - раскрашиваем только одну следующую ячейку
Возврат "BRUSH[" + глПолучитьЦвет(255, 0, 0) + "]COUNT[1]";
КонецЕсли;
// Важно вернуть пустую строку, если условие не выполнено
Возврат "";
КонецФункции
Разберем по шагам, как правильно встроить эту функцию в форму документа:
РаскраситьЯчейкуТовара().Проанализируем параметры возвращаемой строки. Команда COUNT[1] указывает компоненте FormEx, что настройки цвета должны примениться к следующему визуальному элементу (ячейке) справа от текущей невидимой колонки. Если вам нужно раскрасить две колонки подряд, используйте COUNT[2].
FormEx позволяет управлять не только цветом фона, но и цветом текста, а также начертанием шрифта. Посмотрим на пример расширенной управляющей строки:
// BRUSH - цвет фона
// PEN - цвет текста (белый)
// FONT[BOLD] - жирный шрифт
Возврат "BRUSH[" + глПолучитьЦвет(255, 0, 0) + "]PEN[" + глПолучитьЦвет(255, 255, 255) + "]FONT[BOLD]COUNT[1]";
Также стоит помнить о производительности при работе с большими справочниками. Если в документе очень много строк, обращение через точку (Товар.ПометкаУдаления()) все равно может вызывать небольшие задержки, так как 1С выполняет неявный запрос к БД для получения атрибута объекта. В высоконагруженных системах рекомендуется предварительно кэшировать список помеченных на удаление товаров в ТаблицуЗначений или СписокЗначений при открытии формы и проверять наличие товара в этом кэше.
Для того чтобы раскраска всегда была актуальной, обратите внимание на следующие моменты:
FormEx.dll корректно загружена при старте системы (обычно в процедуре ПриНачалеРаботыСистемы)."" в случае, если условие раскраски не выполняется. Это обязательное условие для сброса стиля ячейки.глПолучитьЦвет(Р, Г, Б), чтобы код был читаемым и стандартизированным для всей конфигурации.Таким образом, мы выяснили, что ключ к успешному использованию FormEx в документах 1С 7.7 — это минимизация обращений к базе данных внутри функций отрисовки и правильное позиционирование служебных колонок в табличной части.