Upd: Версия 1.8 Исправлена синтаксическая ошибка в имени обработки. Исправлена работа с временными таблицами при печати таблиц запроса.
Цель данного решения в том, чтобы, чтобы код формирования таблицы был кратким и лаконичным, но в то же время если нужно, можно было настроить "практически все".
Основные преимущества:
- вывод с настройками "по умолчанию" с минимумом кода
- возможность широкой настройки оформления таблицы
- расшифровка "по клику" даже при выводе в простой табличный документ
- использование СКД как основы для формирования табличного документа
- СКД формируется программно, т.е. структура данных может быть произвольной
- возможность сохранения "в файл" без вывода на экран
Зачем
На первый взгляд кажется "зачем? проще сделать отчет СКД и не мучиться!". Отвечаю - здесь речь идет о работе с таблицей, структура данных которой неизвестна заранее. Например, таблица промежуточных результатов какого-то расчета. Под каждую таблицу свой отчет делать?
Самая простая таблица
Вот как выглядит простейший вызов печати таблицы значений с настройками "по умолчанию":
//ТабЗначений - Ваша таблица значений
ТД_Результат = Обработки.авг_УниверсальнаяПечатьТаблиц.ПечатьТаблицыЗначений(ТабЗначений,,"Простая таблица без настроек");
При исполнении такого кода таблица будет выглядеть так:
Вид напечатанной таблицы очень напоминает тот, если бы мы вручную сформировали СКД, создали набор данных "Объект", перечислили все колонки таблицы и сформировали отчет. Здесь все это можно сделать одной строчкой кода.
Чуть больше настроек. Ресурсы
Немного усложним. Пример таблицы, если необходимо выводить итоги по ресурсам.
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("Ресурсы", "Ресурс1(Сумма),Остаток1(КоличествоРазличные),Оборот1(Количество)");
ТД_Результат = Обработки.авг_УнивельсальнаяПечатьТаблиц.ПечатьТаблицыЗначений(ТабЗначений, ПараметрыПечати, "Таблица с указанием ресурсов");
Код тоже не очень сложный. Просто перечисляем колонки ресурсов, в скобках указываем агрегатную функцию. Если агрегатная функция не указана, то используется "(Сумма)".
Группировки полей
Иногда требуется сгруппировать поля (не путать с группировками структуры СКД). Как правило требуется расположить какую-то группу полей вертикально. Такая возможность тоже реализована:
ПараметрыПечати = Новый Структура;
МассивГрупп = Новый Массив;
МассивГрупп.Добавить("ОсновнаяАналитика1,Реквизит1,Измерение1#Измерения#Горизонтальная");
МассивГрупп.Добавить("Ресурс1,Остаток1,Оборот1#Ресурсы");
ПараметрыПечати.Вставить("ГруппировкиПолей", МассивГрупп);
ТД_Результат = Обработки.авг_УнивельсальнаяПечатьТаблиц.ПечатьТаблицыЗначений(ТабЗначений, ПараметрыПечати, "Очень важная таблица");
По коду видно, что для описания настроек группировки используется строка вида:
"ИменаПолейЧерезЗапятую#ИмяГруппы#ВариантРасположения"
Если по какой-то причине нет возможности использовать "строчное" описание группировок, то можно описать структуру группировок используя массив структур. Правда в этом случае код получается гораздо более длинным
ПараметрыПечати = Новый Структура;
МассивГрупп = Новый Массив;
мПоля = Новый Массив;
мПоля .Добавить("Аналитика1");
мПоля .Добавить("Аналитика2");
мПоля .Добавить("Реквизит1");
мПоля .Добавить("Измерение1");
стГруппировки = Новый Структура("СоставГруппы, ЗаголовокГруппы, Расположение", мПоля, "Изменения", "Горизонтально");
МассивГрупп.Добавить(стГруппировки);
//вместо массива полей можно указать строку значений через зяпятую
МассивГрупп.Добавить(Новый Структура("СоставГруппы, ЗаголовокГруппы", "Ресурс1,Остаток1,Оборот1", "Ресурсы"));
//расположение Вертикально можно не указывать - это вариант группировки по умолчанию
ПараметрыПечати.Вставить("ГруппировкиПолей", МассивГрупп);
ТД_Результат = Обработки.авг_УнивельсальнаяПечатьТаблиц.ПечатьТаблицыЗначений(ТабЗначений, ПараметрыПечати, "Очень важная таблица");
Транспонирование
Иногда результирующая таблица имеет 1-2 строки и больше 20 колонок. Читать такую таблицу очень сложно. Приходится все время скролить вправо. Чтобы облегчить жизнь при таких ситуациях реализована возможность транспонирования (переворота) таблицы.
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("Транспонировать", Истина);
ТД_Результат = Обработки.авг_УнивельсальнаяПечатьТаблиц.ПечатьТаблицыЗначений(ТабЗначений, ПараметрыПечати, "Очень важная таблица");
При перевороте таблицы можно дополнительно настроить имена заголовков строк, включить/выключить нумерацию строк, но делать этого не обязательно.
Если оформление не требуется
Реализована возможность выводить таблицу вообще без оформления. Можно скрыть заголовок, шапку, вообще любое оформление.
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("МакетОформления", "БезОформления");
ПараметрыПечати.Вставить("СкрыватьШапку", Истина);
ТД_Результат = Обработки.авг_УнивельсальнаяПечатьТаблиц.ПечатьТаблицыЗначений(ТабЗначений, ПараметрыПечати, "");
"Полный фарш"
Для понимания количества настроек и объема кода при использовании всего набора ниже пример кода "полного фарша".
ТабЗначений = МояОченьВажнаяТаблица;
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("Заголовок", "Очень важная таблица");
ПараметрыПечати.Вставить("ОписаниеТаблицы", "Пример вывода таблицы с группировками полей.
|Аналитика, Реквизиты, Измерения - горизонтально
|Ресурсы - вертикально");
МассивСтруктур = Новый Массив;
МассивСтруктур.Добавить("ОсновнаяАналитика1,ОсновнаяАналитика2#Аналитика#Горизонтально");
МассивСтруктур.Добавить("Измерение1,Измерение2#Измерения#Горизнонтально");
МассивСтруктур.Добавить("Реквизит1,Реквизит2,Реквизит5#Реквизиты#Горизонтально");
МассивСтруктур.Добавить("Ресурс1,Остаток1,Оборот1#Ресурсы#Вертикально");
ПараметрыПечати.Вставить("ГруппировкиПолей", МассивСтруктур);
ПараметрыПечати.Вставить("Ресурсы", "Ресурс1(Сумма),Остаток1(Максимум),Оборот1(Минимум),Измерение1(КоличествоРазличные)");
ПараметрыПечати.Вставить("КолонкиРасшифровки", ",Измерение2");
ПараметрыПечати.Вставить("МакетОформления", "Зеленый");
ПараметрыПечати.Вставить("НачинатьАвтоГруппировку", Истина);
ПараметрыПечати.Вставить("УровеньЗаголовка", 1);
ПараметрыПечати.Вставить("УровеньТаблицы", 2);
ПараметрыПечати.Вставить("ЦветЗаголовка", Новый Цвет(165,42,42));
ПараметрыПечати.Вставить("Транспонировать", Истина);
ПараметрыТранспонирования = Новый Структура;
ПараметрыТранспонирования.Вставить("ИмяКолонкиИмен", "ИменаКолонок");
ПараметрыТранспонирования.Вставить("ЗаголовокКолонкиИмен", "Показатели");
ПараметрыТранспонирования.Вставить("ПрефиксИмениКолонкиСтрок", "Строка");
ПараметрыТранспонирования.Вставить("ПрефиксЗаголовкаКолонкиСтрок", "Стр.");
ПараметрыТранспонирования.Вставить("НумероватьЗаголовкиСтрок", Истина);
ПараметрыПечати.Вставить("ПараметрыТранспонирования", ПараметрыТранспонирования);
ТД_Результат = Обработки.авг_УнивельсальнаяПечатьТаблиц.ПечатьТаблицыЗначений(ТабЗначений, ПараметрыПечати,);
Слишком сложно. Слишком много настроек. Как это запомнить?
Чтобы было проще разобраться с настройками, в форме обработки добавлено что-то вроде "мастера", где можно выставить галочками нужные параметры и тут же сформировать результат, оценить как будет выглядеть.
По кнопке "Получить код" можно сгенерировать код ваших настроек при помощи "мастера". Останется только скопировать полученный в нужное место алгоритма.
С таблицей понятно, а как же запрос?
С запросом обстоит почти аналогично. На вход в процедуру печати подается объект "Запрос", в котором все должно быть готово для выполнения запроса. Должен быть заполнен текст запроса и установлены все параметры.
При выполнении печати запрос выполняется, его результат выводится в табличный документ. Для вывода результатов запроса используется функция печати таблиц.
Пример кода для печати запроса "по умолчанию"
ТД_Результат = Обработки.авг_УниверсальнаяПечатьТаблицыЗначений.НапечататьЗапрос(Запрос,,"Общий заголовок запроса");
Как видно по рисунку, в запросе имеются две группы таблиц:
- таблицы основного результата (результатов может быть больше одного)
- временные таблицы
Настраивается внешний вид и необходимость вывода каждой группы. Заголовки, цвета, стили и т.д.
В форме также присутствует "мастер" настроек таблиц запроса:
Формирование кода по настройкам запроса также реализовано аналогично таблице.
Практика
В своей работе я постоянно использую этот инструмент. Именно исходя из своих потребностей я его и делал. Сначала использовал для возможности "заглянуть под капот" в сложных расчетах.
Но затем стал использовать все шире. Можно например вывести таблицу результатов обработки объектов не в сообщениях пользователю а в виде "кликабельного" табличного документа, который более удобный и наглядный, чем сообщение.
Можно использовать в отладке следующим образом:
- в отладчике ставим точку останова перед выполнением запроса. Т.е. в том месте, где запрос полностью готов для исполнения
- Используем конструкцию
Обработки.авг_УниверсальнаяПечатьТаблиц.СохранитьТаблицыЗапросаВФайл(Запрос, "C:\TMP\ТаблицыЗапроса.mxl", "ТаблицыЗапроса");
Если статус = истина, то можно смотреть таб.документ по адресу указанного файла.
Подключение и использование
Предполагается использовать обработку как "встроенную", т.е. включенную в состав Вашей конфигурации. Но если конфигурация находится на поддержке, предлагаю подключить расширение. Работать будет одинаково.
Описывать процесс подключения не вижу смысла, т.к. публикация предназначена прежде всего разработчикам, но модераторы Инфостарт часто требуют это, поэтому опишу тезисно:
Для встраивания в конфигурацию необходимо в режиме конфигуратора открыть окно конфигурации, в дереве метаданных найти "Обработки", правой кнопкой мыши вызвать меню "Вставить внешнюю обработку, отчет", затем указать файл обработки.
Для подключения расширения необходимо открыть окно конфигурации, главное меню Конфигурация / Расширения конфигурации. Добавить новое расширение. Оставить имя, синоним, назначение по умолчанию. Далее встать на новое расширение и в меню расширений: Действия / Конфигурация / Загрузить конфигурацию из файла, затем указать файл расширения
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.10.420, 3.1.7.404
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.168.19, 3.0.150.33
- Зарплата и управление персоналом, редакция 3.1, релизы 3.1.31.67, 3.1.28.60