Почему раскраска таблиц через FormEx в 1С 7.7 не работает у обычных пользователей?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке интерфейсных решений на платформе 1С:Предприятие 7.7 стандартных средств для выделения строк и ячеек цветом в таблицах значений и табличных частях документов недостаточно. Для реализации визуального оформления разработчики часто используют популярную внешнюю компоненту FormEx. Однако нередко возникает ситуация: разработчик настраивает механизм раскраски, проверяет его под полными правами (администратором), и всё работает корректно, но при запуске базы обычным пользователем раскраска строк полностью отсутствует.

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

В чем причина избирательной работы раскраски

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

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

Почему же у администратора всё могло работать? Метод ВключитьРаскраскуТаблиц() устанавливает глобальный флаг сеанса 1С. Если администратор в рамках своего сеанса перед открытием целевой формы открывал любой другой журнал, отчет или документ, где этот метод уже вызывался, перехват оставался активным для всех последующих окон. Обычный пользователь открывал проблемную форму напрямую, где метод включения отсутствовал, из-за чего механизм раскраски не запускался.

Пошаговое решение: правильная инициализация методов

Разберем по шагам, как правильно настроить программный код для гарантированной работы раскраски под любыми учетными записями.

  1. Вызов метода ВключитьРаскраскуТаблиц: Перед использованием плана раскраски необходимо обязательно активировать общий механизм перехвата отрисовки интерфейсных таблиц.
  2. Активация плана раскраски: Вызываем Сервис.ИспользоватьПланРаскраски(1).
  3. Добавление служебной колонки: В табличную часть или таблицу значений добавляется служебная колонка со строгим наименованием FormEx_ПланРаскраски.
  4. Формирование строки плана: Для каждой строки таблицы заполняется шаблон оформления колонок.

Посмотрим на пример корректного кода в модуле формы:


Процедура ПриОткрытии()
    // Создаем объект Сервис компоненты FormEx
    Сервис = СоздатьОбъект("Сервис");
    
    // Включаем общий механизм раскраски таблиц
    Сервис.ВключитьРаскраскуТаблиц(1);
    
    // Включаем режим использования строкового плана раскраски
    Сервис.ИспользоватьПланРаскраски(1);
    
    // Добавляем служебную колонку в таблицу
    фТаблДокументов.ВставитьКолонку("FormEx_ПланРаскраски", 1, "Строка", , , , , );
    фТаблДокументов.ВидимостьКолонки("FormEx_ПланРаскраски", 0);
КонецПроцедуры

Теперь рассмотрим процедуру заполнения и раскраски строк по условию:


Процедура ЗаполнитьИРаскрасить()
    фТаблДокументов.ВыбратьСтроки();
    Пока фТаблДокументов.ПолучитьСтроку() = 1 Цикл
        Если Найти(фТаблДокументов.Номенклатура, "1130") > 0 Тогда
            // Устанавливаем оранжевый фон для нужной колонки (цвет в формате COLORREF / BGR)
            фТаблДокументов.FormEx_ПланРаскраски = "()()()()()()()()()()(BRUSH[33023])(BRUSH[NONE])";
        Иначе
            фТаблДокументов.FormEx_ПланРаскраски = "";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Рекомендация по глобальной инициализации

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


Процедура ПриНачалеРаботыСистемы()
    Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 1 Тогда
        Сервис = СоздатьОбъект("Сервис");
        Сервис.ВключитьРаскраскуТаблиц(1);
        Сервис.ИспользоватьПланРаскраски(1);
    Иначе
        Сообщить("Не удалось загрузить внешнюю компоненту FormEx!", "!");
    КонецЕсли;
КонецПроцедуры

При таком подходе раскраска будет гарантированно работать во всех формах конфигурации у всех пользователей без необходимости повторного вызова активации в каждом отдельном модуле.

Особенности работы с планом раскраски

При работе со строками FormEx_ПланРаскраски важно учитывать следующие правила:

  1. Учет всех колонок таблицы: Каждая пара круглых скобок () соответствует одной колонке таблицы слева направо. В этой последовательности строго учитываются как видимые, так и скрытые колонки. Пропуск скобок сместит оформление на соседние ячейки.
  2. Сброс цвета: Конструкция (BRUSH[NONE]) или (FONT[NONE]) используется для явного возврата к системным цветам оформления Windows.
  3. Формат задания цвета: Числовые значения цветов передаются в формате BGR (или COLORREF), рассчитываемом как Красный + (Зеленый * 256) + (Синий * 65536).
  4. Версия компоненты: В релизах FormEx до версии 2.0.5.121 присутствовали ошибки работы с планами раскраски. Рекомендуется использовать актуальные сборки компоненты (версии 2.0.5.121 и выше).
← На главную