Как сохранить печатную форму в файл при интеграции 1С с внешними системами?

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

В процессе разработки интеграционных решений между 1С и внешними системами (например, Telegram-ботами или веб-сервисами) часто возникает потребность получить печатную форму документа, сформированную в 1С, и передать её в виде файла во внешнюю среду. Многие разработчики пытаются реализовать это через протокол OData, однако сталкиваются с фундаментальными ограничениями платформы. Давайте разберем, почему OData здесь не подходит и как правильно построить архитектуру обмена.

Почему OData не подходит для получения печатных форм

Важно понимать, что протокол OData предназначен исключительно для выполнения CRUD-операций (создание, чтение, обновление, удаление) над объектами метаданных, такими как Справочники, Документы или Регистры сведений. Печатная форма в 1С — это объект типа ТабличныйДокумент, который существует только в оперативной памяти в момент выполнения интерактивного или серверного кода.

OData не умеет:

  1. Вызывать методы менеджеров документов, например, ПечатьСчета.
  2. Передавать параметры для формирования отчетов или печатных форм.
  3. Получать бинарные данные, которые генерируются «на лету» в процессе выполнения кода.

Попытки реализовать печать через OData приведут к тупику, так как этот API работает с данными базы данных, а не с бизнес-логикой конфигурации.

Решение: использование HTTP-сервисов 1С

Наиболее современным и правильным способом реализации такой задачи является создание собственного HTTP-сервиса внутри конфигурации 1С. Этот подход позволяет вам полностью контролировать процесс формирования печатной формы и возвращать готовый файл (PDF, Excel) прямо в ответ на HTTP-запрос.

Разберем этапы реализации этого решения:

  1. Создание HTTP-сервиса: В конфигураторе добавьте новый объект HTTP-сервис, создайте в нем шаблон URL (например, /GetInvoice/{RefID}) и метод GET.
  2. Разработка кода обработки: В обработчике метода вы будете получать ссылку на документ по идентификатору, переданному из внешнего бота.
  3. Формирование документа: С помощью серверных процедур вы вызываете стандартную печатную форму объекта, получая на выходе объект ТабличныйДокумент.
  4. Запись и отправка: Используйте метод Записать() объекта ТабличныйДокумент для сохранения в поток или временный файл, после чего сформируйте HTTPResponse с этим содержимым.

Пример реализации формирования файла в коде

Рассмотрим пример кода, который можно поместить в обработчик вашего HTTP-сервиса. Предположим, что у нас есть ссылка на документ, и нам нужно вернуть его в формате PDF:


// Пример логики формирования печатной формы
// Получаем документ по переданному идентификатору
ДокументСсылка = ПолучитьСсылкуИзСтроки(RefID);

// Формируем табличный документ (у каждой конфигурации это свой метод)
// Часто используется вызов через МенеджерПечати
ТабДок = ПечатнаяФорма.СформироватьПечатнуюФорму(ДокументСсылка);

// Сохраняем табличный документ в поток
ДвоичныеДанные = Новый ДвоичныеДанные;
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

// Формируем ответ для бота
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзФайла(ИмяФайла);
Ответ.Заголовки.Вставить("Content-Type", "application/pdf");
Возврат Ответ;

Преимущества архитектуры через HTTP-сервис

Данный метод обладает рядом ключевых преимуществ:

В заключение отметим, что для задач интеграции, требующих выполнения сложной бизнес-логики (печать, проведение документов, сложные расчеты), всегда следует использовать HTTP-сервисы или Web-сервисы (SOAP), оставляя OData только для простых операций чтения и записи данных.

← На главную