При использовании 1С-ЭДО пользователи часто сталкиваются с проблемой: по умолчанию счета на оплату отправляются в формате XML (CommerceML 2.08). Если контрагент использует другого оператора (например, СБИС или Диадок), система на стороне получателя может некорректно отображать такой документ или вовсе его не «понимать». Самым надежным решением является отправка счета в виде произвольного документа с вложением в формате PDF. В рамках данной статьи мы разберем, как автоматизировать этот процесс программно, используя возможности современных релизов 1С:Бухгалтерии 8.3.
Разберем причину возникновения проблемы. Формат CML 2.08 является внутренним стандартом фирмы 1С. В отличие от УПД, для которых ФНС утвердила строгие форматы, счет на оплату не имеет единого государственного стандарта. В результате при передаче через роуминг операторы не всегда могут корректно визуализировать XML-данные. Использование PDF гарантирует, что контрагент увидит ровно ту печатную форму, которую сформировал бухгалтер в своей базе.
Для автоматизации процесса нам потребуется написать код, который будет программно «печать» счет в PDF, помещать его во временное хранилище и создавать на его основе объект 1С-ЭДО. Рассмотрим основной алгоритм реализации в общем модуле или расширении.
Проанализируем функцию формирования файла. Нам необходимо получить табличный документ счета, сохранить его на диск (или сразу в поток) и передать данные в подсистему ЭДО.
Функция СформироватьСчетНаОплатуPDF(СсылкаНаОбъект, АдресКаталога, ПараметрыСоздания) Экспорт
// Заполняем параметры создания электронного документа
ПараметрыСоздания.ВидДокумента = Справочники.ВидыДокументовЭДО.НайтиПоНаименованию("Счет на оплату").Ссылка;
ПараметрыСоздания.ДатаДокумента = СсылкаНаОбъект.Дата;
ПараметрыСоздания.Контрагент = СсылкаНаОбъект.Контрагент;
ПараметрыСоздания.НомерДокумента = СсылкаНаОбъект.Номер;
ПараметрыСоздания.Организация = СсылкаНаОбъект.Организация;
ПараметрыСоздания.СуммаДокумента = СсылкаНаОбъект.СуммаДокумента;
// Получаем печатную форму (используем стандартные механизмы печати конфигурации)
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаОбъект);
// Формируем коллекцию печатных форм
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("СчетНаОплату");
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// Вызываем процедуру печати из менеджера документа или обработки
Обработки.ПечатьСчетаНаОплату.Печать(МассивОбъектов, Новый Структура, КоллекцияПечатныхФорм, Новый СписокЗначений(), ПараметрыВывода);
ТабличныйДокумент = КоллекцияПечатныхФорм[0].ТабличныйДокумент;
// Формируем имя файла
СтрокаИмениФайла = "Счет на оплату " + СсылкаНаОбъект.Номер + " от " + Формат(СсылкаНаОбъект.Дата, "ДФ=dd.MM.yyyy") + ".pdf";
ПолноеИмяФайла = АдресКаталога + СтрокаИмениФайла;
// Записываем PDF на диск
ТабличныйДокумент.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.PDF);
ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла);
ПФ = Новый Структура;
ПФ.Вставить("ИмяФайла", СтрокаИмениФайла);
ПФ.Вставить("АдресХранилища", ПоместитьВоВременноеХранилище(ДвоичныеДанные));
Возврат ПФ;
КонецФункции
После того как файл сформирован, необходимо инициировать процесс создания ЭД. В новых версиях 1С (начиная с релизов 3.0.92 и выше) разработчики существенно обновили программный интерфейс. Теперь для этого рекомендуется использовать метод НачатьСозданиеЭлектронногоДокументаПоФайлу.
Рассмотрим пример вызова этой процедуры на стороне клиента. Важно понимать, что работа с ЭДО часто требует асинхронного подхода (использование описаний оповещений).
Процедура СоздатьСчетНаОплатуPDF(ПараметрКоманды, ПараметрыВыполненияКоманды) Экспорт
СсылкаНаОбъект = ПараметрКоманды; // Это наш СчетНаОплатуПокупателю
// Инициализируем параметры создания документа через файл
ПараметрыСоздания = ОбменСКонтрагентамиКлиент.НовыеПараметрыСозданияЭлектронногоДокументаПоФайлу();
ОбъектыУчета = Новый Массив;
ОбъектыУчета.Добавить(СсылкаНаОбъект);
ПараметрыСоздания.ОбъектыУчета = ОбъектыУчета;
// Вызываем серверную функцию для подготовки файла (код выше)
ДанныеФайла = дн_ЭДОВызовСервера.СформироватьСчетНаОплатуPDF(СсылкаНаОбъект, КаталогВременныхФайлов(), ПараметрыСоздания);
// Настраиваем параметры файла для БЭД
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("АдресХранилища", ДанныеФайла.АдресХранилища);
// ВНИМАНИЕ: Здесь должно быть только имя файла без пути, иначе в клиент-серверном варианте будет ошибка контейнера
ПараметрыФайла.Вставить("ИмяФайла", ДанныеФайла.ИмяФайла);
// Описание оповещения после завершения операции
Оп = Новый ОписаниеОповещения("ВыполнитьПослеСозданияЭД", ЭтотОбъект);
// Запуск стандартного механизма 1С по созданию ЭД
ИнтерфейсДокументовЭДОКлиент.НачатьСозданиеЭлектронногоДокументаПоФайлу(Оп, ПараметрыСоздания, ПараметрыФайла);
КонецПроцедуры
При реализации автоматизации отправки в PDF мы можем столкнуться с рядом неочевидных проблем, которые были выявлены в процессе обсуждения на форуме:
ИмяФайла полный путь (например, C:\Temp\file.pdf), то сервер 1С при формировании пакета может выдать ошибку: "В контейнере отсутствуют файлы, указанные в meta.xml". Всегда передавайте в этот параметр только короткое имя файла.Закрыт для старого электронного документа в регистре сведений СостоянияПоОбъектамУчетаЭДО.ЗаполнитьОсновнуюЧастьУПД_2019 в модуле ОбменСКонтрагентамиБП. Если вы столкнулись с этим, проверьте заполнение структуры СведенияОДокументеОтгрузки в расширении.Рассмотрим ситуацию, когда у организации более 6000 счетов в месяц. Вручную нажимать кнопку в каждом документе невозможно. В этом случае мы можем создать регламентное задание, которое будет пробегать по новым счетам за день и выполнять описанный выше код. В качестве готовой альтернативы самостоятельной программной автоматизации можно использовать инструмент для группового формирования электронных документов из печатных форм.
Проанализируем структуру автоматизации:
Такой подход позволяет полностью исключить человеческий фактор и гарантировать доставку документов контрагентам в читаемом виде, независимо от того, какого оператора ЭДО они используют и настроен ли у них автоматический прием XML-формата 1С.