1с ускорить вывод отчета скд
В настоящее время большинство отчётов пишется с использованием системы компоновки данных. Это удобно для разработчика, но не всегда удобно для пользователя. Чаще всего у пользователя нет ни времени, ни желания разбираться во всех широких возможностях отчёта, ему просто хочется видеть нужные ему настройки на форме и быстро получить желаемый результат. В данной статье я хочу привести пример, как можно вынести на форму настройки системы компоновки данных и программно сформировать отчёт на основе этих настроек.
Когда впервые столкнулась с подобным требованием пользователя пришлось потратить немало времени на изучение вопроса.. Надеюсь, что моя статья окажется полезной и сэкономит кому-нибудь время и силы.
Пример программного заполнения настроек построю на основе отчёта по оборотному регистру накопления Продажи с измерениями: Контрагент, Номенклатура и ресурсами: Количество и Сумма.
Создание отчёта и настройка схемы компоновки данных.
Итак. Создаём новый отчёт. Открываем схему компоновки данных и добавляем новый набор данных запрос. В окне запроса пишем следующий запрос:
РегистрНакопления.Продажи.Обороты(, , Авто , ) КАК ПродажиОбороты
На закладке «Ресурсы» указываем в качестве ресурсов поля КоличествоОборот и СуммаОборот.
На закладке «Параметры» добавим новый параметр «Период» типа СтандартныйПериод. Для параметра «НачалоПериода» в качестве выражения укажем следующее значение: &Период.ДатаНачала, для параметра «КонецПериода» - &Период.ДатаОкончания. Таким образом, мы избавим себя от приведения даты окончания к концу дня и установки каждого параметра в отдельности. Настройку структуры отчёта мы не делаем. Она будет сформирована программно.
На этом настройка схемы компоновки закончена. Переходим к настройке интерфейса.
Настройка пользовательского интерфейса.
Вначале создадим реквизиты отчёта. Они понадобятся нам при создании интерфейса и дальнейшей программной обработке указанных пользователем настроек. Добавляем реквизит Период – тип СтандартныйПериод, Количество – тип Булево, Сумма – тип Булево. Данные реквизиты будут отвечать за переданный параметр Период и за вывод ресурсов отчёта КоличествоОборот и СуммаОборот соответственно. Также нам потребуется табличная часть Группировки с реквизитами Поле – тип Строка и ТипГруппировки – тип Строка. Табличная часть будет отвечать за выбранные группировки при формировании отчёта.
Необходимые реквизиты созданы, теперь создаём форму отчёта.
На форме располагаем следующие элементы:
- Поля ввода для указания периода: ДатаНачала – данные Период.ДатаНачала, Датаокончания - Период.ДатаОкончания, Период – данные Период и кнопку КнопкаВыбораПериода (для кнопки нужно назначить обработчик, открывающий диалог указания периода. Программный код можно посмотреть в прикреплённом внешнем отчёте) .
- Панель с тремя страницами. Первую страницу назовём Отбор и расположим на ней табличное поле с данными КомпоновщикНастроек.Настройки.Отбор. Вторую страницу назовём УсловноеОформление и расположим на ней табличное поле с данными КомпоновщикНастроек.Настройки.УсловноеОформление. Третью страницу назовём Сортировка и расположим на ней табличное поле с данными КомпоновщикНастроек.Настройки.Порядок.
- Табличное поле Группировки, связанное с табличной частью отчёта «Группировки», и добавляем командную панель с указанием в качестве источника действий табличного поля «Группировки». На командную панель добавляем кнопки «Добавить», «Удалить», «Переместить вверх», «Переместить вниз».
- 2 флажка ВыводитьКоличество и ВыводитьСумму, связанные с реквизитами отчёта Количество и Сумма соответственно.
- Поле табличного документа Результат, автоматически созданное при создании формы, оставляем без изменения.
На этом создание пользовательского интерфейса завершено. Переходим к самому интересному – программной части.
Программная работа со схемой компоновки данных.
В первую очередь, необходимо описать какие группировки будут доступны в нашем отчёте. Для этого в модуле объекта создадим экспортные переменные СписокДоступныхПолейГруппировки и СписокДоступныхТиповГруппировки. В теле основной программы заполним их списками значений:
СписокДоступныхПолейГруппировки = Новый СписокЗначений ;
СписокДоступныхПолейГруппировки . Добавить ( "Регистратор" );
СписокДоступныхПолейГруппировки . Добавить ( "Контрагент" );
СписокДоступныхПолейГруппировки . Добавить ( "Номенклатура" );
СписокДоступныхТиповГруппировки = Новый СписокЗначений ;
СписокДоступныхТиповГруппировки . Добавить ( "Иерархия" );
СписокДоступныхТиповГруппировки . Добавить ( "Элементы" );
При открытии формы заполним группировки значениями по умолчанию
НоваяГруппировка = Группировки . Добавить ();
НоваяГруппировка . Поле = "Регистратор" ;
НоваяГруппировка . ТипГруппировки = "Элементы" ;
НоваяГруппировка . Поле = "Контрагент" ;
НоваяГруппировка . ТипГруппировки = "Элементы" ;
НоваяГруппировка = Группировки . Добавить ();
НоваяГруппировка . Поле = "Номенклатура" ;
НоваяГруппировка . ТипГруппировки = "Элементы" ;
Установим доступные списки выбора для полей группировок :
ЭлементыФормы . Группировки . Колонки . Поле . ЭлементУправления . СписокВыбора = СписокДоступныхПолейГруппировки ;
ЭлементыФормы . Группировки . Колонки . ТипГруппировки . ЭлементУправления . СписокВыбора = СписокДоступныхТиповГруппировки ;
Также нам необходимо определить в модуле объекта обработчик ПриКомпоновкеРезультата, в котором будем загружать наши настройки в схему компоновки данных.
// Добавляет колонки (поля ресурсов) в соответствии с флажками на форме
Если Количество И Не НайтиПолеКомпоновки ( "КоличествоОборот" , НастройкиСКД . Выбор . Элементы ) Тогда
ВыбранноеПоле = НастройкиСКД . Выбор . Элементы . Добавить ( Тип ( "ВыбранноеПолеКомпоновкиДанных" ));
ВыбранноеПоле . Использование = Истина ;
ВыбранноеПоле . Заголовок = "Количество" ;
ВыбранноеПоле . Поле = Новый ПолеКомпоновкиДанных ( "КоличествоОборот" );
Если Сумма И Не НайтиПолеКомпоновки ( "СуммаОборот" , НастройкиСКД . Выбор . Элементы ) Тогда
ВыбранноеПоле = НастройкиСКД . Выбор . Элементы . Добавить ( Тип ( "ВыбранноеПолеКомпоновкиДанных" ));
ВыбранноеПоле . Использование = Истина;
ВыбранноеПоле . Заголовок = "Сумма" ;
ВыбранноеПоле . Поле = Новый ПолеКомпоновкиДанных ( "СуммаОборот" );
//Удаляет колонки, соответствующие флажки которых не были отмечены
ПолеКомпоновкиДанных = НастройкиСКД . Выбор . Элементы [ Счетчик ];
Если ПолеКомпоновкиДанных . Поле = Новый ПолеКомпоновкиДанных ( "КоличествоОборот" ) И Не Количество Тогда
НастройкиСКД . Выбор . Элементы . Удалить ( ПолеКомпоновкиДанных );
ИначеЕсли ПолеКомпоновкиДанных . Поле = Новый ПолеКомпоновкиДанных ( "СуммаОборот" ) И Не Сумма Тогда
НастройкиСКД . Выбор . Элементы . Удалить ( ПолеКомпоновкиДанных );
Счетчик = Счетчик + 1 ;
//заполняем поля группировок в соответствии с настройками в табличной части Группировки
НастройкиСКД . Структура . Очистить ();
Для Каждого Группировка Из Группировки Цикл
ЭлементСтруктуры = ЭлементСтруктуры . Структура . Добавить ( Тип ( "ГруппировкаКомпоновкиДанных" ));
ЭлементГруппировки = ЭлементСтруктуры . ПоляГруппировки . Элементы . Добавить ( Тип ( "ПолеГруппировкиКомпоновкиДанных" ));
ЭлементГруппировки . Использование = Истина;
ЭлементГруппировки . Поле = Новый ПолеКомпоновкиДанных ( Группировка . Поле );
Если СписокДоступныхТиповГруппировки . НайтиПоЗначению ( Группировка . ТипГруппировки )=Неопределено Тогда
ЭлементГруппировки . ТипГруппировки = ТипГруппировкиКомпоновкиДанных . Элементы ;
ЭлементГруппировки . ТипГруппировки = ТипГруппировкиКомпоновкиДанных [ Группировка . ТипГруппировки ];
ПолеСортировки = ЭлементСтруктуры . Порядок . Элементы . Добавить ( Тип ( "АвтоЭлементПорядкаКомпоновкиДанных" ));
ПолеСортировки . Использование = Истина;
ВыбранноеПоле = ЭлементСтруктуры . Выбор . Элементы . Добавить ( Тип ( "АвтоВыбранноеПолеКомпоновкиДанных" ));
ВыбранноеПоле . Использование = Истина;
Далее, устанавливаем значения параметров и загружаем заполненные настройки
Настройки . ПараметрыДанных . УстановитьЗначениеПараметра ( "Период" , Период );
КомпоновщикНастроек . ЗагрузитьНастройки ( Настройки );
В алгоритме добавления ресурсов в схему компоновки использовалась функция НайтиПолеКомпоновки. Эта функция определяет, есть ли добавляемое поле в выбранных полях схемы или нет. Если уже есть, то добавлять поле не требуется.
Функция НайтиПолеКомпоновки ( Имя , Коллекция )
Для Каждого ПолеКомпоновкиДанных Из Коллекция Цикл
Если ПолеКомпоновкиДанных . Поле = Новый ПолеКомпоновкиДанных ( Имя ) Тогда
Готово. Настройки схемы компоновки данных заполнены, и отчёт может быть сформирован.
Для того чтобы при обработке расшифровки поля отбора и группировок заполнились в соответствии с выбранным полем нужно самостоятельно описать обработчик расшифровки. Для этого создадим булевский реквизит отчёта ЭтоРасшифровка. Реквизит будет показывать, формируем мы простой отчёт или расшифровываем. Для табличного поля Результат создаём обработчик РезультатОбработкаРасшифровки. В созданном обработчике пишем
Если ДанныеРасшифровки = Неопределено Тогда Возврат КонецЕсли;
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных ( ДанныеРасшифровки , Новый ИсточникДоступныхНастроекКомпоновкиДанных ( СхемаКомпоновкиДанных ));
Настройки = ОбработкаРасшифровки . Выполнить ( Расшифровка );
Если Настройки <>Неопределено Тогда
КомпоновщикНастроек . ЗагрузитьНастройки ( Настройки );
ЭлементыФормы . Результат . Очистить ();
СкомпоноватьРезультат ( ЭлементыФормы . Результат , ДанныеРасшифровки );
А в обработчике ПриКомпоновкеРезультата модуля объекта указываем, что заполнять настройки группировок нужно только в том случае, если это не расшифровка. Таким образом, обработчик ПриКомпоновкеРезультата принимает вид:
Процедура ПриКомпоновкеРезультата ( ДокументРезультат , ДанныеРасшифровки , СтандартнаяОбработка )
Если Не ( Количество ИЛИ Сумма ) Тогда
Сообщить ( "Необходимо выбрать хотя бы один показатель!" );
Настройки = КомпоновщикНастроек . ПолучитьНастройки ();
Если НЕ ЭтоРасшифровка Тогда
Настройки . ПараметрыДанных . УстановитьЗначениеПараметра ( "Период" , Период );
КомпоновщикНастроек . ЗагрузитьНастройки ( Настройки );
Создан отчёт, не требующий заходить в настройки компоновки данных, переключать вкладки и разбираться в настройках структуры отчёта. Все необходимые настройки пользователь видит на форме отчёта. При необходимости можно расширить функционал. Например, сделать сохранение выбранных пользователем настроек, скрывать настройки, если пользователю требуется всегда один вариант и тд.
Также при желании можно сделать отчёт более универсальным. Например, заполнять список полей группировок и настройки по умолчанию из СКД, создать табличную часть параметры и заполнять её параметрами, перечисленными в макете компоновки данных. Таким образом, получится некий шаблон отчёта, на основе которого можно будет легко делать другие отчёты, меняя только запрос, указание ресурсов и список параметров.
Доброго времени суток.
История началась с того, что расчет себестоимости (УПП 1.3.151, используется РАУЗ) стал выполняться больше 24 часов. Запустив из конфигуратора (копии базы) обычное приложения и включив замер производительности, я запустил на ночь расчет себестоимости.
По результатам замера получилось, что больше всего времени (98%) занимается строка в общем модуле УчетЗатрат :
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.Вывести(ПроцессорКомпоновкиДанных)
Изучение алгоритма действий документа в этом модуле дало следующую информацию:
- создается таблица правил распределения затрат , среди колонок которой есть " Схема компоновки данных ", " Настройка базы " и " База распределения ".
- для каждого правила распределения, указанного в настройках (реквизит документа расчет себестоимости выпуска), в котором надо именно распределять затраты, алгоритм вызывает функцию ПолучитьДанныеПоСхемеКомпоновки (в ней содержится проблемная строка кода).
По сути эта процедура с помощью компоновщика макета компоновки данных "генерирует" макет на основании схемы компоновки и настроек компоновки (последний получаются на основе схемы и настройки базы отдельной функцией, затем на нее накладываются параметры для конкретной строки правил ). А потом с помощью процессора компоновки данных и процессора вывода результата компоновки данных в коллекцию значений возвращает коллекцию значений (а именно, таблицу значений), которая присваивается реквизиту строки таблицы правил распределения .
И именно при вызове метода вывести тратиться огромное количество времени.
Чтобы не возиться с модулей я сделал обработку (сначала на обычной, потом на управляемой для выполнения кода на сервере, т.к. модуль "учет затрат" именно серверный), которая по сути проделывает часть алгоритма обработки проведения до проблемного места.
По началу в обработке вывод выполнялся относительно быстро (за 5-10 минут, наверно, не больше). Я уже обрадовался (тогда я выяснил, что возвращается таблица значений с базой, в которой около 32 тыс. строк), но после выходных, вывод стал занимать по 3 часа без результата (я просто закрывал отладку, не дождавшись). Тогда я связал быстрый вывод с перезапуском сервера 1С перед выходными.
Затем, я заменил часть кода, чтобы вывод был поэлементно. И вот тут всплыл интересный (для меня момент), т.к. при всех вызовах функции получение именно третьего элемента процессором вывода .
В обработке я сделал сохранение схемы компоновки в файл для изучения. Загрузив схему компоновки в консоль СКД я обнаружил, что:
1) стоит ограничение на параметры Организация (по ней отбирается одна аналитика для регистра учета затрат), Дата начала и дата окончания (используется для обращения к параметров виртуальной таблицы с оборотами регистра учета затрат).
2) вывод в коллекцию значений выполнялся быстро (5-10 минут по сравнению с несколькими часами).
Попытки найти ответ в интернете ничего не дали: в основном описывается, как программно использовать СКД, но некоторые пользователи тоже жаловались на медленный вывод результата (правда в табличный документ).
Сам в СКД я не силен, поэтому обращаюсь с вопросом: почему в модуле вывод в коллекцию может длиться так долго (тем более по сравнению с консолью), учитывая, что это схема создается на основании "типовой" (есть макет у регистра учет затрат), да и остальной функционал РАУЗа не изменялся.
Я подозревал и платформу (для упп рекомендована 8.3.14, а у нас стоит 8.3.12), но в описании новых версий нет ничего про изменения СКД. Потом было подозрение на сам сервер 1С (учитывая, что модуль выполняется на сервере).
Сталкивался ли кто-нибудь с подобным поведение процессора вывода результата?
Заранее, благодарю. Схему компоновки я прикрепил в файлах.
Многим мало одного примера какого-либо приема разработки, они хотят понимать, где еще на практике можно использовать разобранный способ.
Вопрос
Для чего может использоваться метод поэлементного вывода результата? В каких задачах может это потребоваться? В отладчике считываю данные “ЭлементРезультата“, но никакого смысла не понимаю.
(нажмите, чтобы увеличить картинку)
Ответ
Например, в одном из видеоуроков рассматривается вопрос программной фиксации шапки отчета. Для этого используется поэлементный вывод результата.
Программный код получился вот такой:
Комментарий слушателя
Этот пример работает, но я не понимаю, почему он работает. Что представляет из себя ЭлементРезультата. Сколько их будет в цикле? Что конкретно выводит каждый такой элемент? Почему именно в том элементе, где количество параметров >0, мы добавляем код? Что еще можно получить из перебора этих элементов?
Комментарий тренера
Система компоновки данных выводит результирующий отчет в табличный документ не сразу за одно действие, а определенными порциями. При компоновке выполняются запросы к базе, рассчитываются итоги, учитываются макеты, происходит оформление ячеек отчета, отрисовка ячеек табличного документа и т.д. Все алгоритмы реализованы на уровне платформы, прикладному разработчику недоступны. Ему доступен только тот факт, что вывод отчета происходит порциями, шагами. Каждая порция – это и есть элемент результата компоновки данных. Фактически это специальный вспомогательный объект, при выводе этого элемента в отчет выводится отдельная ячейка, строка, заголовок, описания параметров отчета, описания отборов и т.д.
В элементе результата компоновки данных можно выделить 2 основных свойства. Это Макет (как должна выглядеть выводимая область) и ЗначенияПараметров (какие значения должны принимать параметры в этой области).
Чтобы получить представление, как всё это устроено, можно использовать консоль компоновки от ИР (инструменты разработчика). В ней есть инструмент Исследовать – Элементы результата. Можно посмотреть, как заполнены свойства каждого элемента результата.
Можно провести аналогию с формированием отчета при помощи макета – табличного документа. Сначала мы выводим секцию с заголовком, потом выводим шапку отчета, потом в цикле выводим в отчет строки данных, затем подвал с итоговыми значениями. Каждый такой этап дает нам представление об элементах результата компоновки данных.
Как происходит вывод отчета? При выводе отчета сначала выводится заголовок, описание отборов отчета, шапка отчета. В этих данных нет никаких параметров, все выводимые данные находятся непосредственно в выводимом макете (это можно проверить при помощи инструмента ИР Плоский макет компоновки):
Затем нужно выводить данные самого отчета – строки с данными. И вот тут уже будут заполнены значения параметров.
Значит, у нас есть признак: как только значения параметров становятся заполнены, значит, шапку отчета мы уже вывели, приступаем к выводу строк отчета, но сами строки еще не вывели. Следовательно, это самый подходящий момент, чтобы зафиксировать шапку отчета. Получаем высоту таблицы – именно столько строк в табличном документе и нужно закрепить.
Поток вопросов по СКД в Мастер-группе не прекращается. Сегодняшняя подборка тому подтверждение. Вопросы связаны и с платформенными изменениями самой системы компоновки данных, и с развитием БСП, и с расширением практик применения СКД в современных типовых решениях.
Вопрос №1: “Почему могут быть не доступны варианты отчетов на СКД в пользовательском режиме?”
Несколько раз сталкивался с тем, что варианты отчета, настроенные в конфигураторе, в пользовательском режиме не видны или виден только Основной вариант. Из этого я даже сделал вывод, что больше одного предопределенного варианта делать не имеет смысла. Судя по всему, вывод мой неправильный, в тестовой базе не воспроизводится. Почему могут быть не видны варианты и как это “лечить”?
Ответ
Если такая база базируется на БСП, то тут еще могут влиять механизмы БСП. Например, пользователю по ограничениям доступа недоступен конкретный вариант отчета, поэтому он его и не видит. Также для подсистемы БСП “Варианты отчетов” в общем модуле ВариантыОтчетовПереопределяемый в процедуре НастроитьВариантыОтчетов нужно явно описывать используемые варианты отчетов и запустить приложение с ключом ЗапуститьОбновлениеИнформационнойБазы.
Пример подключения отчетов к подсистеме “Варианты отчетов” есть на странице нашего сайта – Подключение отчетов к подсистеме “Варианты отчетов”. Возможно, в вашем случае какое-то из описанных действий не было выполнено.
Вопрос №2: “Можно ли делать отбор на уровне детальных записей по вычисляемым полям в СКД?”
(нажмите, чтобы увеличить картинку)
Ответ
Ошибка не будет возникать, если для отбора на уровне детальных записей изменить настройку Применение – указать значение “После группировки или для иерархии”:
(нажмите, чтобы увеличить картинку)
Появление ошибки связано с использованием в выражении для вычисляемого поля функции ВычислитьВыражение с указанными параметрами Начало и Конец, которая должна быть вычислена на основании только некоторых записей группировки.
Вопрос №3: “В каком случае можно установить значения параметров в процедуре ПередКомпоновкойМакета модуля менеджера отчета?”
В видео-уроке есть пример, где параметры отчета определяются и устанавливаются в модуле менеджера этого отчета в процедуре ПередКомпоновкойМакета(). Мне непонятно вот что:
- Эта процедура вызывается “сама”? То есть, если я сделаю такую процедуру в модуле менеджера, мне не нужно будет прописывать её вызов? Смущает, что в списке предопределенных возможных процедур нет такой (например, ПриКомпоновкеРезультата в модуле объекта есть). Прилагаю скриншот, поясняющий, какой список имею в виду.
- Переопределение параметров правильно делать именно в этой процедуре? Почему не в процедуре ПриКомпоновкеРезультата модуля объекта или в модуле формы?
- Если у меня внешний отчет, то модуля менеджера в нем нет – значит, такую процедуру я не могу использовать?
Ответ
- В этом видеоуроке демонстрируется типовая конфигурация Бухгалтерия предприятия. Она базируется на Библиотеке стандартных подсистем (БСП), которая содержит отдельную подсистему для работы с отчетами. В этой подсистеме реализовано большое количество универсальных методов. Рассмотрим на примере отчета из видеоурока. В модуле отчета есть код, который вызывает метод общего модуля:
А в общем модуле БухгалтерскиеОтчетыВызовСервера есть функция ПодготовитьОтчет, в которой содержится следующий код:
Следовательно, в модуле менеджера отчета можно доработать компоновщик, например, установить значения параметров. Инициируется этот вызов в процедуре ПриКомпоновкеРезультата.
Подобные фрагменты кода есть и в других конфигурациях, основанных на БСП, например, в УТ 11. Получается, что для доработок отчетов на БСП есть универсальные точки входа, где можно размещать свой код. В отчетах для конфигураций не на БСП этот подход работать не будет.
- Это зависит от того, для какой конфигурации разрабатывается отчет. Если конфигурация создается с нуля, то такой метод из модуля менеджера просто некому будет вызвать. Если конфигурация базируется на БСП, то можно “подсмотреть” в типовых отчетах, как они разработаны. Также в документации по БСП, размещенной на сайте ИТС, можно изучить подробное устройство подсистемы Варианты отчетов.
- Да, во внешних отчетах и обработках в принципе не существует модуля менеджера.
Вопрос №4: “Как вывести изображение в колонтитулах отчета на СКД?”
Подскажите, есть ли возможность в колонтитулах отчета выводить изображение (например, логотип фирмы)?
Ответ
Да, начиная с платформы 8.3.15 появилась возможность добавить картинку в колонтитул.
В конфигураторе это можно сделать в меню Таблица – Настройки печати – Колонтитулы:
(нажмите, чтобы увеличить картинку)
Вопрос №5: “Каким образом можно программно получать настройки отчета на СКД?”
Насколько я понимаю, чтобы учесть значения, заданные пользователем на форме, нужно получать настройки так:
Но во многих видео настройки получаются такой строкой:
И далее по этим настройкам формируется отчет. Почему так? Зачем нам могут быть нужны настройки, которые не содержат значений, заданных пользователем? В каких случаях и каким способом нужно получать настройки?
Ответ
Чтобы решить, какие именно настройки следует использовать, нужно задавать себе вопрос “Отчет с какими настройками мне нужно сформировать для решения поставленной задачи?”
- Чаще всего на практике нужно учитывать пользовательские настройки, значит, используем метод:
В таком случае из компоновщика получаем настройки, которые уже включают в себя и пользовательские, и фиксированные настройки. С этими “результирующими” настройками компонуем отчет. В методе ПриКомпоновкеРезультата в модуле отчетов чаще всего встречается именно этот вариант
- Если нужно взять настройки не из компоновщика, а из схемы компоновки, то воспользуемся настройками по умолчанию:
Такой вариант встречается при компоновке из программного кода, например, когда на форме обработки компоновщик вообще не отображается. В таком случае удобно обратиться к настройкам, описанным непосредственно в схеме компоновки
В ходе выполнения своей повседневной работы столкнулся с интересной клиентской задачей - требовалось результат отчета СКД вывести на форму отчета в разные вкладки формы в разные табличные документы. Как оказалось, информации по такому выводу отчета в интернете маловато, поэтому решил скомпоновать свой опыт решения этой задачи в одной статье.
-Отчет на СКД с кучей независимых друг от друга группировок.
-Форма отчета со страницами и табличными документами результата отчета на них.
Требуется вывести каждую группировку в соответствующий ей табличный документ.
На форме отчета сделал свою кнопку "Сформировать". Событием "ПриКомпоновкеРезультата" не удалось воспользоваться, т.к. из этого события нет доступа к табличным документам на форме отчета.
В процедуре вывода отчета используем следующий код:
Сначала, запихиваем все табличные документы результата в массив и очищаем эти табличные документы.
Затем готовим процессоры вывода и пихаем их в свой массив. Суть метода в том, чтобы отчет скомпоновать один раз, а вот результат отчета вывести с помощью отдельных процессоров вывода для каждой таблицы. В цикле устанавливаем каждому процессору вывода свой табличный документ и начинаем вывод.
Последним этапом является вывод нашего результата отчета. Он происходит в немного модифицированном типовом цикле вывода.
Важный момент. Первый элемент результата СКД содержит все макеты результата, поэтому его нужно вывести во все табличные документы.
Чтобы определить момент, когда нужно перейти в новую таблицу для вывода следующей группировки я между группировками отчета добавил служебную группировку ПереходВДругуюТаблицу и в параметры отчета СКД новый параметр данных Разрыв, который и вывожу в этой служебной группировке. Это сделано, чтобы однозначно определить, что выводимый элемент отчета является сигналом к переходу на новую страницу. Для служебной группировки сделал условное оформление - Цвет фона, Цвет текста и Цвет границы - белый, чтобы не засорять нам отчет. Кстати, этот же метод можно использовать для вставки разрыва страницы после группировки в результате отчета, если для нашей служебной группировке настроить макет и добавить туда горизонтальный разделитель страницы.
Читайте также: