В процессе разработки интеграционных решений между 1С и внешними системами (например, Telegram-ботами или веб-сервисами) часто возникает потребность получить печатную форму документа, сформированную в 1С, и передать её в виде файла во внешнюю среду. Многие разработчики пытаются реализовать это через протокол OData, однако сталкиваются с фундаментальными ограничениями платформы. Давайте разберем, почему OData здесь не подходит и как правильно построить архитектуру обмена.
Важно понимать, что протокол OData предназначен исключительно для выполнения CRUD-операций (создание, чтение, обновление, удаление) над объектами метаданных, такими как Справочники, Документы или Регистры сведений. Печатная форма в 1С — это объект типа ТабличныйДокумент, который существует только в оперативной памяти в момент выполнения интерактивного или серверного кода.
OData не умеет:
ПечатьСчета.Попытки реализовать печать через OData приведут к тупику, так как этот API работает с данными базы данных, а не с бизнес-логикой конфигурации.
Наиболее современным и правильным способом реализации такой задачи является создание собственного HTTP-сервиса внутри конфигурации 1С. Этот подход позволяет вам полностью контролировать процесс формирования печатной формы и возвращать готовый файл (PDF, Excel) прямо в ответ на HTTP-запрос.
Разберем этапы реализации этого решения:
HTTP-сервис, создайте в нем шаблон URL (например, /GetInvoice/{RefID}) и метод GET.ТабличныйДокумент.Записать() объекта ТабличныйДокумент для сохранения в поток или временный файл, после чего сформируйте HTTPResponse с этим содержимым.Рассмотрим пример кода, который можно поместить в обработчик вашего HTTP-сервиса. Предположим, что у нас есть ссылка на документ, и нам нужно вернуть его в формате PDF:
// Пример логики формирования печатной формы
// Получаем документ по переданному идентификатору
ДокументСсылка = ПолучитьСсылкуИзСтроки(RefID);
// Формируем табличный документ (у каждой конфигурации это свой метод)
// Часто используется вызов через МенеджерПечати
ТабДок = ПечатнаяФорма.СформироватьПечатнуюФорму(ДокументСсылка);
// Сохраняем табличный документ в поток
ДвоичныеДанные = Новый ДвоичныеДанные;
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
// Формируем ответ для бота
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзФайла(ИмяФайла);
Ответ.Заголовки.Вставить("Content-Type", "application/pdf");
Возврат Ответ;
Данный метод обладает рядом ключевых преимуществ:
PDF, XLSX, DOCX, просто меняя параметры метода Записать.В заключение отметим, что для задач интеграции, требующих выполнения сложной бизнес-логики (печать, проведение документов, сложные расчеты), всегда следует использовать HTTP-сервисы или Web-сервисы (SOAP), оставляя OData только для простых операций чтения и записи данных.