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