В процессе автоматизации бизнес-процессов в 1С:Управление нашей фирмой (УНФ) версии 1.6 часто возникает задача программного формирования первичных документов. Это может быть актуально при создании регламентных заданий, которые должны автоматически рассылать счета на оплату, акты или универсальные передаточные документы (УПД) клиентам. Разберем подробно, как реализовать этот механизм, используя типовые возможности БСП (Библиотеки стандартных подсистем) и конфигурации УНФ.
Прежде чем приступить к написанию кода, нам необходимо выяснить, какой идентификатор использует система для нужной нам печатной формы. Рассмотрим, как это сделать. Для этого откроем модуль менеджера соответствующего документа (например, АктВыполненныхРабот) и найдем процедуру ДобавитьКомандыПечати. Именно там регистрируются все доступные формы. Например, для акта это может быть АктОбОказанииУслуг, а для УПД — УниверсальныйПередаточныйДокумент.
Проанализируем общую последовательность действий при программном вызове печати:
УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм.Печать из менеджера документа или специализированной обработки.Рассмотрим конкретный пример кода для формирования счета и акта выполненных работ. Выясним, как правильно передать массив объектов для печати.
// 1. Формируем Счет на оплату
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаСчет); // Ваша ссылка на документ
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("СчетНаОплату");
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
ОбъектыПечати = Новый СписокЗначений;
Документы.СчетНаОплату.Печать(МассивОбъектов, ПараметрыВывода, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
ТабДокСчет = КоллекцияПечатныхФорм[0].ТабличныйДокумент;
ПутьСчет = ПолучитьИмяВременногоФайла("pdf");
ТабДокСчет.Записать(ПутьСчет, ТипФайлаТабличногоДокумента.PDF);
КонецЕсли;
// 2. Формируем Акт выполненных работ
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("АктОбОказанииУслуг");
МассивОбъектов.Очистить();
МассивОбъектов.Добавить(СсылкаНаАкт);
Документы.АктВыполненныхРабот.Печать(МассивОбъектов, ПараметрыВывода, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
ТабДокАкт = КоллекцияПечатныхФорм[0].ТабличныйДокумент;
ПутьАкт = ПолучитьИмяВременногоФайла("pdf");
ТабДокАкт.Записать(ПутьАкт, ТипФайлаТабличногоДокумента.PDF);
КонецЕсли;
Важно помнить, что печать УПД в УНФ часто реализована не в самом менеджере документа "Акт", а через общую обработку печати счетов-фактур. Если вызвать Документы.СчетФактура.Печать, система может выдать ошибку "Метод объекта не обнаружен". В этом случае следует обращаться к обработке ПечатьСчетФактура.
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("УниверсальныйПередаточныйДокумент");
Обработки.ПечатьСчетФактура.Печать(МассивОбъектов, ПараметрыВывода, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
ТабДокУПД = КоллекцияПечатныхФорм[0].ТабличныйДокумент;
// Настройка отображения (см. ниже раздел про масштаб)
ТабДокУПД.АвтоМасштаб = Истина;
ПутьУПД = ПолучитьИмяВременногоФайла("pdf");
ТабДокУПД.Записать(ПутьУПД, ТипФайлаТабличногоДокумента.PDF);
КонецЕсли;
Часто при программном формировании УПД документ "разваливается" на два листа или сохраняется в некорректной ориентации. Чтобы этого избежать, необходимо перед записью файла в PDF установить свойства объекта ТабличныйДокумент. Разберем основные параметры:
ТабличныйДокумент.АвтоМасштаб = Истина позволяет системе автоматически вписать содержимое в ширину печатного листа.ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт.ТабличныйДокумент.Защита = Истина.После того как файлы сохранены во временные каталоги, их нужно отправить клиенту. Одной из проблем является то, что при простом добавлении пути к файлу во вложения письма, получатель видит имена типа "v8_XXXX.pdf". Чтобы файлы назывались понятно (например, "Счет №5.pdf"), проанализируем следующий подход:
Необходимо использовать объект ДвоичныеДанные и явно указывать имя вложения. Рассмотрим пример отправки:
// Создаем объект почтового сообщения
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Документы по вашему заказу";
// Добавляем вложение правильно
ДанныеСчета = Новый ДвоичныеДанные(ПутьСчет);
Вложение = Письмо.Вложения.Добавить(ДанныеСчета);
Вложение.Имя = "Счет_на_оплату_" + СтрЗаменить(СсылкаНаСчет.Номер, "/", "_") + ".pdf";
ДанныеУПД = Новый ДвоичныеДанные(ПутьУПД);
ВложениеУПД = Письмо.Вложения.Добавить(ДанныеУПД);
ВложениеУПД.Имя = "УПД_" + СтрЗаменить(СсылкаНаАкт.Номер, "/", "_") + ".pdf";
// Отправка через системную учетную запись
УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.НайтиПоНаименованию("Системная");
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись, Письмо);
Важный нюанс: при формировании имени файла избегайте спецсимволов (слэши, кавычки), которые могут быть в номере документа 1С. Используйте функцию СтрЗаменить, как показано в примере выше, чтобы гарантировать корректность имени файла для файловой системы операционной системы получателя.
В современных редакциях УНФ 1.6 рекомендуется по возможности использовать более высокоуровневые методы. Проанализируем функцию УправлениеПечатью.СформироватьПечатныеФормыДляПочты. Она позволяет передать массив документов и идентификаторы форм, а на выходе получить структуру с уже готовыми двоичными данными и правильными именами файлов, что значительно сокращает объем кода и уменьшает вероятность ошибок при работе с временными файлами.
Таким образом, мы рассмотрели полный цикл: от определения идентификатора команды печати до отправки корректно именованных PDF-файлов клиенту. Использование свойств АвтоМасштаб и правильная работа с Вложениями в интернет-письме позволяют добиться профессионального результата в автоматизации документооборота.