--- title: Подключение к подсистеме Печать slug: общие-бсп-стандартные-подсистемы-3-1-10-печать/подключение-к-подсистеме-печать --- ## Настройка объектов метаданных В процедуре `ПриОпределенииНастроекПечати` общего модуля `УправлениеПечатьюПереопределяемый` перечисляем менеджеры объектов, которые нужно подключить: ```bsl // Переопределяет настройки подсистемы. // // Параметры: // Настройки - Структура: // * ИспользоватьПодписиИПечати - Булево - при установке значения Ложь отключается возможность установки подписей // и печатей в печатных формах. // * СкрыватьПодписиИПечатиДляРедактирования - Булево - удалять рисунки подписей и печатей табличных документов при // снятии флажка "Подписи и печати" в форме "Печать документов", для того, // чтобы они не мешали редактировать текст, находящийся под ними. // * ПроверкаПроведенияПередПечатью - Булево - признак необходимости проверки проведенности // документов перед печатью, является значением по умолчанию для команды печати // см. УправлениеПечатью.СоздатьКоллекциюКомандПечати. // Для непроведенных документов команда печати не выполняется. // Если параметр не указан, то проверка проведенности не выполняется. // * ОбъектыПечати - Массив - менеджеры объектов с процедурой ПриОпределенииНастроекПечати. // Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт ... Настройки.ОбъектыПечати.Добавить(Справочники._ДемоКонтрагенты); Настройки.ОбъектыПечати.Добавить(Справочники._ДемоОрганизации); ... Настройки.ОбъектыПечати.Добавить(Документы._ДемоСчетНаОплатуПокупателю); Настройки.ОбъектыПечати.Добавить(Документы._ДемоРасходныйКассовыйОрдер); ... КонецПроцедуры ``` ## Настройка модуля менеджера В модуле менеджера объектов, подключаемых к подсистеме добавляются методы `ПриОпределенииНастроекПечати` и `ДобавитьКомандыПечати`: ```bsl // СтандартныеПодсистемы.Печать // Переопределяет настройки печати для объекта. // // Параметры: // Настройки - см. УправлениеПечатью.НастройкиПечатиОбъекта. // Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт Настройки.ПриДобавленииКомандПечати = Истина; КонецПроцедуры // Определяет список команд печати. // // Параметры: // КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати // Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт // в зависимости от варианта печати - автоматического "нового" или традиционного. См. ниже КонецПроцедуры // Конец СтандартныеПодсистемы.Печать ``` ## Подключение форм к подсистеме `Подключаемые команды` Чтоыб были выведены подключаемые команды печати необходимо подключить формы к подсистеме `Подключаемые команды` ## Автоматическое формирование печатной формы ### Макет табличного документа
ВАРИАНТ 1. Без конфигуратора Данный способ позволяет создать печатную форму исключительно в пользовательском режиме. Команды печати в таком случае создавать не нужно В пользовательском режиме открываем `Администрирование` -> `Печатные формы, отчеты и обработки` -> `Макеты печатных форм` ![Изображение](/bsp-pechat/1.png) В конструкторе макета создаем необходимый вид печатной формы ![Изображение](/bsp-pechat/2.png) > ВАЖНО! Параметры указываются в [квадратных скобках], функции также. Например, чтобы для поля `Дата` применить функцию `Формат`, в ячейку нужно записать строку вида `[Формат([Дата], "ДФ=дд.ММ.гггг")]`. > Также не нужно никак выделять строки табличных частей - просто выводим параметры ТЧ в ячейки, система сама определит, что такие строки нужно повторять ![Изображение](/bsp-pechat/6.png) С помощью команд редактора можно запустить предпросмотр или изменить образец: ![Изображение](/bsp-pechat/3.png) Включаем видимость печатной формы ![Изображение](/bsp-pechat/4.png) Все, после записи макета команда печати будет доступна в формах объекта
ВАРИАНТ 2. Встраивание в конфигуратор - Создаем макет печатной формы также, как и в **варианте 1**, только **не включаем видимость**. Созданный макет нужно сохранить в формате `MXL`, открыть в конфигураторе и скопировать **все** содержимое в созданный макет ![Изображение](/bsp-pechat/5.png) - В `модуле менеджера` реализуем процедуру `ДобавитьКомандыПечати`: ```bsl Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт Команда = КомандыПечати.Добавить(); Команда.МенеджерПечати = "УправлениеПечатью"; // ВАЖНО! Менеджер - сама подсистема Команда.Идентификатор = "Документ.МойДокумент.ПФ_MXL_ПечатнаяФормаМоегоДокумента"; // Полный путь к макету Команда.Представление = НСтр("ru = 'Печатная форма моего документа'"); КонецПроцедуры ``` После обновления конфигурации команда печати должна появиться в формах целевого объекта, а также в списке `Макеты печатных форм`
Изменение списка доступных полей Для того, чтобы расширить или уменьшить список доступных полей в конструкторе печатных форм нужно реализовать схему компоновки данных `ДанныеПечати` на уровне объекта ![Изображение](/bsp-pechat/2.png) Схема компоновки данных должна именоваться именно `Данные печати`, в запросе иметь поле `Ссылка` целевого объекта. **В схеме можно использовать все возможности СКД** (ВычисляемыеПоля, соединения и пр.) ![Изображение](/bsp-pechat/7.png) ПРИ НЕОБХОДИМОСТИ дополняются методы `ПриОпределенииИсточниковДанныхПечати` `ПриПодготовкеДанныхПечати` общего модуля `УправлениеПечатьюПереопределяемый`. Метод `ПриОпределенииИсточниковДанныхПечати` **описывает новые поля** схемы, а `ПриПодготовкеДанныхПечати` **реализует их заполнение** **(Не пробовал, нужно потестить)** ```bsl // Определяет используемый макет данных печати для объектов метаданных и отдельных полей. // По умолчанию используется макет ДанныеПечати у ссылочных объектов. Если макет отсутствует в метаданных, он будет // сгенерирован автоматически на основе выборки всех реквизитов объекта. В данной процедуре можно переопределить // состав полей, доступных для печати как для всего объекта, так и для отдельного поля объекта. // // Параметры: // Объект - Строка - полное имя объекта метаданных либо имя поля из макета "ДанныеПечати" объекта метаданных // в формате "ПолноеИмяОбъектаМетаданных.ИмяПоля". // ИсточникиДанныхПечати - СписокЗначений: // * Значение - СхемаКомпоновкиДанных - схема данных печати. Определяет состав подчиненных полей объекта или поля, // используется при получении данных печати. // При получении данных печати отбор значений производится по полю Ссылка. // Поэтому в составе полей схемы компоновки данных обязательно должно // присутствовать поле Ссылка, даже если оно фактически не ссылочного типа, // а, например, Строка. // // * Представление - Строка - идентификатор схемы, используется в процедуре ПриПодготовкеДанныхПечати. // Если в качестве идентификатора схемы используется полное имя объекта метаданных, то // при подготовке данных печати будет вызываться процедура ПриПодготовкеДанныхПечати // модуля менеджера объекта. Иначе будет вызвана аналогичная процедура этого модуля. // // * Пометка -Булево - Истина, если в качестве дополнительного ключевого поля выступает владелец источника данных. // Процедура ПриОпределенииИсточниковДанныхПечати(Объект, ИсточникиДанныхПечати) Экспорт // _Демо начало примера // СтандартныеПодсистемы.СклонениеПредставленийОбъектов Если Объект = "Справочник._ДемоФизическиеЛица.Наименование" Тогда СклонениеПредставленийОбъектов.ПодключитьИсточникДанныхПечатиСклоненияСтрок(ИсточникиДанныхПечати); КонецЕсли; // Конец СтандартныеПодсистемы.СклонениеПредставленийОбъектов Если Объект = "Документ._ДемоСчетНаОплатуПокупателю" Тогда СписокПолей = УправлениеПечатью.ДеревоПолейДанныхПечати(); Поле = СписокПолей.Строки.Добавить(); Поле.Идентификатор = "Ссылка"; Поле.Представление = НСтр("ru = 'Ссылка'"); Поле.ТипЗначения = Новый ОписаниеТипов(); Поле = СписокПолей.Строки.Добавить(); Поле.Идентификатор = "QRКод"; Поле.Представление = НСтр("ru='QR-код'"); Поле.Картинка = БиблиотекаКартинок.ТипКартинка; Поле.Порядок = 1; СхемаДанныеШтрихкодов = УправлениеПечатью.СхемаКомпоновкиДанныхПечати(СписокПолей); ИсточникиДанныхПечати.Добавить(СхемаДанныеШтрихкодов, "QRКодСчетаНаОплату"); КонецЕсли; Если Объект = "Справочник._ДемоФизическиеЛица.Наименование" Тогда СписокПолей = УправлениеПечатью.ТаблицаПолейДанныхПечати(); Поле = СписокПолей.Добавить(); Поле.Идентификатор = "Ссылка"; Поле.Представление = НСтр("ru = 'Ссылка'"); Поле.ТипЗначения = Новый ОписаниеТипов(); Поле = СписокПолей.Добавить(); Поле.Идентификатор = "ФамилияИнициалы"; Поле.Представление = НСтр("ru = 'Фамилия И. О.'"); Поле.ТипЗначения = Новый ОписаниеТипов("Строка"); СхемаДанных = УправлениеПечатью.СхемаКомпоновкиДанныхПечати(СписокПолей); ИсточникиДанныхПечати.Добавить(СхемаДанных, "ДанныеПечатиФамилияИнициалы"); КонецЕсли; // _Демо конец примера КонецПроцедуры // Подготавливает данные печати. Вызывается в случае, если используемая схема компоновки данных содержит набор // данных Объект. // В случае, если в качестве идентификатора схемы используется имя объекта метаданных, то вместо этой процедуры // вызывается аналогичная процедура модуля менеджера объекта. // // Параметры: // ИсточникиДанных - Массив - объекты, для которых формируются данные печати. // ВнешниеНаборыДанных - Структура - коллекция наборов данных для передачи в процессор компоновки данных. // ИдентификаторСхемыКомпоновкиДанных - Строка - идентификатор СКД, указанный в ПриОпределенииИсточниковДанныхПечати. // КодЯзыка - Строка - язык, на котором требуется подготовить данные печати. // ДополнительныеПараметры - Структура: // * ОписанияИсточниковДанных - ТаблицаЗначений - дополнительные сведения об объектах, для которых формируются данные печати. // * ДанныеИсточниковСгруппированыПоВладельцуИсточникаДанных - Булево - указывает на то, что в результате компоновки // данные печати сгруппированы не по объектам печати, а по их владельцам в схеме данных печати. // Процедура ПриПодготовкеДанныхПечати(ИсточникиДанных, ВнешниеНаборыДанных, ИдентификаторСхемыКомпоновкиДанных, КодЯзыка, ДополнительныеПараметры) Экспорт Если ИдентификаторСхемыКомпоновкиДанных = "QRКодСчетаНаОплату" Тогда НаборДанных = Новый ТаблицаЗначений(); НаборДанных.Колонки.Добавить("Ссылка"); НаборДанных.Колонки.Добавить("QRКод"); ДанныеДокументов = ДанныеДокументов(ИсточникиДанных); QRКоды = Новый Соответствие; Для Каждого РеквизитыПлатежа Из ДанныеДокументов Цикл ПолучитьСообщенияПользователю(); QRСтрока = Неопределено; // Локализация QRСтрока = УправлениеПечатьюРФ.ФорматнаяСтрокаУФЭБС(РеквизитыПлатежа); // Конец Локализация Если ПустаяСтрока(QRСтрока) Тогда QRКоды.Вставить(РеквизитыПлатежа.Ссылка, Новый Картинка()); Продолжить; КонецЕсли; ДанныеQRКода = ГенерацияШтрихкода.ДанныеQRКода(QRСтрока, 1, 120); Если НЕ ТипЗнч(ДанныеQRКода) = Тип("ДвоичныеДанные") Тогда Шаблон = НСтр("ru = 'Не удалось сформировать QR-код для документа %1. |Технические подробности см. в журнале регистрации.'"); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, РеквизитыПлатежа.Ссылка); ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); Продолжить; КонецЕсли; QRКод = Новый Картинка(ДанныеQRКода); QRКоды.Вставить(РеквизитыПлатежа.Ссылка, QRКод); КонецЦикла; Для Каждого ИсточникДанных Из ИсточникиДанных Цикл ЗначениеПолейДанных = НаборДанных.Добавить(); ЗначениеПолейДанных.Ссылка = ИсточникДанных; ЗначениеПолейДанных.QRКод = QRКоды[ИсточникДанных]; КонецЦикла; ВнешниеНаборыДанных.Вставить("Данные", НаборДанных); Возврат; КонецЕсли; Если ИдентификаторСхемыКомпоновкиДанных = "ДанныеПечатиФамилияИнициалы" Тогда ДанныеПечати = Новый ТаблицаЗначений(); ДанныеПечати.Колонки.Добавить("Ссылка"); ДанныеПечати.Колонки.Добавить("ФамилияИнициалы"); Для Каждого Объект Из Объекты Цикл СтрокаТаблицы = ДанныеПечати.Добавить(); СтрокаТаблицы.Ссылка = Объект; СтрокаТаблицы.ФамилияИнициалы = ФизическиеЛицаКлиентСервер.ФамилияИнициалы(Объект); КонецЦикла; ВнешниеНаборыДанных.Вставить("Данные", ДанныеПечати); Возврат; КонецЕсли; КонецПроцедуры ```
### Макет open office XML (DOC) Отличается только конструктором, все остальное, так же, как описано выше для MXL ![Изображение](/bsp-pechat/8.png) ## Традиционное формирование печатной формы ### Макет табличного документа В `модуле менеджера` реализуем процедуру `ДобавитьКомандыПечати`: ```bsl Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт Команда = КомандыПечати.Добавить(); Команда.МенеджерПечати = "Документ.МойДокумент"; // где процедура "Печать". Можно не указывать, по умолчанию модуль менеджера объекта Команда.Идентификатор = "ПФ_MXL_ПечатнаяФормаМоегоДокумента"; // Произвольная строка, рекомендуется именовать как макет Команда.Представление = НСтр("ru = 'Печатная форма моего документа'"); КонецПроцедуры ```
Примеры команд печати ```bsl // Заполняет список команд печати. // // Параметры: // КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати // Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт // Счет на оплату КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "Счет"; КомандаПечати.Представление = НСтр("ru = 'Счет на оплату'"); КомандаПечати.ПроверкаПроведенияПередПечатью = Не Пользователи.РолиДоступны("_ДемоПечатьНепроведенныхДокументов"); // Счет на оплату без платежных реквизитов. КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "Счет"; КомандаПечати.Представление = НСтр("ru = 'Счет на оплату без платежных реквизитов'"); КомандаПечати.ПроверкаПроведенияПередПечатью = Не Пользователи.РолиДоступны("_ДемоПечатьНепроведенныхДокументов"); // Это будет доступно в аргументе "ПараметрыПечати" метода "Печать" КомандаПечати.ДополнительныеПараметры.Вставить("ВыводитьПлатежныеРеквизиты", Ложь); // Демо-пример ограничения доступности команд печати. Если Пользователи.РолиДоступны("_ДемоПечатьСчетаНаОплатуНаПринтер") Тогда // Счет на оплату (на принтер). КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "Счет"; КомандаПечати.Представление = НСтр("ru = 'Счет на оплату (на принтер)'"); КомандаПечати.Картинка = БиблиотекаКартинок.ПечатьСразу; КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; КомандаПечати.СразуНаПринтер = Истина; КонецЕсли; Если НЕ Пользователи.ЭтоСеансВнешнегоПользователя() Тогда // Комплект документов КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "Счет,Заказ,Заказ,Обработка._ДемоПечатнаяФорма.ГарантийноеПисьмо,Счет,Счет,Заказ"; КомандаПечати.Представление = НСтр("ru = 'Комплект документов'"); КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; КомандаПечати.ФиксированныйКомплект = Истина; КомандаПечати.ПереопределитьПользовательскиеНастройкиКоличества = Истина; КомандаПечати.Порядок = 75; // Комплект документов (на принтер). КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "Счет,Заказ,Заказ,Обработка._ДемоПечатнаяФорма.ГарантийноеПисьмо,Счет,Счет,Заказ"; КомандаПечати.Представление = НСтр("ru = 'Комплект документов (на принтер)'"); КомандаПечати.Картинка = БиблиотекаКартинок.ПечатьСразу; КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; КомандаПечати.ФиксированныйКомплект = Истина; КомандаПечати.ПереопределитьПользовательскиеНастройкиКоличества = Истина; КомандаПечати.СразуНаПринтер = Истина; КомандаПечати.Порядок = 75; // Настраиваемый комплект документов. КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "Счет,Заказ,Заказ,Обработка._ДемоПечатнаяФорма.ГарантийноеПисьмо,Счет,Счет,Заказ"; КомандаПечати.Представление = НСтр("ru = 'Настраиваемый комплект документов'"); КомандаПечати.СписокФорм = "ФормаДокумента,ФормаСписка"; КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; КомандаПечати.ЗаголовокФормы = НСтр("ru = 'Настраиваемый комплект'"); КомандаПечати.ДополнитьКомплектВнешнимиПечатнымиФормами = Истина; КомандаПечати.Порядок = 75; КонецЕсли; // Счет на оплату в документ Adobe PDF. КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "Счет"; КомандаПечати.Представление = НСтр("ru = 'Счет на оплату в документ Adobe PDF'"); КомандаПечати.Картинка = БиблиотекаКартинок.ФорматPDF; КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; КомандаПечати.ФорматСохранения = ТипФайлаТабличногоДокумента.PDF; // Счет на оплату в формате Office Open XML КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "СчетНаОплату(OfficeOpenXML)"; КомандаПечати.Представление = НСтр("ru = 'Счет на оплату в Office Open XML'"); КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord; КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; // Счет на оплату в формате Office Open XML (на основе СКД) КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.МенеджерПечати = "УправлениеПечатью"; КомандаПечати.Идентификатор = "Документ._ДемоСчетНаОплатуПокупателю.ПФ_DOC_СчетНаОплатуСКД_ru"; КомандаПечати.Представление = НСтр("ru = 'Счет на оплату в Office Open XML (на основе СКД)'"); КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord; КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; // Счет на оплату в Microsoft Word. КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "СчетНаОплату(MSWord)"; КомандаПечати.Представление = НСтр("ru = 'Счет на оплату в Microsoft Word (для обратной совместимости)'"); КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord2007; КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; КомандаПечати.Обработчик = "_ДемоСтандартныеПодсистемыКлиент.ПечатьСчетовНаОплатуПокупателю"; // Счет на оплату в OpenOffice.org Writer. КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "СчетНаОплату(ODT)"; КомандаПечати.Представление = НСтр("ru = 'Счет на оплату в OpenOffice.org Writer (для обратной совместимости)'"); КомандаПечати.Картинка = БиблиотекаКартинок.ФорматOpenOfficeWriter; КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; КомандаПечати.Обработчик = "_ДемоСтандартныеПодсистемыКлиент.ПечатьСчетовНаОплатуПокупателю"; // Локализация // Квитанция на оплату с QR кодом. КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "Квитанция"; КомандаПечати.Представление = НСтр("ru = 'Квитанция (с QR кодом)'"); КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; КомандаПечати.Порядок = 85; // Конец Локализация // Печатная форма с ошибкой формирования. КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Идентификатор = "ПечатнаяФормаСОшибкой"; КомандаПечати.Представление = НСтр("ru = 'Печатная форма с ошибкой формирования'"); КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; КомандаПечати.Порядок = 100; КонецПроцедуры ```
В `модуле менеджера` реализуем процедуру `Печать`: ```bsl // Формирует печатные формы. // // Параметры: // МассивОбъектов - см. УправлениеПечатьюПереопределяемый.ПриПечати.МассивОбъектов // ПараметрыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыПечати // КоллекцияПечатныхФорм - см. УправлениеПечатьюПереопределяемый.ПриПечати.КоллекцияПечатныхФорм // ОбъектыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ОбъектыПечати // ПараметрыВывода - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыВывода // Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт ИдентификаторКоманды = "Заказ"; ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, ИдентификаторКоманды); Если ПечатнаяФорма <> Неопределено Тогда // ПечатьСчетаЗаказа - функция, возвращающая заполненный табличный документ ПечатнаяФорма.ТабличныйДокумент = ПечатьСчетаЗаказа(МассивОбъектов, ОбъектыПечати, "Заказ"); ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Заказ покупателя'"); ПечатнаяФорма.ПолныйПутьКМакету = "Документ._ДемоСчетНаОплатуПокупателю.ПФ_MXL_СчетЗаказ"; КонецЕсли; КонецПроцедуры ```
Пример печати (Демо) ```bsl // Формирует печатные формы. // // Параметры: // МассивОбъектов - см. УправлениеПечатьюПереопределяемый.ПриПечати.МассивОбъектов // ПараметрыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыПечати // КоллекцияПечатныхФорм - см. УправлениеПечатьюПереопределяемый.ПриПечати.КоллекцияПечатныхФорм // ОбъектыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ОбъектыПечати // ПараметрыВывода - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыВывода // Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт // печать счета на оплату ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату(OfficeOpenXML)"); Если ПечатнаяФорма <> Неопределено Тогда ИмяМакета = "СчетНаОплату(OfficeOpenXML)"; МакетИДанныеОбъекта = УправлениеПечатью.МакетыИДанныеОбъектовДляПечати("Документ._ДемоСчетНаОплатуПокупателю", ИмяМакета, МассивОбъектов); ОфисныеДокументы = Новый Соответствие; Шаблон = НСтр("ru = '[Организация]-[Контрагент] Счет №[Номер] от [Дата]'"); ЗначенияРеквизитовДокументов = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивОбъектов, "Организация,Контрагент,Номер,Дата,Ссылка"); Для Каждого Ссылка Из МассивОбъектов Цикл ЗначенияРеквизитовДокумента = ЗначенияРеквизитовДокументов[Ссылка]; ЗначенияРеквизитовДокумента.Дата = Формат(ЗначенияРеквизитовДокумента.Дата, "ДЛФ=D"); ЗначенияРеквизитовДокумента.Номер = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ЗначенияРеквизитовДокумента.Номер); ИмяДокумента = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(Шаблон, ЗначенияРеквизитовДокументов[Ссылка]); АдресХранилищаОфисныйДокумент = НапечататьСчетНаОплатуПокупателю(Ссылка, МакетИДанныеОбъекта, ИмяМакета); ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, ИмяДокумента); КонецЦикла; ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Счет на оплату'"); ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы; КонецЕсли; // печать счета на оплату ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "Счет"); Если ПечатнаяФорма <> Неопределено Тогда // имена файлов ИменаФайлов = Новый Соответствие; Шаблон = НСтр("ru = '[Организация]-[Контрагент] Счет №[Номер] от [Дата]'"); ЗначенияРеквизитовДокументов = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивОбъектов, "Организация,Контрагент,Номер,Дата,Ссылка"); Для Каждого Ссылка Из МассивОбъектов Цикл ЗначенияРеквизитовДокумента = ЗначенияРеквизитовДокументов[Ссылка]; ЗначенияРеквизитовДокумента.Дата = Формат(ЗначенияРеквизитовДокумента.Дата, "ДЛФ=D"); ЗначенияРеквизитовДокумента.Номер = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ЗначенияРеквизитовДокумента.Номер); ИмяФайла = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(Шаблон, ЗначенияРеквизитовДокументов[Ссылка]); ИменаФайлов.Вставить(Ссылка, ИмяФайла); КонецЦикла; // описание печатной формы ВыводитьПлатежныеРеквизиты = Истина; Если ПараметрыПечати.Свойство("ВыводитьПлатежныеРеквизиты") Тогда ВыводитьПлатежныеРеквизиты = ПараметрыПечати.ВыводитьПлатежныеРеквизиты; КонецЕсли; ПечатнаяФорма.ТабличныйДокумент = ПечатьСчетаЗаказа(МассивОбъектов, ОбъектыПечати, "Счет", ВыводитьПлатежныеРеквизиты, ПараметрыВывода.КодЯзыка); ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Счет на оплату'"); ПечатнаяФорма.ПолныйПутьКМакету = "Документ._ДемоСчетНаОплатуПокупателю.ПФ_MXL_СчетЗаказ"; ПечатнаяФорма.ИмяФайлаПечатнойФормы = ИменаФайлов; ПечатнаяФорма.ДоступенВыводНаДругихЯзыках = Истина; КонецЕсли; // печать заказа покупателя ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "Заказ"); Если ПечатнаяФорма <> Неопределено Тогда ПечатнаяФорма.ТабличныйДокумент = ПечатьСчетаЗаказа(МассивОбъектов, ОбъектыПечати, "Заказ"); ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Заказ покупателя'"); ПечатнаяФорма.ПолныйПутьКМакету = "Документ._ДемоСчетНаОплатуПокупателю.ПФ_MXL_СчетЗаказ"; КонецЕсли; // Локализация // печать квитанции ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "Квитанция"); Если ПечатнаяФорма <> Неопределено Тогда ПечатнаяФорма.ТабличныйДокумент = ПечатьКвитанции(МассивОбъектов, ОбъектыПечати); ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Квитанция (с QR кодом)'"); ПечатнаяФорма.ПолныйПутьКМакету = "Документ._ДемоСчетНаОплатуПокупателю.ПФ_MXL_Квитанция"; КонецЕсли; // Конец Локализация // Параметры отправки печатных форм по электронной почте. ПриОпределенииПолучателей(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм); КонецПроцедуры ```
### Макет open office XML (DOC) Макет - обычный офисный документ, в котором особым образом выделены области и параметры. Макет может быть создан в Microsoft Word, OpenOffice, Google Docs и др. Области выделяются блоком вида ``` {v8 Область.<ИмяОбласти>} {/v8 Область.<ИмяОбласти>} ``` Параметры выделяются маркером вида `{v8 <ИмяПараметра>}` Области могут быть следующих типов: ![Изображение](/bsp-pechat/9.png) В `модуле менеджера`: - Создаем команды печати ```bsl // Заполняет список команд печати. // // Параметры: // КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати // Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт // формирование печатной формы в коде (Open Office XML) КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.МенеджерПечати = "Документ.ЗаказКлиента"; КомандаПечати.Идентификатор = "КоммерческоеПредложение"; КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord2007; КомандаПечати.Представление = НСтр("ru = 'Коммерческое предложение (кодом)'"); КомандаПечати.Порядок = 4; КонецПроцедуры ``` - Реализуем метод `Печать` ```bsl // Формирует печатные формы. // // Параметры: // МассивОбъектов – Массив – ссылки на объекты, которые нужно распечатать; // ПараметрыПечати – Структура – дополнительные настройки печати; // КоллекцияПечатныхФорм – ТаблицаЗначений – сформированные табличные документы (выходной параметр) // ОбъектыПечати – СписокЗначений – значение – ссылка на объект; // представление – имя области, в которой был выведен объект (выходной параметр); // ПараметрыВывода – Структура – дополнительные параметры сформированных табличных документов (выходной параметр). // Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "КоммерческоеПредложение"); Если ПечатнаяФорма <> Неопределено Тогда // * ОфисныеДокументы - Соответствие из КлючИЗначение - коллекция печатных форм в формате офисных документов: // ** Ключ - Строка - адрес во временном хранилище двоичных данных печатной формы; // ** Значение - Строка - имя файла печатной формы. ПечатнаяФорма.ОфисныеДокументы = ПечатьКоммерческогоПредложения(МассивОбъектов); ПечатнаяФорма.СинонимМакета = "Коммерческое предложение"; КонецЕсли; КонецПроцедуры Функция СформироватьОфисныйДокумент(Ссылка) // Подготавливаем макет для формирования печатной формы OpenXML МакетДокумента = ПолучитьМакет("ПФ_DOCX_КомерческоеПредложение"); Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДокумента, Неопределено); // Создаем структуру областей формируемой печатной формы OpenXМL ОписаниеОбластей = Новый Структура; УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Заголовок", "Общая"); УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Шапка", "Общая"); УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ШапкаТаблицы", "Общая"); УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "СтрокаТаблицы", "СтрокаТаблицы"); УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Подвал", "Общая"); // Подготавливаем печатную форму в формате офисного документа ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Неопределено, Макет); //получаем данные документа Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса(); // какой-то запрос Запрос.УстановитьПараметр("Ссылка", Ссылка); ДанныеДляПечати = Запрос.ВыполнитьПакет(); Шапка = ДанныеДляПечати[0].Выгрузить(); Товары = ДанныеДляПечати[1].Выгрузить(); ДанныеШапка = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(Шапка[0]); ДанныеШапка["Номер"] = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ДанныеШапка["Номер"], Истина, Истина); ДанныеШапка["Дата"] = Формат(ДанныеШапка["Дата"], "ДФ=dd.MM.yyyy"); ВидКИ_ТелефонОрганизации = Справочники.ВидыКонтактнойИнформации.ТелефонОрганизации; ВидКИ_СайтОрганизации = Справочники.ВидыКонтактнойИнформации.СайтОрганизации; ТелефонОрганизации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ДанныеШапка.Организация, ВидКИ_ТелефонОрганизации, ТекущаяДата()); СайтОрганизации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ДанныеШапка.Организация, ВидКИ_СайтОрганизации, ТекущаяДата()); ДанныеШапка.Вставить("ТелефонОрганизации", ТелефонОрганизации); ДанныеШапка.Вставить("СайтОрганизации", СайтОрганизации); ДанныеТовары = ОбщегоНазначения.ТаблицаЗначенийВМассив(Товары); // Вывод заголовка Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Заголовок"]); УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеШапка); // Вывод шапки документа Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Шапка"]); УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеШапка); // Вывод таблицы Если ДанныеТовары.Количество() > 0 Тогда // Шапка Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["ШапкаТаблицы"]); УправлениеПечатью.ПрисоединитьОбласть(ПечатнаяФорма, Область, Ложь); // Выводим сразу всю коллекцию Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["СтрокаТаблицы"]); УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, ДанныеТовары); КонецЕсли; // Вывод подвала Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Подвал"]); УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеШапка); // Помещаем сформированную печатную форму в соответствие ОфисныеДокументы АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма); //удаление временных файлов УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма); УправлениеПечатью.ОчиститьСсылки(Макет); Возврат АдресХранилищаПечатнойФормы; КонецФункции // СформироватьОфисныйДокумент() ``` ## Дополнительно
Описание свойств команды печати ```bsl // Создает пустую таблицу с описанием команд печати. // Таблица команд печати передается в процедуры ДобавитьКомандыПечати, // размещенные в модулях менеджеров объектов конфигурации, которые перечислены в процедуре // УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати. // // Возвращаемое значение: // ТаблицаЗначений: // // * Идентификатор - Строка - идентификатор команды печати, по которому менеджер печати определяет печатную // форму, которую необходимо сформировать. // Например, "СчетЗаказ". // // Для печати нескольких печатных форм можно указывать одновременно несколько их // идентификаторов (строкой, через запятую либо массивом строк), например: // "СчетЗаказ,ГарантийноеПисьмо". // // Если необходимо задать количество копий печати для печатной формы, то ее // идентификатор нужно продублировать столько раз, сколько копий необходимо // сформировать. При этом следует учитывать, что порядок следования печатных // форм в комплекте будет соответствовать порядку идентификаторов печатных форм, // указанных в этом параметре. Например (2 счета на оплату + 1 гарантийное письмо): // "СчетЗаказ,СчетЗаказ,ГарантийноеПисьмо". // // Идентификатор печатной формы может содержать в себе и альтернативный менеджер // печати, если он отличается от указанного в параметре МенеджерПечати, // например: "СчетЗаказ,Обработка.ПечатнаяФорма.ГарантийноеПисьмо". // // В этом примере ГарантийноеПисьмо формируется в менеджере печати // Обработка.ПечатнаяФорма, а СчетЗаказ - в менеджере печати, указанном в // параметре МенеджерПечати. // // Для печатных форм, менеджером печати которых является общий модуль // "УправлениеПечатью", в качестве идентификатора необходимо указать полный путь к макету. // Например, "Документ.СчетНаОплатуПокупателю.ПФ_MXL_СчетНаОплату". // // - Массив - список идентификаторов команд печати. // // * Представление - Строка - представление команды в меню Печать. // Например, "Счет на оплату". // // * МенеджерПечати - Строка - (необязательный) имя объекта, в модуле менеджера которого располагается // процедура Печать, формирующая табличные документы для этой команды. // Если печатная форма формируется автоматически по данным печати и макету, то // в параметре необходимо указать общий модуль "УправлениеПечатью". // Значение по умолчанию - имя модуля менеджера объекта. // Например, "Документ.СчетНаОплатуПокупателю". // * ТипыОбъектовПечати - Массив - (необязательный) список типов объектов, для которых предназначена команда // печати. Параметр предназначен для команд печати в журналах документов, где // требуется проверка передаваемого типа объекта перед вызовом менеджера печати. // Если список не заполнен, то при автоматическом создании списка команд печати // в журнале документов он заполняется типом объекта, из которого была // импортирована команда печати. // // * Обработчик - Строка - (необязательный) клиентский обработчик команды, в который необходимо передать // управление вместо стандартного обработчика команды Печать. Используется, // например, когда печатная форма формируется на клиенте. // Формат "<ИмяОбщегоМодуля>.<ИмяПроцедуры>" используется, когда процедура размещена // в общем модуле. // Формат "<ИмяПроцедуры>" используется, когда процедура размещена // в модуле основной формы отчета или обработки, указанной в МенеджерПечати. // Например, // КомандаПечати.Обработчик = "ЗащитаПерсональныхДанныхКлиент.ОткрытьФормуСогласиеНаОбработкуПерсональныхДанных"; // Пример обработчика в модуле формы: // // Формирует печатную форму <представление печатной формы>. // // // // Параметры: // // ПараметрыПечати - Структура - сведения о печатной форме. // // * ОбъектыПечати - Массив - массив ссылок выбранных объектов. // // * Форма - ФормаКлиентскогоПриложения - форма, из которой вызвана // // команда печати. // // * ДополнительныеПараметры - Структура - дополнительные параметры печати. // // Прочие ключи структуры соответствуют колонкам таблицы КомандыПечати, // // подробнее см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати. // // // &НаКлиенте // Функция <ИмяФункции>(ПараметрыПечати) Экспорт // // Обработчик печати. // КонецФункции // Следует иметь в виду, что обработчик вызывается при помощи метода Вычислить, // поэтому в качестве обработчика может выступать только функция. // При этом возвращаемое значение функции никак в дальнейшем не используется подсистемой. // // * Порядок - Число - (необязательный) Значение от 1 до 100, указывающее порядок размещения команды // по отношению к другим командам. Сортировка команд меню Печать осуществляется // сначала по полю Порядок, затем по представлению. // Значение по умолчанию - 50. // // * Картинка - Картинка - (необязательный) Картинка, которая отображается возле команды в меню Печать. // Например, БиблиотекаКартинок.ФорматPDF. // // * СписокФорм - Строка - (необязательный) Имена форм через запятую, в которых должна отображаться // команда. Если параметр не указан, то команда печати будет отображаться во // всех формах объекта, где встроена подсистема Печать. // Например, "ФормаДокумента". // // * МестоРазмещения - Строка - (необязательный) Имя группы формы, в которую необходимо разместить // команду печати. Параметр необходимо использовать только в случае, когда на // форме размещается более одного подменю "Печать". В остальных случаях место // размещения необходимо задавать в модуле формы при вызове // метода ПодключаемыеКоманды.ПриСозданииНаСервере. // // * ЗаголовокФормы - Строка - (необязательный) Произвольная строка, переопределяющая стандартных заголовок // формы "Печать документов". Например, "Настраиваемый комплект". // // * ФункциональныеОпции - Строка - (необязательный) Имена функциональных опций через запятую, от которых зависит // доступность команды печати. // // * УсловияВидимости - Массив - (необязательный) Коллекция условий видимости команды в зависимости от // контекста. Условия видимости команды задаются при помощи процедуры // ДобавитьУсловиеВидимостиКоманды. // Если параметр не задан, команда видна вне зависимости от контекста. // // * ПроверкаПроведенияПередПечатью - Булево - (необязательный) Признак необходимости проверки проведенности // документов перед печатью. Если выбран хотя бы один непроведенный документ, то // перед выполнением команды печати возникает диалог проведения. // Для непроведенных документов команда печати не выполняется. // Если параметр не указан, то проверка проведенности не выполняется. // // * СразуНаПринтер - Булево - (необязательный) Признак необходимости печати документов без предварительного // просмотра, сразу на принтер. Если параметр не указан, то при выборе команды // печати открывается форма предварительного просмотра "Печать документов". // // * ФорматСохранения - ТипФайлаТабличногоДокумента - (необязательный) Применяется для быстрого сохранения печатной // формы (без дополнительных действий) в различные форматы, отличные от mxl. // Если параметр не указан, то формируется обычный mxl. // Например, ТипФайлаТабличногоДокумента.PDF. // // При выборе команды печати сразу открывается сформированный в формате pdf // документ. // // * ПереопределитьПользовательскиеНастройкиКоличества - Булево - (необязательный) Признак необходимости отключения в // форме ПечатьДокументов механизма сохранения/восстановления выбранного // пользователем количества экземпляров на печать. Если параметр не указан, то // механизм сохранения/восстановления настроек будет работать при открытии формы. // ПечатьДокументов. // // * ДополнитьКомплектВнешнимиПечатнымиФормами - Булево - (необязательный) Признак необходимости дополнить комплект // документов всеми подключенными к объекту внешними печатными формами // (подсистема ДополнительныеОтчетыИОбработки). Если параметр не указан, внешние // печатные формы не добавляются в комплект. // // * ФиксированныйКомплект - Булево - (необязательный) Признак необходимости блокировки от изменения пользователем // состава комплекта документов. Если параметр не указан, то пользователь сможет // исключать отдельные печатные формы из комплекта в форме ПечатьДокументов, а // также изменять их количество. // // * ДополнительныеПараметры - Структура - (необязательный) произвольные параметры для передачи в менеджер печати. // // * НеВыполнятьЗаписьВФорме - Булево - (необязательный) Признак необходимости отключения механизма записи объекта // перед выполнением команды печати. Используется в исключительных случаях. Если // параметр не указан, производится запись объекта в случае, если в форме // объекта установлен признак модифицированности. // // * ТребуетсяРасширениеРаботыСФайлами - Булево - (необязательный) Признак необходимости подключения расширения для работы // с 1С:Предприятием перед выполнением команды. Если параметр не указан, расширение // подключаться не будет. // // * ОсновнаяПечатнаяФорма - Булево - (необязательный) Признак определяющий возможность запоминания // наименований сформированных печатных форм. // // * НаименованиеПечатнойФормы - Строка - (необязательный) Наименование, которое будет сохранено при установленном // признаке "ОсновнаяПечатнаяФорма". Если не заполнено, будет запоминаться значение // из поля "Представление". // Функция СоздатьКоллекциюКомандПечати() Экспорт ```