При выделении нескольких документов в списке и нажатии кнопки печати платформа 1С по умолчанию выводит печатную форму для каждого документа по отдельности. В результате на печать выводится серия документов, где перед табличной частью каждого из них повторяется заголовок и шапка. Однако на практике часто возникает задача сформировать единый сводный документ, в заголовке которого будут перечислены номера всех выбранных накладных через запятую, а табличная часть будет содержать общий список номенклатуры.
Разберем подробно причины такого поведения программы и рассмотрим по шагам, как переработать алгоритм для формирования единого табличного документа.
Проанализируем стандартную логику механизмов печати (включая Библиотеку Стандартных Подсистем). При групповой печати процедура формирования печатной формы либо вызывается поочередно для каждого документа из массива переданных ссылок, либо собирает итоговый табличный документ путем последовательного присоединения сформированных страниц с использованием вызова ВывестиГоризонтальныйРазделительСтраниц().
Стандартные макеты спроектированы под один документ: область шапки с номером и датой выводится строго перед табличной частью соответствующего документа. Для получения сводной печатной формы требуется создать отдельную (или внешнюю) печатную форму и изменить логику выборки и вывода данных.
Рассмотрим порядок действий для реализации сводной формы, принимающей на вход массив документов:
МассивСсылок.СтрСоединить() или обходом выборки. Выводим заголовок один раз в начале табличного документа.СГРУППИРОВАТЬ ПО).Посмотрим на пример реализации функции формирования печатного документа на сервере:
Функция СформироватьСводнуюПечатнуюФорму(МассивДокументов, ОбъектыПечати) Экспорт
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.АвтоМасштаб = Истина;
Макет = ПолучитьМакет("МакетСводный");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
// 1. Получаем список номеров документов для заголовка
ЗапросНомера = Новый Запрос;
ЗапросНомера.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Номер КАК Номер,
| РеализацияТоваровУслуг.Дата КАК Дата
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Ссылка В(&МассивДокументов)
|УПОРЯДОЧИТЬ ПО
| Дата ВОЗРАСТАНИЕ";
ЗапросНомера.УстановитьПараметр("МассивДокументов", МассивДокументов);
ВыборкаНомеров = ЗапросНомера.Выполнить().Выбрать();
МассивНомеров = Новый Массив;
Пока ВыборкаНомеров.Следующий() Цикл
МассивНомеров.Добавить(СокращенныйНомер(ВыборкаНомеров.Номер));
КонецЦикла;
ОбластьЗаголовок.Параметры.НомераДокументов = СтрСоединить(МассивНомеров, ", ");
ТабличныйДокумент.Вывести(ОбластьЗаголовок);
ТабличныйДокумент.Вывести(ОбластьШапкаТаблицы);
// 2. Выбираем товары из всех документов
ЗапросТовары = Новый Запрос;
ЗапросТовары.Текст =
"ВЫБРАТЬ
| ДокументТабличнаяЧасть.Номенклатура КАК Номенклатура,
| СУММА(ДокументТабличнаяЧасть.Количество) КАК Количество,
| СУММА(ДокументТабличнаяЧасть.Сумма) КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК ДокументТабличнаяЧасть
|ГДЕ
| ДокументТабличнаяЧасть.Ссылка В(&МассивДокументов)
|СГРУППИРОВАТЬ ПО
| ДокументТабличнаяЧасть.Номенклатура";
ЗапросТовары.УстановитьПараметр("МассивДокументов", МассивДокументов);
ВыборкаТоваров = ЗапросТовары.Выполнить().Выбрать();
Пока ВыборкаТоваров.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(ВыборкаТоваров);
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
// 3. Выводим подвал
ТабличныйДокумент.Вывести(ОбластьПодвал);
Возврат ТабличныйДокумент;
КонецФункции
При выгрузке данных в единый ТабличныйДокумент следует обратить внимание на следующие технические детали:
СоздатьФорматСтрок() для областей печатной формы, чтобы таблицы не деформировались.ТабличныйДокумент целиком. Убедитесь, что параметры вывода установлены до возврата готовой формы.