Каталог решений - Как раскрасить контрагентов в отчетах за 15 минут

Как раскрасить контрагентов в отчетах за 15 минут

Как раскрасить контрагентов в отчетах за 15 минут

В наличии

Попросили меня как-то ввести «цветовую дифференциацию штанов» у контрагентов в базе 1С 7.7, да так, чтобы они и в печатных формах отчетов выводились соответствующим цветом. Например, чтобы можно было каких-нибудь «злостных» должников выделять красным, а особо важных – синим, а уже не актуальных – сереньким и т.п.
И если раскрасить формы списков справочника и организовать выбор цвета с формы элемента справочника не особо напряжно (с FormEx’ом), то с отчетами хотелось бы сделать так, чтобы не прилагать «титанических» усилий по переписыванию и дописыванию разнообразных отчетов, где фигурируют контрагенты. И поэтому, немного подумав, поступил так…

Категория:

Описание

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

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

ЗагрузитьВнешнююКомпоненту(«FormEx.dll»);
Сервис = СоздатьОбъект(«Сервис»);
Сервис.ВключитьРаскраскуТаблиц();

Затем в справочник контрагентов добавляем новый числовой реквизит Цвет. И на форму элемента бросаем текстовый контрол с идентификатором тЦветШтанов и формулой: Лев(«Цвет штанов:»+Форма.тЦветШтанов.Цвет(Цвет),12). И рядом добавляем кнопку для выбора цвета с формулой: ВыборЦвета(). А в модуле формы определяем эту функцию:

//——————————————————
Процедура ВыборЦвета()
   
Сервис=СоздатьОбъект(«Сервис»);
   
ВыбЦвет=Сервис.ВыбратьЦвет(1,Цвет);
    Если
ВыбЦвет=-1 Тогда
        Возврат;
    КонецЕсли;
   
Цвет=ВыбЦвет;
   
Записать();
КонецПроцедуры 
// ВыборЦвета
//——————————————————

Получим результат при нажатии на кнопку выбора цвета, как на рисунке 1.

Рис. 1

Рисунок 1

И теперь, в формы списков все этого же справочника добавляем новый столбец (невидимый) в начало с заголовком FormEx_ПланРаскраски и формулой: «(FONT[«+Цвет+«])». Как на рисунке 2.

Рис. 2

Рисунок 2

Собственно, назначение и хранение цветов для контрагентов, и раскраску их в списках мы организовали, можем полюбоваться (см. рис. 3).

Рис. 3

Рисунок 3

А вот теперь перейдем к отчетам. Объявим в глобальном модуле переменную:

Перем глТзРаскраскиТаблиц;

И в теле глобального модуля определим ее:

глТзРаскраскиТаблиц=СоздатьОбъект(«ТаблицаЗначений»);
глТзРаскраскиТаблиц.НоваяКолонка(«Адрес»,«Строка»);
глТзРаскраскиТаблиц.НоваяКолонка(«Цвет»,«Число»);

И допишем в глобальный модуль три простенькие функции:

//——————————————————
Функция глЗаписатьСтрокуТзРаскраскиТаблиц(Т,Расшифровка) Экспорт
    Попытка
       
Цвет=Расшифровка.Цвет;
       
ТекСтрока=1+Т.ВысотаТаблицы();
       
Адрес=«R»+ТекСтрока+«C1:R»+ТекСтрока+«C»+Т.ШиринаТаблицы();
       
глТзРаскраскиТаблиц.НоваяСтрока();
       
глТзРаскраскиТаблиц.Адрес=Адрес;
       
глТзРаскраскиТаблиц.Цвет=Цвет;
    Исключение
    КонецПопытки;
    Возврат
Расшифровка;
КонецФункции   
// глЗаписатьСтрокуТзРаскраскиТаблиц
//——————————————————

//——————————————————
Процедура глОчиститьТзРаскраскиТаблиц() Экспорт
    Попытка
       
глТзРаскраскиТаблиц.УдалитьСтроки();
    Исключение
    КонецПопытки;
КонецПроцедуры 
// глОчиститьТзРаскраскиТаблиц
//——————————————————

//——————————————————
Процедура глРаскраситьТаблицу(Т) Экспорт
    Попытка
       
глТзРаскраскиТаблиц.ВыбратьСтроки();
        Пока
глТзРаскраскиТаблиц.ПолучитьСтроку()=1 Цикл
           
Область=Т.Область(глТзРаскраскиТаблиц.Адрес);
           
Область.ЦветТекста(глТзРаскраскиТаблиц.Цвет);
        КонецЦикла;
    Исключение
    КонецПопытки;
   
глОчиститьТзРаскраскиТаблиц();
КонецПроцедуры 
// глРаскраситьТаблицу
//——————————————————

А теперь берем, ну, например, отчет взаиморасчеты. Ищем там процедуру Сформировать() — ту, к которой «привязаны» кнопки «Ок» и «Сформировать» в форме отчета. И в начало этой процедуры (после объявления локальных переменных, конечно) прописываем вызов очистки ТЗ раскраски:

// Это вызов нашей функции
глОчиститьТзРаскраскиТаблиц();

// Это создание/очистка таблицы отчета перед
// формированием и выводом отчета
// Это уже было, т.е. добавлять это не надо
Если (ТипЗначенияСтр(Т) <> «Таблица») ИЛИ (Обновить = 0) Тогда
   
Т = СоздатьОбъект(«Таблица»);
Иначе
   
Т.Очистить();
КонецЕсли;

Потом находим показ таблицы отчета и перед ним прописываем вызов процедуры раскраски:

// Это вызов нашей функции
глРаскраситьТаблицу(Т);

// Это показ результирующий таблицы отчета
// Это уже было, т.е. добавлять это не надо
Т.Показать(«Взаиморасчеты с контрагентами»,«»);

И самое главное, переходим к таблице и в расшифровку ячеек, где выводятся контрагенты, вместо старой расшифровки прописываем такую формулу (допустим в расшифровке стояло «Запрос.Контрагент», а переменная типа «Таблица» в модуле формы отчета называется «Т»):

глЗаписатьСтрокуТзРаскраскиТаблиц(Т,Запрос.Контрагент)

Т.е. примерно как на рисунке 4.

Рис. 4

Рисунок 4

Теперь запустив этот отчет, наблюдаем картину, как на рисунке 5.

Рис. 5

Рисунок 5

Идея проста, ТЗ раскраски имеет две колонки: адрес области таблицы формата RnCn, которой нужно задать цвет текста; и цвет, который нужно задать этой области. Перед началом формирования отчета очищаем ТЗ для раскраски. В процессе вывода секций, значения расшифровок ячеек вычисляются, а значит и строки в ТЗ для раскраски добавляются. А перед показом, но после вывода, пробегаем по строкам ТЗ для раскраски, и записанные адреса раскрашиваем соответствующим цветом, после чего опять, на всякий случай, очищаем ТЗ раскраски. И собственно уже после этого показывается раскрашенная таблица отчета пользователю. Используем расшифровку ячейки отчета, потому, что иногда в самом тексте ячейки может быть текстовое представление контрагента, например, а не сам элемент справочника.

Поправив подобным образом все необходимые отчеты, мы и пришли к цели, «малой кровью» и без особых напряжений.

has been added to your cart:
Оформление заказа