Свести два отчёта 1С в один: СКД, запрос и табличный документ
Содержание
Объединить два отчёта в 1С можно тремя путями: собрать оба набора данных в одной схеме компоновки (СКД), склеить их запросом с ОБЪЕДИНИТЬ ВСЕ в обработке или внешнем отчёте либо вывести результаты друг за другом в один табличный документ и выгрузить в Excel. Выбор зависит от того, нужны ли итоги и группировки или достаточно просто свести строки в одну таблицу.
Частая ошибка — пытаться «слить» два готовых отчёта на уровне печатных форм, копируя ячейки вручную. При любом изменении периода или фильтра всё приходится делать заново. Правильнее объединять данные на уровне источника: тогда сводный отчёт пересобирается одной кнопкой.
Разберём каждый способ по шагам, когда он уместен, и как поставить формирование сводного отчёта на автомат.
Что именно вы объединяете: строки или колонки
Перед тем как лезть в конструктор, уточните задачу. От этого зависит механизм.
Возможны два принципиально разных случая:
- 🔗 Склейка строк (по вертикали). Отчёты однотипные: одинаковый состав колонок, но разные источники. Например, продажи по одному складу и по другому, или приход и расход в одной ведомости. Строки одного подставляются под строки другого.
- 🧩 Склейка по ключу (по горизонтали). Отчёты показывают разные показатели по одному и тому же объекту. Например, план по номенклатуре из одного регистра и факт из другого. Здесь строки сопоставляются по общему полю (номенклатура, контрагент, период), а колонки показателей идут рядом.
Определите это до начала работы: от выбора зависит, нужен вам ОБЪЕДИНИТЬ или связь (соединение) по ключу.
Простой пример. Нужен отчёт «приход и расход по контрагентам». Приход и расход — это однотипные строки (контрагент, сумма) из разных регистров, их склеивают по вертикали. А вот отчёт «план продаж и фактические продажи по номенклатуре» — это разные показатели по одному объекту, их сопоставляют по ключу «номенклатура» и ставят в соседние колонки.
Заодно проверьте совместимость источников:
- Совпадают ли типы ключевых полей. Если в одном отчёте контрагент — это ссылка, а в другом строка с наименованием, сопоставление по ключу не сработает без приведения типов.
- Одинаков ли период и единицы измерения. Суммы в рублях и в валюте нельзя складывать без пересчёта.
- Нет ли задвоения. Если оба источника уже содержат одни и те же движения, итог завысится вдвое.
Объединение двух отчётов через СКД
Это основной способ для штатных отчётов. Один отчёт на СКД умеет тянуть данные сразу из нескольких запросов и показывать их в общих группировках.
На вкладке Наборы данных схемы компоновки доступны три типа набора: «Запрос», «Объект» и «Объединение». Для склейки строк нужен именно набор-объединение.
Порядок действий:
- Откройте схему компоновки данных внешнего отчёта в конфигураторе (или в режиме «1С:Предприятие», если отчёт настраивается там).
- На вкладке Наборы данных добавьте набор типа Объединение.
- Внутрь него вложите два набора-запроса — по одному на каждый исходный отчёт.
- Проследите, чтобы имена полей (псевдонимы) совпадали. Поля с одинаковым именем сольются в одну колонку; поля, которых нет во втором запросе, заполнятся пустыми значениями.
Если в одном наборе поле называется Сумма, а в другом СуммаДокумента, в объединённой таблице будут две разные колонки. Приведите псевдонимы к одному имени через КАК.
Чтобы различать источник строки, добавьте в каждый запрос поле-признак:
ВЫБРАТЬ
Продажи.Контрагент КАК Контрагент,
Продажи.СуммаОборот КАК Сумма,
"Продажи" КАК Источник
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Закупки.Контрагент,
Закупки.СуммаОборот,
"Закупки"
ИЗ
РегистрНакопления.Закупки.Обороты КАК Закупки
Поле Источник затем выносится в группировку или в отбор — так в одном отчёте видно и то, и другое, с возможностью свернуть по источнику.
Если же нужна склейка по ключу (план и факт рядом), объединение не подходит. Делайте два отдельных набора-запроса и свяжите их на вкладке Связи наборов данных: укажите источник, приёмник и поле связи. Это аналог левого соединения — у приёмника могут появиться пустые значения там, где нет пары.
ОБЪЕДИНИТЬ ВСЕ сохраняет дубли строк, ОБЪЕДИНИТЬ без ВСЕ их схлопывает и работает медленнее. Для отчётов почти всегда нужен вариант с ВСЕ, а свёртку делайте группировками компоновки.
Запрос с ОБЪЕДИНИТЬ ВСЕ в обработке или внешнем отчёте
Когда данные нужно не просто показать, а обработать — переложить в таблицу значений, пересчитать, выгрузить — удобнее собрать всё одним запросом в модуле.
Способ подходит для внешних обработок и для отчётов без СКД, где результат строится кодом.
Базовый приём — временные таблицы и ОБЪЕДИНИТЬ ВСЕ в финальной выборке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура КАК Номенклатура,
| Количество КАК План,
| 0 КАК Факт
|ПОМЕСТИТЬ ВседанныеПлан
|ИЗ
| РегистрСведений.ПланПродаж КАК ПланПродаж
|;
|ВЫБРАТЬ
| ПродажиОбороты.Номенклатура,
| 0,
| ПродажиОбороты.КоличествоОборот
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты";
Чтобы показатели встали рядом по номенклатуре, оберните объединение во внешний запрос с группировкой:
"ВЫБРАТЬ
| Данные.Номенклатура КАК Номенклатура,
| СУММА(Данные.План) КАК План,
| СУММА(Данные.Факт) КАК Факт
|ИЗ
| (ВЫБРАТЬ ... ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ...) КАК Данные
|СГРУППИРОВАТЬ ПО
| Данные.Номенклатура"
Дальше результат выгружается в таблицу значений и обрабатывается как обычно:
РезультатЗапроса = Запрос.Выполнить();
ТаблицаИтог = РезультатЗапроса.Выгрузить();
Если один источник — это документ или объект метаданных, а не регистр, добавьте его как набор типа «Объект» или выгрузите в таблицу значений заранее и передайте в запрос через ПоместитьВременнуюТаблицу менеджера временных таблиц.
Бывает, что данные двух отчётов в один запрос свести нельзя: разные базы, разные механизмы, часть приходит из внешнего файла. Тогда объединяют две готовые таблицы значений по ключу уже в коде.
Логика такая: у первой таблицы добавляете колонки для показателей второй, затем по каждой строке ищете пару во второй таблице методом Найти по ключевому полю и переносите значения. Строки второй таблицы, которым не нашлось пары в первой, добавляете в конец. Так вы получаете горизонтальную склейку (план и факт рядом) там, где единый запрос невозможен.
Внешний отчёт или обработку затем подключают к базе в разделе Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки. Это штатный механизм типовых конфигураций на управляемых формах — он не требует снимать базу с поддержки.
Сведение двух отчётов в одном табличном документе
Иногда перестраивать источники нельзя или некогда, а два готовых отчёта нужно показать на одном листе и отдать в Excel. Тогда работают на уровне табличного документа.
У табличного документа есть два метода склейки:
Вывести()— добавляет область снизу, под уже выведенным. Так отчёты встают один под другим.Присоединить()— добавляет область справа, в те же строки. Так отчёты встают рядом по горизонтали.
Простейший вариант — сформировать оба отчёта в свои табличные документы, а потом слить в третий:
ИтоговыйДокумент = Новый ТабличныйДокумент;
ИтоговыйДокумент.Вывести(ПервыйОтчёт.ПолучитьОбласть());
ИтоговыйДокумент.Вывести(ВторойОтчёт.ПолучитьОбласть());
Для вывода рядом в тех же строках используйте Присоединить() вместо второго Вывести().
Готовый документ сразу выгружается в файл для аналитики:
ИтоговыйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Пользователь может сделать то же вручную: сформировать первый отчёт, затем через Файл → Сохранить как выгрузить в .xlsx, повторить со вторым и свести листы в Excel. Но это ровно та ручная склейка, от которой мы уходим: при смене периода всё повторяется заново.
Склейка табличных документов не пересчитывает итоги. Если в двух отчётах есть строки «Итого», в сводном документе их будет две, и общей суммы не появится. Для настоящей консолидации с общими итогами возвращайтесь к СКД или запросу.
Какой способ выбрать под вашу задачу
Три механизма закрывают разные ситуации. Коротко — по тому, что на выходе.
| Способ | Когда подходит | Что на выходе | Сложность |
|---|---|---|---|
| СКД (объединение/связи) | Штатный отчёт, нужны группировки и итоги | Интерактивный отчёт с настройками | Средняя |
| Запрос в обработке | Данные надо пересчитать или выгрузить | Таблица значений под дальнейшую логику | Высокая |
| Табличный документ | Два готовых отчёта свести на один лист | Готовая печатная форма, Excel | Низкая |
Ошибки при консолидации отчётов
Здесь собраны только проблемы, специфичные для объединения, — не повтор шагов выше.
🔸 Задвоение сумм. Самая частая. Возникает, когда оба источника уже включают пересекающиеся движения, либо когда при связи наборов данных одной строке приёмника соответствует несколько строк источника. Проверяйте: сумма сводного отчёта должна равняться сумме двух исходных по отдельности.
🔸 Разъехавшиеся колонки в объединении. Если псевдонимы полей в двух запросах не совпали, данные встают в разные колонки, а не в одну. Внешне отчёт «теряет» половину сумм. Лечится приведением имён через КАК.
🔸 Несовпадение типов в связи. Связь по полю, где в одном наборе ссылка, а в другом строка, молча даёт пустой результат — пары просто не находятся. Приводите ключи к одному типу в запросе.
🔸 Потерянные строки при обычном ОБЪЕДИНИТЬ. Без ВСЕ одинаковые строки схлопываются в одну. Если в данных есть легитимные повторы, часть из них исчезнет.
🔸 Двойные итоги в табличном документе. Склейка печатных форм переносит и строки «Итого» из каждого отчёта. Общего итога при этом не считается — он только визуально «складывается» в голове у читателя.
🔸 Разные периоды и валюты. Складывать показатели за разные периоды или в разных валютах без явного приведения нельзя — итог получится бессмысленным.
Автоматизация и формирование по расписанию
Если сводный отчёт нужен регулярно, настройте его формирование без ручного запуска.
Для внешнего отчёта или обработки, собирающей данные кодом, подойдёт регламентное задание. Процедуру формирования выносят в общий модуль, а задание запускает её по расписанию на сервере. Готовый табличный документ при этом сохраняют в файл или вкладывают в письмо.
В типовых конфигурациях на БСП есть штатная рассылка отчётов. Путь обычно: Администрирование → Печатные формы, отчёты и обработки → Рассылки отчётов (название пункта может немного отличаться в разных релизах). В рассылку добавляют один или несколько отчётов, задают получателей, формат вложения (.xlsx, .pdf, .mxl) и расписание — ежедневно, по дням недели, по месяцам.
Порядок настройки рассылки:
- Создайте новую рассылку и добавьте в неё сводный отчёт (внешний отчёт предварительно подключается как дополнительный).
- Укажите получателей — пользователей или контактные адреса.
- Выберите формат вложения и способ доставки: письмо, каталог на диске или сетевой ресурс.
- Задайте расписание и включите рассылку.
Регламентное задание и рассылка выполняются на сервере под фоновым сеансом. Проверьте, что у этого сеанса достаточно прав на все объекты обоих отчётов, иначе часть данных вернётся пустой без видимой ошибки.
Частые вопросы
Можно ли объединить отчёт на СКД и обычный отчёт без схемы компоновки?
Чем объединение наборов данных отличается от связи наборов?
ОБЪЕДИНИТЬ ВСЕ). Связь сопоставляет строки по общему полю и ставит показатели рядом (склейка по горизонтали, аналог соединения).Почему после объединения часть сумм пропала?
КАК в обоих запросах.Как вывести два отчёта рядом, а не один под другим?
Присоединить() вместо Вывести() — область добавится справа, в те же строки.