Довольно часто перед нами встает задача: есть несколько независимых отчетов (например, «Взаиморасчеты», «Продажи», «Расход из кассы»), и мы не хотим видеть их в отдельных окнах. Нам нужно, чтобы они выводились в одном отчете, друг под другом или на одной форме. Давайте разберем по шагам, как можно реализовать вывод нескольких отчетов в одном макете, используя возможности Системы Компоновки Данных (СКД) в 1С.
Это самый простой и штатный вариант, который предлагается сразу при возникновении подобного вопроса. Рассмотрим подробнее, как это работает.
В основной схеме компоновки данных мы переходим на вкладку «Вложенные схемы». Здесь мы добавляем дочерние схемы со своей структурой и источниками. Затем, в настройках основной схемы, в структуру добавляется элемент типа «Вложенный отчет». Связи параметров и полей между отчетами задаются на вкладке «Настройки» конкретного вложенного отчета.
Таким образом, мы получаем один отчет, внутри которого формируются другие. Однако у этого метода есть нюанс: если отчеты имеют разное количество колонок и разную ширину, они могут отображаться некорректно относительно друг друга.
Если нам нужна максимальная гибкость, проанализируем программный вывод. Этот вариант реализуется в модуле менеджера или модуле объекта отчета (например, в процедуре ПриКомпоновкеРезультата), либо в модуле формы.
СхемаКомпоновкиДанных (их можно выгрузить из отдельных макетов одного отчета).Настройки, КомпоновщикМакетаДанных и ПроцессорКомпоновкиДанных.ТабличныйДокумент с помощью объекта ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.При выводе второго и последующих отчетов документ не очищается, а данные дописываются в конец. Альтернативно, можно сначала выводить данные во временные табличные документы, а затем соединять их методом Вывести по вертикали или Присоединить по горизонтали.
Важный нюанс: при программном объединении нескольких схем в один документ результат каждого процессора компоновки должен наполнять единый объект ДанныеРасшифровки. В противном случае, клик мыши по ячейкам последующих отчетов не будет вызывать стандартное окно расшифровки.
Посмотрим на еще один способ: создание нескольких независимых наборов данных в одной схеме СКД.
На вкладке «Настройки» в структуру отчета на корневой уровень добавляем несколько независимых группировок, таблиц или списков друг под другом. Каждая такая ветка будет отвечать за свой набор данных.
Критическое правило: для исключения системных ошибок в каждой ветке структуры нужно строго разделять поля. Нельзя обращаться к полям из разных несвязанных наборов внутри одного элемента структуры. Также следует избегать общих детальных записей со всеми полями без явного указания состава колонок. Если попытаться вывести стандартные «Детальные записи» с автополями, платформа выдаст ошибку об использовании полей из несвязанных наборов. Каждая таблица должна содержать жестко зафиксированный перечень полей только из своего набора.
Если объединение в один макет создает проблемы с читаемостью, может лучше сделать форму с несколькими страницами или областями, и просто сразу сформировать все отчеты? Выясним преимущества этого подхода.
Вместо слияния в один табличный документ, на управляемую форму добавляются несколько независимых элементов с типом «Поле табличного документа» (друг под другом или в виде колонок). По кнопке формирования они заполняются параллельно. Это полностью снимает все проблемы с разной шириной колонок, фиксацией шапок и расшифровкой. Каждый отчет живет своей жизнью, но пользователь видит их на одном экране.
При объединении отчетов в один табличный документ мы часто сталкиваемся с ограничениями платформы:
СоздатьФорматСтрок.ФиксацияСверху табличного документа действует только от верхнего края страницы. При вертикальном размещении нескольких таблиц зафиксировать шапку для нижнего отчета штатно невозможно — при прокрутке будет зафиксирована либо только верхняя шапка первого отчета, либо экран заблокирует всё предыдущее содержимое.Если данные логически близки, отчеты можно объединить на уровне одного набора данных запросом с конструкцией ОБЪЕДИНИТЬ ВСЕ, добавив поле-признак вида операции. Затем эти данные выводятся в штатную кросс-таблицу или группировку СКД.