Как получить печатную форму счета в формате PDF или XLS по GUID через REST API 1С?

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

При интеграции сторонних систем (интернет-магазинов, CRM-систем, личных кабинетов) с платформой 1С часто возникает бизнес-требование: получить готовую печатную форму документа (например, счета на оплату) в формате PDF или XLS, зная только его уникальный идентификатор (GUID). Разработчики, не искушенные в архитектуре 1С, часто рассчитывают решить эту задачу "в лоб" с помощью стандартного REST-интерфейса (OData), отправляя запросы к базе данных.

Однако при попытке найти стандартный метод генерации печатных форм через OData мы неизбежно сталкиваемся с техническим ограничением платформы. Давайте подробно разберем, почему стандартный REST-интерфейс не решает эту задачу напрямую, проанализируем архитектурные особенности 1С и рассмотрим три практических способа получения печатных форм в формате PDF/XLS, включая варианты без изменения типовой конфигурации.

Почему стандартный OData не умеет отдавать PDF?

Разберем причину этого ограничения. Стандартный REST-интерфейс 1С — это инструмент автоматического экспорта данных. Он сопоставляет таблицы базы данных 1С (справочники, документы, регистры) с ресурсами REST. Когда мы обращаемся к документу "Счет на оплату" через OData, платформа возвращает нам набор полей: дату, номер, контрагента, договор и табличную часть с товарами.

Печатная форма (PDF или XLS) — это не данные, а их визуальное представление. Чтобы получить печатную форму, платформа должна выполнить программный код: обратиться к макету, рассчитать итоги, заполнить области табличного документа и скомпоновать их. Стандартный OData-интерфейс не умеет выполнять произвольный программный код и генерировать визуальные формы "на лету". Он просто ничего не знает о существовании печатной формы "Счет на оплату".

Тем не менее, решить эту задачу можно. Ниже мы разберем три готовых сценария реализации этой задачи.

---

Вариант 1. Использование механизма "Присоединенных файлов" через стандартный OData (Без изменения конфигурации)

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

Идея заключается в том, чтобы заставить саму систему 1С предварительно формировать PDF-файл счета при его проведении и прикреплять этот файл к документу. Как только файл физически записывается в базу данных, он становится обычной записью справочника и становится доступен через стандартный OData.

Проанализируем шаги реализации этого механизма:

  1. Настройка автосохранения в 1С: В типовых конфигурациях (например, 1С:УНФ, 1С:ERP, 1С:Комплексная автоматизация) можно настроить регламентное задание или использовать штатную подсистему печати, чтобы при записи или проведении документа "Счет на оплату покупателю" автоматически генерировалась его печатная форма в формате PDF и сохранялась в присоединенные файлы документа.
  2. Запрос списка присоединенных файлов через OData: Зная GUID исходного счета на оплату, наше внешнее приложение обращается к справочнику присоединенных файлов этого документа. Имя этого справочника в OData формируется по принципу Catalog_ИмяДокументаПрисоединенныеФайлы. Например, для получения списка файлов, прикрепленных к конкретному счету, мы отправляем GET-запрос:

    /odata/standard.odata/Catalog_СчетНаОплатуПокупателюПрисоединенныеФайлы?$filter=ВладелецФайла_Type eq 'StandardODATA.Document_СчетНаОплатуПокупателю' and ВладелецФайла eq guid'идентификатор_вашего_счета'

  3. Получение двоичных данных файла: Найдя нужный файл в списке (например, по имени "Счет на оплату.pdf"), мы запрашиваем его двоичные данные. В зависимости от версии БСП, двоичные данные могут храниться либо непосредственно в реквизите справочника (например, в реквизите ФайлХранилище), либо во вспомогательном регистре сведений. Мы считываем этот реквизит, получаем данные в кодировке Base64, после чего на стороне нашего внешнего приложения декодируем их обратно в бинарный PDF-файл.

Этот способ позволяет решить задачу, используя исключительно стандартный REST-интерфейс 1С, не написав ни одной строчки кода внутри самой 1С.

---

Вариант 2. Создание HTTP-сервиса через Расширение конфигурации

Если нам нужно получать актуальную печатную форму "на лету" без засорения базы данных присоединенными файлами, оптимальным решением является создание собственного HTTP-сервиса. Чтобы не снимать конфигурацию с поддержки и не усложнять процесс последующих обновлений системы, мы разработаем этот сервис в **расширении конфигурации**.

Разберем по шагам, как быстро реализовать этот механизм:

Шаг 1. Создание расширения и добавление HTTP-сервиса

Создадим новое расширение в конфигураторе. Добавим в него новый объект HTTP-сервисы (например, с именем ПечатьДокументов) и укажем корневой URL (например, print). Создадим шаблон URL вида /invoice/{ID} и добавим для него метод GET с обработчиком в модуле HTTP-сервиса.

Шаг 2. Написание программного кода генерации PDF

В модуле нашего HTTP-сервиса напишем функцию-обработчик запроса. Наша задача — получить переданный в URL идентификатор (GUID) документа, найти сам документ в базе, сформировать его табличный документ программно, сохранить его во временный PDF-файл и вернуть двоичные данные клиенту.

Посмотрим на пример реализации кода на стороне 1С:


Функция ПолучитьСчетВФорматеPDF(Запрос)
    
    // Извлекаем GUID документа из параметров URL
    СтрокаGUID = Запрос.ПараметрыШаблонаURL.Получить("ID");
    
    Попытка
        СсылкаНаДокумент = Документы.СчетНаОплатуПокупателю.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID));
        Если СсылкаНаДокумент.Пустая() Тогда
            ВызватьИсключение "Документ с указанным GUID не найден в базе данных.";
        КонецЕсли;
    Исключение
        Ответ = Новый HTTPСервисОтвет(404);
        Ответ.УстановитьТелоИзСтроки("Ошибка: Неверный идентификатор документа или документ отсутствует.");
        Возврат Ответ;
    КонецПопытки;
    
    // Формируем печатную форму документа стандартными средствами БСП
    // В зависимости от конфигурации, имя макета и вызов процедуры печати могут отличаться
    ТабличныеДокументы = Новый Массив;
    ОбъектыПечати = Новый СписокЗначений;
    ОбъектыПечати.Добавить(СсылкаНаДокумент);
    
    ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
    
    // Вызываем стандартный менеджер печати для формирования табличного документа
    ТабличныйДокумент = Новый ТабличныйДокумент;
    Документы.СчетНаОплатуПокупателю.Печать(ОбъектыПечати, Новый Соответствие, ТабличныеДокументы, ОбъектыПечати, ПараметрыВывода);
    
    Если ТабличныеДокументы.Количество() = 0 Тогда
        Ответ = Новый HTTPСервисОтвет(500);
        Ответ.УстановитьТелоИзСтроки("Ошибка формирования печатной формы.");
        Возврат Ответ;
    КонецЕсли;
    
    ТабДок = ТабличныеДокументы[0];
    
    // Сохраняем табличный документ во временный файл в формате PDF
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
    ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);
    
    // Читаем двоичные данные полученного файла
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяВременногоФайла);
    
    // Формируем HTTP-ответ
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеФайла);
    Ответ.Заголовки.Вставить("Content-Type", "application/pdf");
    Ответ.Заголовки.Вставить("Content-Disposition", "inline; filename=""invoice_" + СтрокаGUID + ".pdf""");
    
    // Удаляем временный файл с диска сервера
    Попытка
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
        // Логируем ошибку удаления, если это необходимо
    КонецПопытки;
    
    Возврат Ответ;
    
КонецФункции

При публикации информационной базы на веб-сервере не забудьте убедиться, что в диалоговом окне публикации установлена галочка "Публиковать HTTP-сервисы расширений по умолчанию". Теперь ваше внешнее приложение сможет мгновенно получать готовый PDF-файл по простому GET-запросу вида: http://server/base/hs/print/invoice/идентификатор_документа.

---

Вариант 3. Детализация генерации на стороне внешнего сервера (Подход автора)

Рассмотрим третий подход, который выбрал автор темы на форуме. Если мы категорически не хотим трогать конфигурацию 1С (даже создавать расширения) и не хотим сохранять файлы в базе данных, мы можем полностью перенести логику визуализации и формирования PDF на сторону нашего внешнего веб-сервера (например, на Node.js, Python, PHP или C#).

Стандартный OData-интерфейс 1С предоставляет для этого все необходимые инструменты. Чтобы не делать десятки последовательных запросов в базу 1С (сначала за шапкой документа, потом за табличной частью, затем за реквизитами контрагентов), мы можем использовать мощный механизм системного запроса OData под названием $expand.

Проанализируем структуру запроса, который позволяет получить всю информацию о счете за один шаг:

/odata/standard.odata/Document_СчетНаОплатуПокупателю(guid'ваша_строка_guid')?$expand=Товары,Контрагент,Организация,БанковскийСчетОрганизации

Этот запрос вернет нам структурированный JSON-ответ, содержащий:

Получив этот JSON на стороне внешнего сервера, мы выполняем следующие шаги:

  1. Создаем HTML/CSS-верстку, которая визуально полностью копирует оригинальную печатную форму счета 1С.
  2. Используя шаблонизатор (например, Handlebars, Jinja2 или Blade), подставляем данные из JSON-ответа 1С в наш HTML-шаблон.
  3. Рендерим готовый HTML-код в PDF-файл с помощью популярных серверных библиотек конвертации, таких как:
    • Puppeteer (Node.js) — запускает безголовый браузер Chromium для идеального рендеринга сложных CSS-стилей.
    • Weasyprint или pdfkit (Python) — быстрые библиотеки генерации документов из HTML/CSS.
    • mpdf или dompdf (PHP) — популярные инструменты для веб-разработчиков.

Несмотря на то, что этот вариант требует написания HTML-шаблона печатной формы на стороне внешнего сервера, он обеспечивает полную автономность работы от изменений в 1С и исключает любую нагрузку на сервер 1С по генерации графических файлов.

---

Резюме и рекомендации

Мы подробно разобрали три различных архитектурных подхода к получению печатных форм документов 1С через REST API. Выбор конкретного решения зависит от требований вашего проекта:

← На главную