Как раскрасить контрагентов в отчетах за 15 минут
Попросили меня как-то ввести «цветовую дифференциацию штанов» у контрагентов в базе 1С 7.7, да так, чтобы они и в печатных формах отчетов выводились соответствующим цветом. Например, чтобы можно было каких-нибудь «злостных» должников выделять красным, а особо важных – синим, а уже не актуальных – сереньким и т.п.
И если раскрасить формы списков справочника и организовать выбор цвета с формы элемента справочника не особо напряжно (с FormEx’ом), то с отчетами хотелось бы сделать так, чтобы не прилагать «титанических» усилий по переписыванию и дописыванию разнообразных отчетов, где фигурируют контрагенты. И поэтому, немного подумав, поступил так…
- Описание
- Подробнее
Описание
Тут я описываю скорее идею, чем ее конечную реализацию, да и применить ее можно не только к контрагентам, а и к другим справочникам, да и развить идею по функционалу, естественно, тоже есть куда. Итак, для начала, организуем выбор цвета контрагенту и раскраску форм списков, а затем уже перейдем к отчетам.
Качаем formex.dll, закидываем его в папку с базой, в процедуре ПриНачалеРаботыСистемы() глобального модуля пишем:
ЗагрузитьВнешнююКомпоненту(«FormEx.dll»);
Сервис = СоздатьОбъект(«Сервис»);
Сервис.ВключитьРаскраскуТаблиц();
Затем в справочник контрагентов добавляем новый числовой реквизит Цвет. И на форму элемента бросаем текстовый контрол с идентификатором тЦветШтанов и формулой: Лев(«Цвет штанов:»+Форма.тЦветШтанов.Цвет(Цвет),12). И рядом добавляем кнопку для выбора цвета с формулой: ВыборЦвета(). А в модуле формы определяем эту функцию:
//——————————————————
Процедура ВыборЦвета()
Сервис=СоздатьОбъект(«Сервис»);
ВыбЦвет=Сервис.ВыбратьЦвет(1,Цвет);
Если ВыбЦвет=-1 Тогда
Возврат;
КонецЕсли;
Цвет=ВыбЦвет;
Записать();
КонецПроцедуры // ВыборЦвета
//——————————————————
Получим результат при нажатии на кнопку выбора цвета, как на рисунке 1.
Рисунок 1
И теперь, в формы списков все этого же справочника добавляем новый столбец (невидимый) в начало с заголовком FormEx_ПланРаскраски и формулой: «(FONT[«+Цвет+«])». Как на рисунке 2.
Рисунок 2
Собственно, назначение и хранение цветов для контрагентов, и раскраску их в списках мы организовали, можем полюбоваться (см. рис. 3).
Рисунок 3
А вот теперь перейдем к отчетам. Объявим в глобальном модуле переменную:
Перем глТзРаскраскиТаблиц;
И в теле глобального модуля определим ее:
глТзРаскраскиТаблиц=СоздатьОбъект(«ТаблицаЗначений»);
глТзРаскраскиТаблиц.НоваяКолонка(«Адрес»,«Строка»);
глТзРаскраскиТаблиц.НоваяКолонка(«Цвет»,«Число»);
И допишем в глобальный модуль три простенькие функции:
//——————————————————
Функция глЗаписатьСтрокуТзРаскраскиТаблиц(Т,Расшифровка) Экспорт
Попытка
Цвет=Расшифровка.Цвет;
ТекСтрока=1+Т.ВысотаТаблицы();
Адрес=«R»+ТекСтрока+«C1:R»+ТекСтрока+«C»+Т.ШиринаТаблицы();
глТзРаскраскиТаблиц.НоваяСтрока();
глТзРаскраскиТаблиц.Адрес=Адрес;
глТзРаскраскиТаблиц.Цвет=Цвет;
Исключение
КонецПопытки;
Возврат Расшифровка;
КонецФункции // глЗаписатьСтрокуТзРаскраскиТаблиц
//——————————————————
//——————————————————
Процедура глОчиститьТзРаскраскиТаблиц() Экспорт
Попытка
глТзРаскраскиТаблиц.УдалитьСтроки();
Исключение
КонецПопытки;
КонецПроцедуры // глОчиститьТзРаскраскиТаблиц
//——————————————————
//——————————————————
Процедура глРаскраситьТаблицу(Т) Экспорт
Попытка
глТзРаскраскиТаблиц.ВыбратьСтроки();
Пока глТзРаскраскиТаблиц.ПолучитьСтроку()=1 Цикл
Область=Т.Область(глТзРаскраскиТаблиц.Адрес);
Область.ЦветТекста(глТзРаскраскиТаблиц.Цвет);
КонецЦикла;
Исключение
КонецПопытки;
глОчиститьТзРаскраскиТаблиц();
КонецПроцедуры // глРаскраситьТаблицу
//——————————————————
А теперь берем, ну, например, отчет взаиморасчеты. Ищем там процедуру Сформировать() — ту, к которой «привязаны» кнопки «Ок» и «Сформировать» в форме отчета. И в начало этой процедуры (после объявления локальных переменных, конечно) прописываем вызов очистки ТЗ раскраски:
// Это вызов нашей функции
глОчиститьТзРаскраскиТаблиц();
// Это создание/очистка таблицы отчета перед
// формированием и выводом отчета
// Это уже было, т.е. добавлять это не надо
Если (ТипЗначенияСтр(Т) <> «Таблица») ИЛИ (Обновить = 0) Тогда
Т = СоздатьОбъект(«Таблица»);
Иначе
Т.Очистить();
КонецЕсли;
Потом находим показ таблицы отчета и перед ним прописываем вызов процедуры раскраски:
// Это вызов нашей функции
глРаскраситьТаблицу(Т);
// Это показ результирующий таблицы отчета
// Это уже было, т.е. добавлять это не надо
Т.Показать(«Взаиморасчеты с контрагентами»,«»);
И самое главное, переходим к таблице и в расшифровку ячеек, где выводятся контрагенты, вместо старой расшифровки прописываем такую формулу (допустим в расшифровке стояло «Запрос.Контрагент», а переменная типа «Таблица» в модуле формы отчета называется «Т»):
глЗаписатьСтрокуТзРаскраскиТаблиц(Т,Запрос.Контрагент)
Т.е. примерно как на рисунке 4.
Рисунок 4
Теперь запустив этот отчет, наблюдаем картину, как на рисунке 5.
Рисунок 5
Идея проста, ТЗ раскраски имеет две колонки: адрес области таблицы формата RnCn, которой нужно задать цвет текста; и цвет, который нужно задать этой области. Перед началом формирования отчета очищаем ТЗ для раскраски. В процессе вывода секций, значения расшифровок ячеек вычисляются, а значит и строки в ТЗ для раскраски добавляются. А перед показом, но после вывода, пробегаем по строкам ТЗ для раскраски, и записанные адреса раскрашиваем соответствующим цветом, после чего опять, на всякий случай, очищаем ТЗ раскраски. И собственно уже после этого показывается раскрашенная таблица отчета пользователю. Используем расшифровку ячейки отчета, потому, что иногда в самом тексте ячейки может быть текстовое представление контрагента, например, а не сам элемент справочника.
Поправив подобным образом все необходимые отчеты, мы и пришли к цели, «малой кровью» и без особых напряжений.