При интеграции сторонних систем (интернет-магазинов, CRM-систем, личных кабинетов) с платформой 1С часто возникает бизнес-требование: получить готовую печатную форму документа (например, счета на оплату) в формате PDF или XLS, зная только его уникальный идентификатор (GUID). Разработчики, не искушенные в архитектуре 1С, часто рассчитывают решить эту задачу "в лоб" с помощью стандартного REST-интерфейса (OData), отправляя запросы к базе данных.
Однако при попытке найти стандартный метод генерации печатных форм через OData мы неизбежно сталкиваемся с техническим ограничением платформы. Давайте подробно разберем, почему стандартный REST-интерфейс не решает эту задачу напрямую, проанализируем архитектурные особенности 1С и рассмотрим три практических способа получения печатных форм в формате PDF/XLS, включая варианты без изменения типовой конфигурации.
Разберем причину этого ограничения. Стандартный REST-интерфейс 1С — это инструмент автоматического экспорта данных. Он сопоставляет таблицы базы данных 1С (справочники, документы, регистры) с ресурсами REST. Когда мы обращаемся к документу "Счет на оплату" через OData, платформа возвращает нам набор полей: дату, номер, контрагента, договор и табличную часть с товарами.
Печатная форма (PDF или XLS) — это не данные, а их визуальное представление. Чтобы получить печатную форму, платформа должна выполнить программный код: обратиться к макету, рассчитать итоги, заполнить области табличного документа и скомпоновать их. Стандартный OData-интерфейс не умеет выполнять произвольный программный код и генерировать визуальные формы "на лету". Он просто ничего не знает о существовании печатной формы "Счет на оплату".
Тем не менее, решить эту задачу можно. Ниже мы разберем три готовых сценария реализации этой задачи.
---
Рассмотрим вариант, когда нам категорически запрещено вносить какие-либо изменения в конфигурацию 1С (даже использовать расширения), но в системе включен стандартный интерфейс OData. В этом случае мы можем задействовать штатный механизм Библиотеки Стандартных Подсистем (БСП) — "Присоединенные файлы".
Идея заключается в том, чтобы заставить саму систему 1С предварительно формировать PDF-файл счета при его проведении и прикреплять этот файл к документу. Как только файл физически записывается в базу данных, он становится обычной записью справочника и становится доступен через стандартный OData.
Проанализируем шаги реализации этого механизма:
Catalog_ИмяДокументаПрисоединенныеФайлы. Например, для получения списка файлов, прикрепленных к конкретному счету, мы отправляем GET-запрос:
/odata/standard.odata/Catalog_СчетНаОплатуПокупателюПрисоединенныеФайлы?$filter=ВладелецФайла_Type eq 'StandardODATA.Document_СчетНаОплатуПокупателю' and ВладелецФайла eq guid'идентификатор_вашего_счета'
ФайлХранилище), либо во вспомогательном регистре сведений. Мы считываем этот реквизит, получаем данные в кодировке Base64, после чего на стороне нашего внешнего приложения декодируем их обратно в бинарный PDF-файл.Этот способ позволяет решить задачу, используя исключительно стандартный REST-интерфейс 1С, не написав ни одной строчки кода внутри самой 1С.
---
Если нам нужно получать актуальную печатную форму "на лету" без засорения базы данных присоединенными файлами, оптимальным решением является создание собственного 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/идентификатор_документа.
---
Рассмотрим третий подход, который выбрал автор темы на форуме. Если мы категорически не хотим трогать конфигурацию 1С (даже создавать расширения) и не хотим сохранять файлы в базе данных, мы можем полностью перенести логику визуализации и формирования PDF на сторону нашего внешнего веб-сервера (например, на Node.js, Python, PHP или C#).
Стандартный OData-интерфейс 1С предоставляет для этого все необходимые инструменты. Чтобы не делать десятки последовательных запросов в базу 1С (сначала за шапкой документа, потом за табличной частью, затем за реквизитами контрагентов), мы можем использовать мощный механизм системного запроса OData под названием $expand.
Проанализируем структуру запроса, который позволяет получить всю информацию о счете за один шаг:
/odata/standard.odata/Document_СчетНаОплатуПокупателю(guid'ваша_строка_guid')?$expand=Товары,Контрагент,Организация,БанковскийСчетОрганизации
Этот запрос вернет нам структурированный JSON-ответ, содержащий:
Товары (наименования, артикулы, количество, цены, ставки и суммы НДС).Организации (ИНН, КПП, Юридический адрес) и её БанковскогоСчетаОрганизации (БИК, Корр. счет, Номер счета, Наименование банка) для формирования платежного поручения.Контрагент).Получив этот JSON на стороне внешнего сервера, мы выполняем следующие шаги:
Несмотря на то, что этот вариант требует написания HTML-шаблона печатной формы на стороне внешнего сервера, он обеспечивает полную автономность работы от изменений в 1С и исключает любую нагрузку на сервер 1С по генерации графических файлов.
---
Мы подробно разобрали три различных архитектурных подхода к получению печатных форм документов 1С через REST API. Выбор конкретного решения зависит от требований вашего проекта:
$expand).