При разработке интерфейсных решений на платформе 1С:Предприятие 7.7 стандартных средств для выделения строк и ячеек цветом в таблицах значений и табличных частях документов недостаточно. Для реализации визуального оформления разработчики часто используют популярную внешнюю компоненту FormEx. Однако нередко возникает ситуация: разработчик настраивает механизм раскраски, проверяет его под полными правами (администратором), и всё работает корректно, но при запуске базы обычным пользователем раскраска строк полностью отсутствует.
Разберем причины такого поведения, проанализируем взаимосвязь методов компоненты и рассмотрим правильный порядок инициализации раскраски таблиц.
Проанализируем механику работы компоненты FormEx. Для управления цветом элементов формы используется объект Сервис. В коде инициализации часто совершают ошибку: вызывают метод ИспользоватьПланРаскраски(1), забывая о предварительной активации перехвата отрисовки таблиц.
Согласно документации FormEx, метод ИспользоватьПланРаскраски() лишь переключает алгоритм работы раскраски на оптимизированный строковый план, но сам по себе он не включает глобальный перехват отрисовки. Для включения перехвата предназначен метод ВключитьРаскраскуТаблиц().
Почему же у администратора всё могло работать? Метод ВключитьРаскраскуТаблиц() устанавливает глобальный флаг сеанса 1С. Если администратор в рамках своего сеанса перед открытием целевой формы открывал любой другой журнал, отчет или документ, где этот метод уже вызывался, перехват оставался активным для всех последующих окон. Обычный пользователь открывал проблемную форму напрямую, где метод включения отсутствовал, из-за чего механизм раскраски не запускался.
Разберем по шагам, как правильно настроить программный код для гарантированной работы раскраски под любыми учетными записями.
Сервис.ИспользоватьПланРаскраски(1).FormEx_ПланРаскраски.Посмотрим на пример корректного кода в модуле формы:
Процедура ПриОткрытии()
// Создаем объект Сервис компоненты 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_ПланРаскраски важно учитывать следующие правила:
() соответствует одной колонке таблицы слева направо. В этой последовательности строго учитываются как видимые, так и скрытые колонки. Пропуск скобок сместит оформление на соседние ячейки.(BRUSH[NONE]) или (FONT[NONE]) используется для явного возврата к системным цветам оформления Windows.BGR (или COLORREF), рассчитываемом как Красный + (Зеленый * 256) + (Синий * 65536).