Введение
В текущих типовых конфигурация (УТ, БП, КА и т.д) реализована мощная подсистема вывода печатных форм, наиболее интересный механизм во всем этом разнообразии - это печать комплектов печатных форм. Для этой цели даже были сделаны объекты платформы, ключевой из которых ПакетОтображаемыхДокументов, как раз предназначен для того, чтобы группировать различного рода печатные формы с различными свойствами печати, вывода их на печать или сохранять в файл. Типовая печать комплектов документов как раз и реализована через этот объект, позволяя тем самым печатать документы наборами, а не по порядку (сначала все счета, потом реализации и т.д). Особенно актуальна печать комплектов документов для организаций оказывающих периодические услуги.
Ключевой особенностью типового механизма печати комплектов является то, что при печати комплекта типовая конфигурация отталкивается от конкретного документа и компоновать печатные формы можно именного этого объекта. Скажем если нам надо печатать Накладную и Торг12 в комплекте для реализации проблем нет, но если нам нужно печатать форму сопутствующего документа, например, Счета на оплату, то уже не получится воспользоваться печатной формой именно счета, для этого придется для документ Реализация товаров и Услуг реализовать печать Счета на оплату по документу основанию (счет или заказ), что сделано например в той же Бухгалтерии предприятия. Таким образом, если нужны печатные формы других документов, то необходима какая-либо связь между ключевым документом, для которого печатается комплект, и зависимыми документами, а также реализация соответствующей печатной формы для ключевого документа, но печатающая зависимый документ.
Данный подход, на мой взгляд, не очень удобен как раз из-за того, что необходимо реализовывать своего рода адаптеры для печатных форм сопутствующих документов. Ниже будет показано как на типовом механизме реализовать печать комплекта документов, формируя печатные формы от различных документов.
Основные моменты типового механизма печати
В общем случае процесс печати комплектов происходит так: выбирается объект (реализация, счет), настраивается комплект печати в форме НастройкаПечатиКомплекта, где выбираются Команды печати, и эта информация передается в форму ПечатьДокументов, которая и вызывает все необходимые процедуры по формированию печатных форм, подготавливает Коллекцию печатных форм, собирает их в комплекты и выводит на печать. Основные объекты:
1. Команды печати, которые указывают какую форму необходимо реализовать и какой объект (обработчик) будет это делать. Например, для каждого документа в типовых конфигурациях в модуле менеджера есть экспортная процедура ДобавитьКомандыПечати, которая и указывает команды печати для документа. Пример из документа реализации;
2. Общая форма НастройкаПечатиКомплекта, в которой можно указать, какие и в каком количестве печатать формы.Особенность этой формы в том, что она при создании собирает все имеющиеся формы для конкретно указанного объекта при открытии, поэтому воспользоваться ей не удастся и придется подобную форму реализовывать самим.
3. Общая форма ПечатьДокументов, где происходит вывод всех подготовленных форм. Данная форма реализована уже более универсально в отличии от НастройкаПечатиКомплекта и может приниматься как информацию о выбранных Командах печати для однотипных объектов и в дальнейшем вызывать весь необходимый код для их формирования, так и получаться уже подготовленный список любый Табличных документов и выводить их. Как раз то, что нужно и этот объект не придется переделывать.
Реализация формы настройки комплектов печати
Уже было отмечено, что типовой формой НастройкаПечатиКомплекта не воспользоваться и необходимо делать свою. По сути она очень простая: выводить необходимый нам список элементов и возвращает выбранные элементы. В получении списка Команд печати объекта поможет функция УправлениеПечатью.КомандыПечатиФормы, которая принимает имя формы, для которого определяется Команда печати. Имена формы могут быть различные, но практически все команды включаются для списка и имени формы "ФормаСписка".
Получение списка команд для интересующих нас объектов можно получить так:
мДанные = Новый Массив;
мДанные.Добавить(Метаданные.Документы.СчетНаОплатуПокупателю);
мДанные.Добавить(Метаданные.Документы.РеализацияТоваровУслуг);
мДанные.Добавить(Метаданные.Документы.АктСверкиВзаиморасчетов);
КомандыПечати = УправлениеПечатью.КомандыПечатиФормы("ФормаСписка", мДанные);
структура Команды печати выглядит следующим образом:
Для формы выбора на по сути нужно Представление печатной формы и УникальныйИдентификатор, чтобы после выбора нужных форм найти необходимую Команду печати. Примерный вид формы, который получился:
Реализация печати
Как отмечалось ранее, общая форма ПечатьДокументов, сама формирует табличные документы, но только для одного типа метаданных, поэтому сформировать эти печатные формы предстоит самим, опять же с помощью уже имеющейся функции в конфигурации УправлениеПечатью.СформироватьПечатныеФормы. Причем в качестве параметров ей передаются данные из полученных ранее команд печати, примерный код для однотипных данных такой:
// ДокументДляПечати - Ссылка на документа, по которому нужно получить печатные формы
мОбъектыПечати = Новый Массив();
мОбъектыПечати.Добавить(ДокументДляПечати);
// КомандыПечати - переменная, полученная на предыдущем этапе
// ВыбранныеКоманды - коллекция команд из КомандПечати
Для Каждого КомандаПечати Из ВыбранныеКоманды Цикл
ПечатнаяФорма = УправлениеПечатью.СформироватьПечатныеФормы(КомандаПечати.МенеджерПечати, КомандаПечати.Идентификатор, мОбъектыПечати, КомандаПечати.ДополнительныеПараметры);
КонецЦикла;
Полученная переменная ПечатнаяФорма содержит в себе структуру, которую можно уже передавать в общую форму ПечатьДокументов и получить результат. Однако нам надо собрать данные от разнотипных данных и собрать потом все это в одну переменную и передать уже в форму печати. Разберем структуру переменной ПечатнойФормы
Ключевыми тут являются два параметра КоллекцияПечатныхФорм и ОбъектыПечати, причем они связаны между собой следующим образом: список ОбъектыПечати содержит в себе информацию о привязки печатаемого документа к области печати Табличного документа. То есть результат печати одной печатной формы нескольких однотипных объектов состоит в том, что формируется один Табличный документ, который содержит в себе столько областей сформированных форм, сколько документов печатается, а соответствие этих областей к документам указано в переменной ОбъектыПечати. Ниже показаны области Табличного документа из переменной КоллекцияПечатныхФорм:
Таким образом, типовой механизм формирует коллекцию печатных форм и по объекту печати группирует сформированные печатные формы, которые представляют собой области в табличном документе с тем же именем, что и в объектах печати или по-другому, для одного печатаемого документа есть псевдоним, например, Документ_1, в различных сформированных табличных документах есть для него печатная форма с именем области Документ_1.
Приходим к следующему:
1. Формируем печатные формы для комплекта по всем входящим в комплект документ, в нашем случае Счет, Реализация и Акт сверки.
2. Собираем полученные печатные формы в одну КоллекцияПечатныхФорм и все документы в ОбъектыПечати при этом необходимо вести свою нумерацию областей Документ_* и соединять все полученные табличные документ в один. Группировка табличных документов производится по одному объекту-документы, в моем примере их 3-и, придется из них выбрать один, в данном случае не важно какой, важно чтобы он был один и тот же для всех своих областей, из которых и сложится комплект печати.
3. Передаем полученные параметры в общую форму ПечатьДокументов и получаем результат.
Примерный код:
// На Сервере формируем все необходимые данные
// Общие коллекции
Общая_Коллекция = УправлениеПечатью.СоздатьКоллекциюКомандПечати();
Общая_Объекты = Новый СписокЗначений;
// Содержит основные объекты для вывода, необходим для общей формы ПечатьДокументов, по сути повторяет Общая_Объекты
мПараметрКоманды = Новый Массив;
ОбщийИндекс = 0; // Индекс для формирвоания областей Документ_1, Документ_2 и т.д.
Для Каждого СтрокаФормирования Из Объект.Комплекты Цикл
// СтрокаФормирования - в строке документы, в моем случае три: Счет, Реализации, Акт сверки
ОбщийИндекс = ОбщийИндекс + 1;
ДокументГруппировки = СтрокаФормирования.Счет;
мПараметрКоманды.Добавить(ДокументГруппировки);
// ВыбранныеФормы - полученные выбранны формы, предствляет собой Уникальный идентификатор команды печати и количество копий для печати
Для Каждого ПечатныяФорма Из ВыбранныеФормы Цикл
// Функция определяет по выбранной печатной форме, какой документ печатать (счет, реализация и т.д.)
ДокументДляПечати = ОпределитьДокументДляПечати(СтрокаФормирования, ПечатныяФорма);
Если ДокументДляПечати <> Неопределено Тогда
ОписаниеКоманды = ПолучитьКоманду(ПечатныеФормы, ПечатныяФорма.УникальныйИдентификатор); // Функция вернет по идентификатору нужную команду, ПечатныеФормы - полученные ранее все команды печати
// Функция ДобавитьТабличныеДокументы формирует печатную форму и помещает результат в общую коллекцию
// с правильным формирование областей и привязкой к к ключевому документу ДокументГруппировки
ДобавитьТабличныеДокументы(Общая_Коллекция, Общая_Объекты, ДокументДляПечати, ПечатныяФорма, ОписаниеКоманды, ПечатныяФорма.Копий, ОбщийИндекс, ДокументГруппировки);
КонецЕсли;
КонецЦикла;
КонецЦикла;
//....
// На клиенте все полученные данные преобразуем при необходимости и подставляем в общую форму ПечатьДокументов
// конвертируем Таблицу значений Общая_Коллекция в массив структур мОбщая_Коллекция, так как открывать форму надо на клиенте
// данная настройка печати нужна для того, чтобы поставлялись указанные нами количество копий печати
ПараметрыПечати = Новый Структура("ПереопределитьПользовательскиеНастройкиКоличества", Истина);
// собираем структуру для общей формы ПечатьДокументов
КомплектыПечати = Новый Структура("КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрКоманды, ПараметрыПечати", мОбщая_Коллекция, Общая_Объекты, мПараметрКоманды, ПараметрыПечати);
// открываем форму с нашими комплектами
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", КомплектыПечати);
Результат работы в типовой форме печати:
В приложенной к статье обработка демонстрирует описанный подход на примере трех документов (счет, реализация, акт сверки) печать комплектов печатных форм в конфигурации Бухгалтерия предприятия 3.0.57. Тестировал так же на Управлении торговлей 11.4.2 немного видоизмененный вариант в части документов (документ счет и акт сверки называется отлично от конфигурации БП).