При разработке внешних печатных форм программисты часто сталкиваются с задачей: необходимо, чтобы при нажатии одной кнопки «Печать» пользователю выдавалось сразу несколько документов (например, Счет-фактура и ТОРГ-12). Типичная проблема заключается в том, что при попытке вывести второй макет он либо замещает первый, либо открывается в отдельном окне, что неудобно для пользователя. Разберем пошагово, как правильно объединить макеты, используя механизмы Библиотеки стандартных подсистем (БСП) и платформенные возможности ТабличногоДокумента.
Для начала проанализируем ситуацию, описанную в сообщениях форума. В стандартном механизме БСП используется таблица значений КоллекцияПечатныхФорм. Когда мы вызываем метод УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию, система ищет в этой коллекции строку по идентификатору макета. Если мы передаем один и тот же идентификатор (например, СчетФактураВыданный1137ПечатьВВалюте) дважды, вторая запись просто перезаписывает первую.
Рассмотрим основной способ решения — объединение содержимого нескольких макетов в один общий табличный документ перед его выводом в коллекцию.
Этот метод подходит, если вам нужно, чтобы оба документа выводились «единым полотном» или печатались один за другим в одном задании печати. Основная идея заключается в том, чтобы создать один объект ТабличныйДокумент, последовательно заполнить его данными из разных функций и вставить между ними разделитель страниц.
Рассмотрим пример реализации в процедуре Печать модуля обработки:
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ОбъединеннаяПечатнаяФорма") Тогда
// Создаем один общий табличный документ
ТабДок = Новый ТабличныйДокумент;
// Формируем первый документ (например, Счет-фактуру)
// Предполагаем, что СформироватьПечатнуюФормуСчетФактура возвращает готовый ТабДок
ТабДокСчетФактура = СформироватьПечатнуюФормуСчетФактура(СтруктураТипов, ОбъектыПечати, ПараметрыПечати);
ТабДок.Вывести(ТабДокСчетФактура);
// Добавляем разделитель страниц, чтобы второй макет начинался с нового листа
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
// Формируем второй документ (например, ТОРГ-12)
ТабДокТОРГ12 = СформироватьПечатнуюФормуТОРГ12(СтруктураТипов, ОбъектыПечати, ПараметрыПечати);
ТабДок.Вывести(ТабДокТОРГ12);
// Выводим результат в коллекцию БСП ОДИН РАЗ
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ОбъединеннаяПечатнаяФорма",
"Счет-фактура и ТОРГ-12",
ТабДок
);
КонецЕсли;
Обратите внимание на метод ВывестиГоризонтальныйРазделительСтраниц(). Это метод объекта ТабличныйДокумент, который принудительно разрывает страницу. Без него второй документ начнется сразу под первым, что может привести к «наползанию» таблиц друг на друга.
Если вы хотите, чтобы документы открывались в одном окне предпросмотра, но на разных закладках (как это часто бывает в типовых конфигурациях), вам не нужно объединять их в один ТабДок. Вместо этого нужно зарегистрировать две команды печати или передать два разных идентификатора в коллекцию.
Проанализируем пример кода для реализации вкладок:
// В процедуре ДобавитьКомандыПечати должны быть зарегистрированы оба идентификатора
// ...
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Макет1") Тогда
ТабДок1 = СформироватьМакет1(ОбъектыПечати);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Макет1", "Заголовок 1", ТабДок1);
КонецЕсли;
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Макет2") Тогда
ТабДок2 = СформироватьМакет2(ОбъектыПечати);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Макет2", "Заголовок 2", ТабДок2);
КонецЕсли;
Важный нюанс: чтобы этот код сработал, в функции СведенияОВнешнейОбработке (в случае внешней печатной формы) или в процедуре ДобавитьКомандыПечати модуля менеджера объекта, имена макетов должны быть перечислены через запятую или добавлены как отдельные команды.
Как справедливо замечено в сообщении №24, если мы объединяем документы методом Вывести() в один ТабличныйДокумент, мы ограничены общими настройками печати (масштаб, ориентация страницы, поля) для всего документа целиком. Если один макет должен иметь масштаб 100, а другой — 101, или один должен быть «Портрет», а другой «Ландшафт», обычная склейка не поможет.
Для решения таких задач в 1С предусмотрен объект ПакетОтображаемыхДокументов. Он позволяет объединить несколько независимых табличных документов в один поток для печати, сохраняя индивидуальные настройки каждого документа. Однако стоит учитывать, что БСП в стандартном окне предпросмотра работает именно с табличными документами, а не с пакетами.
Разберем пример создания пакета для прямой печати (без вывода на экран):
Пакет = Новый ПакетОтображаемыхДокументов;
// Добавляем первый документ
Элемент1 = Пакет.Состав.Добавить();
Таб1 = СформироватьПечатнуюФорму1();
Таб1.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
Элемент1.Данные = ПоместитьВоВременноеХранилище(Таб1);
// Добавляем второй документ
Элемент2 = Пакет.Состав.Добавить();
Таб2 = СформироватьПечатнуюФорму2();
Таб2.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
Элемент2.Данные = ПоместитьВоВременноеХранилище(Таб2);
// Печать всего пакета как одного задания
Пакет.Напечатать();
При объединении разных макетов в один ТабличныйДокумент часто возникает проблема «расползания» колонок. Если у первого макета 5 широких колонок, а у второго — 15 узких, то при использовании метода Вывести() колонки второго макета будут подстраиваться под ширину колонок первого.
Чтобы этого избежать, придерживайтесь следующих правил:
ТабличныйДокумент.Вывести() только для тех макетов, которые имеют схожую структуру колонок.Подводя итог, можно сказать: для простого объединения макетов достаточно использовать один общий ТабличныйДокумент и метод ВывестиГоризонтальныйРазделительСтраниц(). Для разделения по вкладкам используйте разные идентификаторы в КоллекцияПечатныхФорм, а для сложного управления настройками печати — ПакетОтображаемыхДокументов.