Как настроить автоматическую отправку Счетов на оплату в формате PDF через 1С-ЭДО

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При использовании 1С-ЭДО пользователи часто сталкиваются с проблемой: по умолчанию счета на оплату отправляются в формате XML (CommerceML 2.08). Если контрагент использует другого оператора (например, СБИС или Диадок), система на стороне получателя может некорректно отображать такой документ или вовсе его не «понимать». Самым надежным решением является отправка счета в виде произвольного документа с вложением в формате PDF. В рамках данной статьи мы разберем, как автоматизировать этот процесс программно, используя возможности современных релизов 1С:Бухгалтерии 8.3.

Почему формат XML вызывает сложности в роуминге

Разберем причину возникновения проблемы. Формат CML 2.08 является внутренним стандартом фирмы 1С. В отличие от УПД, для которых ФНС утвердила строгие форматы, счет на оплату не имеет единого государственного стандарта. В результате при передаче через роуминг операторы не всегда могут корректно визуализировать XML-данные. Использование PDF гарантирует, что контрагент увидит ровно ту печатную форму, которую сформировал бухгалтер в своей базе.

Реализация формирования PDF-счета и создание электронного документа

Для автоматизации процесса нам потребуется написать код, который будет программно «печать» счет в PDF, помещать его во временное хранилище и создавать на его основе объект 1С-ЭДО. Рассмотрим основной алгоритм реализации в общем модуле или расширении.

Проанализируем функцию формирования файла. Нам необходимо получить табличный документ счета, сохранить его на диск (или сразу в поток) и передать данные в подсистему ЭДО.


Функция СформироватьСчетНаОплатуPDF(СсылкаНаОбъект, АдресКаталога, ПараметрыСоздания) Экспорт
    
    // Заполняем параметры создания электронного документа
    ПараметрыСоздания.ВидДокумента = Справочники.ВидыДокументовЭДО.НайтиПоНаименованию("Счет на оплату").Ссылка;
    ПараметрыСоздания.ДатаДокумента = СсылкаНаОбъект.Дата;
    ПараметрыСоздания.Контрагент = СсылкаНаОбъект.Контрагент;
    ПараметрыСоздания.НомерДокумента = СсылкаНаОбъект.Номер; 
    ПараметрыСоздания.Организация = СсылкаНаОбъект.Организация; 
    ПараметрыСоздания.СуммаДокумента = СсылкаНаОбъект.СуммаДокумента;

    // Получаем печатную форму (используем стандартные механизмы печати конфигурации)
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(СсылкаНаОбъект);
    
    // Формируем коллекцию печатных форм
    КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("СчетНаОплату");
    ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
    
    // Вызываем процедуру печати из менеджера документа или обработки
    Обработки.ПечатьСчетаНаОплату.Печать(МассивОбъектов, Новый Структура, КоллекцияПечатныхФорм, Новый СписокЗначений(), ПараметрыВывода);
    
    ТабличныйДокумент = КоллекцияПечатныхФорм[0].ТабличныйДокумент;
    
    // Формируем имя файла
    СтрокаИмениФайла = "Счет на оплату " + СсылкаНаОбъект.Номер + " от " + Формат(СсылкаНаОбъект.Дата, "ДФ=dd.MM.yyyy") + ".pdf";
    ПолноеИмяФайла = АдресКаталога + СтрокаИмениФайла;
    
    // Записываем PDF на диск
    ТабличныйДокумент.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.PDF);
            
    ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла);
        
    ПФ = Новый Структура;
    ПФ.Вставить("ИмяФайла", СтрокаИмениФайла);
    ПФ.Вставить("АдресХранилища", ПоместитьВоВременноеХранилище(ДвоичныеДанные));
    
    Возврат ПФ;
КонецФункции

Интеграция с подсистемой Библиотеки электронных документов (БЭД)

После того как файл сформирован, необходимо инициировать процесс создания ЭД. В новых версиях 1С (начиная с релизов 3.0.92 и выше) разработчики существенно обновили программный интерфейс. Теперь для этого рекомендуется использовать метод НачатьСозданиеЭлектронногоДокументаПоФайлу.

Рассмотрим пример вызова этой процедуры на стороне клиента. Важно понимать, что работа с ЭДО часто требует асинхронного подхода (использование описаний оповещений).


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

Важные технические нюансы и работа над ошибками

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

  1. Ошибка транспортного контейнера в клиент-серверной версии: Если при вызове функции создания документа передать в параметре ИмяФайла полный путь (например, C:\Temp\file.pdf), то сервер 1С при формировании пакета может выдать ошибку: "В контейнере отсутствуют файлы, указанные в meta.xml". Всегда передавайте в этот параметр только короткое имя файла.
  2. Закрытые периоды: В обновленных версиях БЭД при попытке отправить документ из закрытого периода система может пытаться перезаписать документ-основание (например, устанавливать статус или признак подписания). Выясним причину: 1С перешла на хранение состояний в регистрах, но в некоторых релизах осталась связь с записью в сам объект. Рекомендуется использовать расширение для обхода проверки даты запрета при записи только технических реквизитов ЭДО.
  3. Дублирование в «Текущих делах»: Иногда при программном создании счета в PDF старый XML-счет продолжает висеть в списке «К отправке». Разберем, как это лечится: необходимо программно установить состояние Закрыт для старого электронного документа в регистре сведений СостоянияПоОбъектамУчетаЭДО.
  4. Графа 5а в Счетах-фактурах (УПД): Хотя тема посвящена счетам, участники отметили важный баг релизов 3.0.95-3.0.96. В электронном УПД в поле «Документ об отгрузке» (графа 5а) попадал номер самого СФ, а не документа реализации. Это происходит из-за особенностей работы функции ЗаполнитьОсновнуюЧастьУПД_2019 в модуле ОбменСКонтрагентамиБП. Если вы столкнулись с этим, проверьте заполнение структуры СведенияОДокументеОтгрузки в расширении.

Массовая обработка счетов

Рассмотрим ситуацию, когда у организации более 6000 счетов в месяц. Вручную нажимать кнопку в каждом документе невозможно. В этом случае мы можем создать регламентное задание, которое будет пробегать по новым счетам за день и выполнять описанный выше код. В качестве готовой альтернативы самостоятельной программной автоматизации можно использовать инструмент для группового формирования электронных документов из печатных форм.

Проанализируем структуру автоматизации:

Такой подход позволяет полностью исключить человеческий фактор и гарантировать доставку документов контрагентам в читаемом виде, независимо от того, какого оператора ЭДО они используют и настроен ли у них автоматический прием XML-формата 1С.

← На главную