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