Как организовать передачу и отображение PDF-документов из 1С на внешнем сайте?

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

В современной практике автоматизации часто возникает задача предоставить клиентам доступ к документам (счетам, УПД, актам) напрямую из личного кабинета на сайте. При этом документы должны формироваться в 1С «на лету», чтобы отражать самые актуальные данные. Рассмотрим подробнее, как реализовать этот процесс, избежав типичных ошибок с безопасностью и лицензированием.

Метод 1. Прямая передача через HTTP-сервисы 1С

Проанализируем наиболее современный подход: использование встроенных HTTP-сервисов платформы 1С:Предприятие 8.3. Чтобы ускорить разработку таких интерфейсов, можно использовать универсальный модуль с процедурами для быстрого создания API. Этот метод позволяет сайту отправить запрос в 1С, получить в ответ двоичные данные файла и сразу отдать их пользователю. Выясним причину, по которой этот метод предпочтительнее FTP: он исключает необходимость промежуточного хранилища и сложной синхронизации прав доступа.

Разберем по шагам, как это работает на стороне 1С. Мы создаем HTTP-сервис с шаблоном URL, принимающим идентификатор документа. При промышленной эксплуатации важно, чтобы была правильно выполнена публикация HTTP-сервиса с использованием клиентского SSL-сертификата для защиты канала связи. В обработчике запроса 1С формирует печатную форму, сохраняет её во временный файл и преобразует в двоичные данные.

Посмотрим на пример кода для реализации такого сервиса:


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

Важный момент: использование метода inline в заголовке Content-Disposition позволяет браузеру открыть файл прямо в окне, а attachment принудительно инициирует скачивание.

Метод 2. Передача данных в формате Base64

Если архитектура сайта требует получения данных в формате JSON, проанализируем вариант с кодированием Base64. В этом случае 1С преобразует PDF-файл в текстовую строку. Рассмотрим подробнее: этот метод удобен для AJAX-запросов, а для гибкой работы со структурами данных можно применить модуль «Трансформер» для конвертации JSON/XML/TOON. Это позволяет передать вместе с файлом дополнительные метаданные (номер документа, дату, сумму).

Пример преобразования в 1С:


// Превращаем двоичные данные в строку для JSON
СтрокаBase64 = Base64Строка(ДанныеФайла);

// Формируем структуру ответа
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("fileName", "doc.pdf");
СтруктураОтвета.Вставить("fileBody", СтрокаBase64);

На стороне сайта разработчики используют функции декодирования (например, atob() в JavaScript) для восстановления файла.

Метод 3. Использование промежуточного хранилища S3 или MinIO

В ситуациях, когда нагрузка на 1С велика, или файлы должны быть доступны длительное время, разберем архитектуру с внешним объектным хранилищем. Вместо того чтобы отдавать файл напрямую, 1С выгружает его в хранилище, поддерживающее протокол S3 (например, MinIO — отличное self-hosted решение).

  1. Сайт запрашивает документ у 1С через API.
  2. 1С проверяет, есть ли актуальный PDF в хранилище.
  3. Если нет — генерирует его и загружает в S3.
  4. 1С возвращает сайту временную подписанную ссылку (presigned URL) на файл.
  5. Клиент скачивает файл напрямую из S3, не нагружая сервер 1С.

Этот подход значительно повышает отказоустойчивость системы. Если база 1С будет временно недоступна (например, во время обновления), ранее сформированные документы останутся доступными в хранилище.

Оптимизация и защита: Архитектурный паттерн «Прослойка»

Выясним причину опасений многих системных администраторов: публикация базы 1С напрямую в интернет создает риски атак и быстрого исчерпания лицензий. Проанализируем решение этой проблемы, используя альтернативный подход к обработке HTTP-запросов в 1С с помощью прослойки на Go или Node.js.

Преимущества использования прослойки:

Юридическая значимость: «Свое ЭДО» против официального

Разберем важный вопрос: является ли PDF-файл из 1С юридически значимым? Как правильно заметили участники обсуждения, без квалифицированной электронной подписи (КЭП) — это «филькина грамота». Однако мы можем легитимизировать такие документы, прописав в договоре с клиентом использование Простой электронной подписи (ПЭП).

Согласно 63-ФЗ «Об электронной подписи», стороны могут договориться, что действия в личном кабинете (авторизация по логину/паролю + нажатие кнопки) приравниваются к подписанию документа. В этом случае графический оттиск печати в PDF становится юридическим подтверждением факта оказания услуги в рамках конкретного договора.

Для повышения доверия рекомендуем добавить визуализацию штампа ЭЦП. В 1С это реализуется программным наложением картинки с данными сертификата на табличный документ перед сохранением в PDF.

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

Посмотрим на итоговый алгоритм выбора решения:

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

← На главную