Как реализовать раскраску ячеек в табличной части документа 1С 7.7 при помощи FormEx

Программист 1С v7.7
← На главную

В платформе 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

В данном примере мы видим две критические ошибки, которые приводят к «тормозам» интерфейса и некорректному отображению:

  1. Создание объекта внутри функции раскраски: Функция, прописанная в формуле колонки, вызывается системой 1С 7.7 десятки раз в секунду — при каждом движении мыши, прокрутке или обновлении экрана. Использование CreateObject и FindByCode внутри такого цикла создает колоссальную нагрузку на базу данных.
  2. Избыточность поиска: В табличной части документа значение в колонке «Товар» уже является ссылкой на элемент справочника. Нет никакой необходимости искать этот товар по коду заново.

Оптимизированное решение задачи

Для правильной работы раскраски нам нужно максимально упростить код функции, чтобы она возвращала результат мгновенно. Выясним причину, почему прямой вызов DeleteMark() предпочтительнее. Поскольку в контексте строки документа переменная Товар (или Good) уже содержит объект, мы можем обращаться к его свойствам напрямую.

Рассмотрим правильный вариант функции:


Функция РаскраситьЯчейкуТовара()
    // Проверяем, выбрано ли значение в текущей строке
    Если Выбран() = 0 Тогда
        Возврат "";
    КонецЕсли;

    // Проверяем пометку на удаление напрямую через ссылку
    Если Товар.ПометкаУдаления() = 1 Тогда
        // Возвращаем управляющую строку FormEx
        // BRUSH - цвет фона (красный)
        // COUNT[1] - раскрашиваем только одну следующую ячейку
        Возврат "BRUSH[" + глПолучитьЦвет(255, 0, 0) + "]COUNT[1]";
    КонецЕсли;

    // Важно вернуть пустую строку, если условие не выполнено
    Возврат "";
КонецФункции

Механика работы FormEx в многострочной части

Разберем по шагам, как правильно встроить эту функцию в форму документа:

  1. Откроем форму документа в конфигураторе.
  2. В табличную часть добавим новую колонку типа «Текст».
  3. Важное правило: Эту служебную колонку необходимо расположить в списке колонок левее той колонки, которую мы хотим раскрасить (в нашем случае левее колонки «Товар»).
  4. В свойствах новой колонки, на закладке «Дополнительно», в поле «Формула» впишем название нашей функции: РаскраситьЯчейкуТовара().
  5. Ширину служебной колонки можно установить в значение 0, чтобы она не была видна пользователю.

Проанализируем параметры возвращаемой строки. Команда COUNT[1] указывает компоненте FormEx, что настройки цвета должны примениться к следующему визуальному элементу (ячейке) справа от текущей невидимой колонки. Если вам нужно раскрасить две колонки подряд, используйте COUNT[2].

Дополнительные возможности оформления

FormEx позволяет управлять не только цветом фона, но и цветом текста, а также начертанием шрифта. Посмотрим на пример расширенной управляющей строки:


// BRUSH - цвет фона
// PEN - цвет текста (белый)
// FONT[BOLD] - жирный шрифт
Возврат "BRUSH[" + глПолучитьЦвет(255, 0, 0) + "]PEN[" + глПолучитьЦвет(255, 255, 255) + "]FONT[BOLD]COUNT[1]";

Также стоит помнить о производительности при работе с большими справочниками. Если в документе очень много строк, обращение через точку (Товар.ПометкаУдаления()) все равно может вызывать небольшие задержки, так как 1С выполняет неявный запрос к БД для получения атрибута объекта. В высоконагруженных системах рекомендуется предварительно кэшировать список помеченных на удаление товаров в ТаблицуЗначений или СписокЗначений при открытии формы и проверять наличие товара в этом кэше.

Рекомендации по стабильной работе

Для того чтобы раскраска всегда была актуальной, обратите внимание на следующие моменты:

Таким образом, мы выяснили, что ключ к успешному использованию FormEx в документах 1С 7.7 — это минимизация обращений к базе данных внутри функций отрисовки и правильное позиционирование служебных колонок в табличной части.

← На главную