В процессе работы с современными конфигурациями 1С на управляемых формах (такими как УТ 11, ERP 2.x или КА 2.x) аналитики и программисты часто сталкиваются с необходимостью быстро «склеить» данные из двух и более отчетов. В старой доброй УПП 1.3 для этих целей существовал мощный инструмент «Произвольный отчет». Разберем, как реализовать аналог подобного функционала сегодня и почему стандартный «Универсальный отчет» не всегда справляется с этой задачей.
Рассмотрим ситуацию: нам нужно сопоставить продажи из одного типового отчета с остатками из другого. Казалось бы, можно воспользоваться штатным УниверсальнымОтчетом, изменив в нем схему компоновки (СКД). Однако мы часто натыкаемся на сложности, которые заставляют использовать инструменты для склеивания отчетов «на лету»:
ПриКомпоновкеРезультата или ПередКомпоновкой), который динамически меняет текст запроса. Например, чтобы получить движения товаров с резервами нарастающим итогом, требуется сложная обработка данных, и прямое использование СКД такого отчета в другом месте не даст корректного результата.СКД требует от пользователя навыков программиста. Особенно это актуально, когда нужно выполнить сравнение товаров на складах и товаров организаций для поиска ошибок в учете при ордерной схеме.Проанализируем альтернативный подход, предложенный в сообществе. Вместо того чтобы пытаться соединить запросы на уровне базы данных, мы можем применить методику объединения через внешние наборы данных, используя в качестве источника уже сформированный табличный документ (результат отчета). Это позволяет «подцепить» данные именно в том виде, в котором их вывел типовой отчет со всеми программными расчетами.
Рассмотрим алгоритм работы такого инструмента:
ТабличногоДокумента) парсятся и преобразуются во временные таблицы значений.ВнешниеНаборыДанных.Номенклатуре или Контрагенту).Для программной реализации такого механизма в расширении или обработке можно использовать универсальный конструктор соединений, позволяющий настраивать связи между результатами разных отчетов. Это особенно полезно, когда требуется сравнение товаров на складах организаций и себестоимости для выявления расхождений. Выясним, как передать подготовленную таблицу в компоновщик:
// Создадим структуру для внешних наборов данных
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаПродаж", ТЗ_Продажи);
ВнешниеНаборыДанных.Вставить("ТаблицаОстатков", ТЗ_Остатки);
// Инициализируем компоновку
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
Важно помнить, что при использовании БСП 3.0 и выше, подобные решения, такие как Произвольный отчет 2.0, лучше оформлять в виде расширения. Это позволит сохранить поддержку конфигурации и использовать механизм ВариантовОтчетов для сохранения настроек «склейки».
Посмотрим на конкретные сценарии, где этот метод незаменим:
Таким образом, использование «Аналога произвольного отчета» через обработку сформированных таблиц является эффективным способом обхода ограничений типовых механизмов 1С, позволяя аналитикам самостоятельно конструировать сложные отчеты без изменения кода системы.