Skip to content

Подключение к подсистеме Печать

Настройка объектов метаданных

В процедуре ПриОпределенииНастроекПечати общего модуля УправлениеПечатьюПереопределяемый перечисляем менеджеры объектов, которые нужно подключить:

// Переопределяет настройки подсистемы.
//
// Параметры:
// Настройки - Структура:
// * ИспользоватьПодписиИПечати - Булево - при установке значения Ложь отключается возможность установки подписей
// и печатей в печатных формах.
// * СкрыватьПодписиИПечатиДляРедактирования - Булево - удалять рисунки подписей и печатей табличных документов при
// снятии флажка "Подписи и печати" в форме "Печать документов", для того,
// чтобы они не мешали редактировать текст, находящийся под ними.
// * ПроверкаПроведенияПередПечатью - Булево - признак необходимости проверки проведенности
// документов перед печатью, является значением по умолчанию для команды печати
// см. УправлениеПечатью.СоздатьКоллекциюКомандПечати.
// Для непроведенных документов команда печати не выполняется.
// Если параметр не указан, то проверка проведенности не выполняется.
// * ОбъектыПечати - Массив - менеджеры объектов с процедурой ПриОпределенииНастроекПечати.
//
Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт
...
Настройки.ОбъектыПечати.Добавить(Справочники._ДемоКонтрагенты);
Настройки.ОбъектыПечати.Добавить(Справочники._ДемоОрганизации);
...
Настройки.ОбъектыПечати.Добавить(Документы._ДемоСчетНаОплатуПокупателю);
Настройки.ОбъектыПечати.Добавить(Документы._ДемоРасходныйКассовыйОрдер);
...
КонецПроцедуры

Настройка модуля менеджера

В модуле менеджера объектов, подключаемых к подсистеме добавляются методы ПриОпределенииНастроекПечати и ДобавитьКомандыПечати:

// СтандартныеПодсистемы.Печать
// Переопределяет настройки печати для объекта.
//
// Параметры:
// Настройки - см. УправлениеПечатью.НастройкиПечатиОбъекта.
//
Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт
Настройки.ПриДобавленииКомандПечати = Истина;
КонецПроцедуры
// Определяет список команд печати.
//
// Параметры:
// КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// в зависимости от варианта печати - автоматического "нового" или традиционного. См. ниже
КонецПроцедуры
// Конец СтандартныеПодсистемы.Печать

Подключение форм к подсистеме Подключаемые команды

Чтоыб были выведены подключаемые команды печати необходимо подключить формы к подсистеме Подключаемые команды

Автоматическое формирование печатной формы

Макет табличного документа

ВАРИАНТ 1. Без конфигуратора

Данный способ позволяет создать печатную форму исключительно в пользовательском режиме. Команды печати в таком случае создавать не нужно

В пользовательском режиме открываем Администрирование -> Печатные формы, отчеты и обработки -> Макеты печатных форм

Изображение

В конструкторе макета создаем необходимый вид печатной формы

Изображение

ВАЖНО! Параметры указываются в [квадратных скобках], функции также. Например, чтобы для поля Дата применить функцию Формат, в ячейку нужно записать строку вида [Формат([Дата], "ДФ=дд.ММ.гггг")].

Также не нужно никак выделять строки табличных частей - просто выводим параметры ТЧ в ячейки, система сама определит, что такие строки нужно повторять

Изображение

С помощью команд редактора можно запустить предпросмотр или изменить образец:

Изображение

Включаем видимость печатной формы

Изображение

Все, после записи макета команда печати будет доступна в формах объекта

ВАРИАНТ 2. Встраивание в конфигурацию
  • Создаем макет печатной формы также, как и в варианте 1, только не включаем видимость. Созданный макет нужно сохранить в формате MXL, открыть в конфигураторе и скопировать все содержимое в созданный макет

ВАЖНО! Может возникнуть ошибка из-за несоответствия имен полей в пользовательском режиме и в конфигураторе. Например - в пользовательском режиме [Товары.Номер строки], а в конфигураторе [Товары.НомерСтроки]. Нужно сверяться с именами доступных полей схемы компоновки данных (если она задана)

Изображение

  • В модуле менеджера реализуем процедуру ДобавитьКомандыПечати:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
Команда = КомандыПечати.Добавить();
Команда.МенеджерПечати = "УправлениеПечатью"; // ВАЖНО! Менеджер - сама подсистема
Команда.Идентификатор = "Документ.МойДокумент.ПФ_MXL_ПечатнаяФормаМоегоДокумента"; // Полный путь к макету
Команда.Представление = НСтр("ru = 'Печатная форма моего документа'");
КонецПроцедуры

После обновления конфигурации команда печати должна появиться в формах целевого объекта, а также в списке Макеты печатных форм

Изменение списка доступных полей

Для того, чтобы расширить или уменьшить список доступных полей в конструкторе печатных форм нужно реализовать схему компоновки данных ДанныеПечати на уровне объекта

Изображение

Схема компоновки данных должна именоваться именно Данные печати, в запросе иметь поле Ссылка целевого объекта. В схеме можно использовать все возможности СКД (ВычисляемыеПоля, соединения и пр.)

Изображение

ПРИ НЕОБХОДИМОСТИ дополняются методы ПриОпределенииИсточниковДанныхПечати ПриПодготовкеДанныхПечати общего модуля УправлениеПечатьюПереопределяемый. Метод ПриОпределенииИсточниковДанныхПечати описывает новые поля схемы, а ПриПодготовкеДанныхПечати реализует их заполнение

(Не пробовал, нужно потестить)

// Определяет используемый макет данных печати для объектов метаданных и отдельных полей.
// По умолчанию используется макет ДанныеПечати у ссылочных объектов. Если макет отсутствует в метаданных, он будет
// сгенерирован автоматически на основе выборки всех реквизитов объекта. В данной процедуре можно переопределить
// состав полей, доступных для печати как для всего объекта, так и для отдельного поля объекта.
//
// Параметры:
// Объект - Строка - полное имя объекта метаданных либо имя поля из макета "ДанныеПечати" объекта метаданных
// в формате "ПолноеИмяОбъектаМетаданных.ИмяПоля".
// ИсточникиДанныхПечати - СписокЗначений:
// * Значение - СхемаКомпоновкиДанных - схема данных печати. Определяет состав подчиненных полей объекта или поля,
// используется при получении данных печати.
// При получении данных печати отбор значений производится по полю Ссылка.
// Поэтому в составе полей схемы компоновки данных обязательно должно
// присутствовать поле Ссылка, даже если оно фактически не ссылочного типа,
// а, например, Строка.
//
// * Представление - Строка - идентификатор схемы, используется в процедуре ПриПодготовкеДанныхПечати.
// Если в качестве идентификатора схемы используется полное имя объекта метаданных, то
// при подготовке данных печати будет вызываться процедура ПриПодготовкеДанныхПечати
// модуля менеджера объекта. Иначе будет вызвана аналогичная процедура этого модуля.
//
// * Пометка -Булево - Истина, если в качестве дополнительного ключевого поля выступает владелец источника данных.
//
Процедура ПриОпределенииИсточниковДанныхПечати(Объект, ИсточникиДанныхПечати) Экспорт
// _Демо начало примера
// СтандартныеПодсистемы.СклонениеПредставленийОбъектов
Если Объект = "Справочник._ДемоФизическиеЛица.Наименование" Тогда
СклонениеПредставленийОбъектов.ПодключитьИсточникДанныхПечатиСклоненияСтрок(ИсточникиДанныхПечати);
КонецЕсли;
// Конец СтандартныеПодсистемы.СклонениеПредставленийОбъектов
Если Объект = "Документ._ДемоСчетНаОплатуПокупателю" Тогда
СписокПолей = УправлениеПечатью.ДеревоПолейДанныхПечати();
Поле = СписокПолей.Строки.Добавить();
Поле.Идентификатор = "Ссылка";
Поле.Представление = НСтр("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

Изображение

Традиционное формирование печатной формы

Макет табличного документа

В модуле менеджера реализуем процедуру ДобавитьКомандыПечати:

Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
Команда = КомандыПечати.Добавить();
Команда.МенеджерПечати = "Документ.МойДокумент"; // где процедура "Печать". Можно не указывать, по умолчанию модуль менеджера объекта
Команда.Идентификатор = "ПФ_MXL_ПечатнаяФормаМоегоДокумента"; // Произвольная строка, рекомендуется именовать как макет
Команда.Представление = НСтр("ru = 'Печатная форма моего документа'");
КонецПроцедуры
Примеры команд печати
// Заполняет список команд печати.
//
// Параметры:
// КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Счет на оплату
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "Счет";
КомандаПечати.Представление = НСтр("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;
КонецПроцедуры

В модуле менеджера реализуем процедуру Печать:

// Формирует печатные формы.
//
// Параметры:
// МассивОбъектов - см. УправлениеПечатьюПереопределяемый.ПриПечати.МассивОбъектов
// ПараметрыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыПечати
// КоллекцияПечатныхФорм - см. УправлениеПечатьюПереопределяемый.ПриПечати.КоллекцияПечатныхФорм
// ОбъектыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ОбъектыПечати
// ПараметрыВывода - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыВывода
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ИдентификаторКоманды = "Заказ";
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, ИдентификаторКоманды);
Если ПечатнаяФорма <> Неопределено Тогда
// ПечатьСчетаЗаказа - функция, возвращающая заполненный табличный документ
ПечатнаяФорма.ТабличныйДокумент = ПечатьСчетаЗаказа(МассивОбъектов, ОбъектыПечати, "Заказ");
ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Заказ покупателя'");
ПечатнаяФорма.ПолныйПутьКМакету = "Документ._ДемоСчетНаОплатуПокупателю.ПФ_MXL_СчетЗаказ";
КонецЕсли;
КонецПроцедуры
Пример печати (Демо)
// Формирует печатные формы.
//
// Параметры:
// МассивОбъектов - см. УправлениеПечатьюПереопределяемый.ПриПечати.МассивОбъектов
// ПараметрыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыПечати
// КоллекцияПечатныхФорм - см. УправлениеПечатьюПереопределяемый.ПриПечати.КоллекцияПечатныхФорм
// ОбъектыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ОбъектыПечати
// ПараметрыВывода - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыВывода
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// печать счета на оплату
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату(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 <ИмяПараметра>}

Области могут быть следующих типов:

Изображение

В модуле менеджера:

  • Создаем команды печати
// Заполняет список команд печати.
//
// Параметры:
// КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// формирование печатной формы в коде (Open Office XML)
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.МенеджерПечати = "Документ.ЗаказКлиента";
КомандаПечати.Идентификатор = "КоммерческоеПредложение";
КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord2007;
КомандаПечати.Представление = НСтр("ru = 'Коммерческое предложение (кодом)'");
КомандаПечати.Порядок = 4;
КонецПроцедуры
  • Реализуем метод Печать
// Формирует печатные формы.
//
// Параметры:
// МассивОбъектов – Массив – ссылки на объекты, которые нужно распечатать;
// ПараметрыПечати – Структура – дополнительные настройки печати;
// КоллекцияПечатныхФорм – ТаблицаЗначений – сформированные табличные документы (выходной параметр)
// ОбъектыПечати – СписокЗначений – значение – ссылка на объект;
// представление – имя области, в которой был выведен объект (выходной параметр);
// ПараметрыВывода – Структура – дополнительные параметры сформированных табличных документов (выходной параметр).
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "КоммерческоеПредложение");
Если ПечатнаяФорма <> Неопределено Тогда
// * ОфисныеДокументы - Соответствие из КлючИЗначение - коллекция печатных форм в формате офисных документов:
// ** Ключ - Строка - адрес во временном хранилище двоичных данных печатной формы;
// ** Значение - Строка - имя файла печатной формы.
ПечатнаяФорма.ОфисныеДокументы = ПечатьКоммерческогоПредложения(МассивОбъектов);
ПечатнаяФорма.СинонимМакета = "Коммерческое предложение";
КонецЕсли;
КонецПроцедуры
Функция СформироватьОфисныйДокумент(Ссылка)
// Подготавливаем макет для формирования печатной формы OpenXML
МакетДокумента = ПолучитьМакет("ПФ_DOCX_КомерческоеПредложение");
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДокумента, Неопределено);
// Создаем структуру областей формируемой печатной формы OpenXМL
ОписаниеОбластей = Новый Структура;
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Заголовок", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Шапка", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ШапкаТаблицы", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "СтрокаТаблицы", "СтрокаТаблицы");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Подвал", "Общая");
// Подготавливаем печатную форму в формате офисного документа
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Неопределено, Макет);
//получаем данные документа
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса(); // какой-то запрос
Запрос.УстановитьПараметр("Ссылка", Ссылка);
ДанныеДляПечати = Запрос.ВыполнитьПакет();
Шапка = ДанныеДляПечати[0].Выгрузить();
Товары = ДанныеДляПечати[1].Выгрузить();
ДанныеШапка = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(Шапка[0]);
ДанныеШапка["Номер"] = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ДанныеШапка["Номер"], Истина, Истина);
ДанныеШапка["Дата"] = Формат(ДанныеШапка["Дата"], "ДФ=dd.MM.yyyy");
ВидКИ_ТелефонОрганизации = Справочники.ВидыКонтактнойИнформации.ТелефонОрганизации;
ВидКИ_СайтОрганизации = Справочники.ВидыКонтактнойИнформации.СайтОрганизации;
ТелефонОрганизации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ДанныеШапка.Организация, ВидКИ_ТелефонОрганизации, ТекущаяДата());
СайтОрганизации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ДанныеШапка.Организация, ВидКИ_СайтОрганизации, ТекущаяДата());
ДанныеШапка.Вставить("ТелефонОрганизации", ТелефонОрганизации);
ДанныеШапка.Вставить("СайтОрганизации", СайтОрганизации);
ДанныеТовары = ОбщегоНазначения.ТаблицаЗначенийВМассив(Товары);
// Вывод заголовка
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Заголовок"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеШапка);
// Вывод шапки документа
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Шапка"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеШапка);
// Вывод таблицы
Если ДанныеТовары.Количество() > 0 Тогда
// Шапка
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["ШапкаТаблицы"]);
УправлениеПечатью.ПрисоединитьОбласть(ПечатнаяФорма, Область, Ложь);
// Выводим сразу всю коллекцию
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["СтрокаТаблицы"]);
УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, ДанныеТовары);
КонецЕсли;
// Вывод подвала
Область = УправлениеПечатью.ОбластьМакета(Макет, ОписаниеОбластей["Подвал"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеШапка);
// Помещаем сформированную печатную форму в соответствие ОфисныеДокументы
АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
//удаление временных файлов
УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма);
УправлениеПечатью.ОчиститьСсылки(Макет);
Возврат АдресХранилищаПечатнойФормы;
КонецФункции // СформироватьОфисныйДокумент()

Дополнительно

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