Как передать параметр в сервис 1С через браузер и сразу получить файл

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

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

Почему Web-сервис (SOAP) нельзя вызвать напрямую из адресной строки браузера

Проанализируем технические особенности работы стандартных Web-сервисов в платформе 1С. Они базируются на протоколе SOAP, который жестко регламентирует правила взаимодействия:

  1. Использование метода POST: Вызов операции Web-сервиса требует отправки HTTP-запроса методом POST со строго сформированным XML-конвертом (SOAP Envelope) в теле запроса.
  2. Специфические заголовки: Запрос обязательно должен содержать служебные HTTP-заголовки (например, SOAPAction для SOAP 1.1 или соответствующий Content-Type).
  3. Ограничения адресной строки браузера: Когда пользователь вводит адрес в строку браузера и нажимает Enter, браузер всегда отправляет обычный GET-запрос без тела и без необходимых SOAP-заголовков. Ссылка вида .../base/ws/DocWork.1cws?wsdl отдает только XML-описание схемы сервиса (WSDL), а передать туда параметры функции через ?param=value невозможно.

Попытка вызвать метод SOAP напрямую из браузера потребует либо написания клиентского скрипта на JavaScript с формированием XML и настройкой CORS, либо создания промежуточного веб-сервера. Однако в платформе 1С есть гораздо более простое и нативное решение — использование объекта конфигурации HTTP-сервис.

Решение: Переход на HTTP-сервисы в 1С

Разберем по шагам, как переделать отдачу файла на HTTP-сервис, чтобы браузер мог обращаться к нему простым GET-запросом и сразу скачивать сформированный файл.

В дереве метаданных конфигурации перейдем в ветку Общие — HTTP-сервисы и создадим новый сервис, например, с именем DocWork. В свойствах укажем корневой URL (например, DocWork).

Параметры из браузера можно передать двумя способами:

  1. Через параметры строки запроса (query string): Обращение происходит по адресу вида .../hs/DocWork?ID_kod=123.
  2. Через шаблон URL: В свойствах шаблона URL можно задать путь вида /{ID_kod}, тогда ссылка для пользователя примет вид .../hs/DocWork/123.

Создадим для шаблона метод с типом HTTP-метода GET и перейдем в модуль сервиса. Рассмотрим пример реализации функции-обработчика, которая считывает переданный идентификатор, получает двоичные данные файла и возвращает правильный HTTP-ответ:


Функция DocWorkОбработкаGET(Запрос)
    
    // Способ 1: Получение параметра из строки запроса (?ID_kod=...)
    ЗначениеИД = Запрос.ПараметрыЗапроса.Получить("ID_kod");
    
    // Способ 2 (если используется шаблон вида /{ID_kod}):
    // ЗначениеИД = Запрос.ПараметрыURL.Получить("ID_kod");
    
    Если Не ЗначениеЗаполнено(ЗначениеИД) Тогда
        // Возвращаем ошибку 400 Bad Request, если обязательный параметр не указан
        Возврат Новый HTTPСервисОтвет(400);
    КонецЕсли;
    
    // Получаем двоичные данные файла (например, из хранилища значений или формируем на лету)
    // ДвоичныеДанныеФайла = ПолучитьФайлПоИдентификатору(ЗначениеИД);
    
    Если ДвоичныеДанныеФайла = Неопределено Тогда
        // Возвращаем ошибку 404 Not Found, если объект не найден
        Возврат Новый HTTPСервисОтвет(404);
    КонецЕсли;
    
    // Формируем успешный ответ для браузера
    Ответ = Новый HTTPСервисОтвет(200);
    
    // Задаем тип содержимого
    Ответ.Заголовки.Вставить("Content-Type", "application/octet-stream");
    
    // Указываем браузеру, что файл нужно скачать, а не отображать в окне
    ИмяФайла = "document_" + ЗначениеИД + ".pdf";
    Ответ.Заголовки.Вставить("Content-Disposition", "attachment; filename=""" + ИмяФайла + """");
    
    // Заполняем тело ответа бинарными данными
    Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеФайла);
    
    Возврат Ответ;
    
КонецФункции

Важные нюансы при работе через браузер

Рассмотрим дополнительные моменты, с которыми придется столкнуться при обращении к сервису из браузера:

  1. Заголовок Content-Disposition: Обязательно добавляйте директиву attachment; filename="...". Без нее браузер может попытаться открыть файл внутри вкладки как простой текст или сообщить о поврежденном содержимом.
  2. Авторизация в информационной базе: При переходе по ссылке браузер по умолчанию запросит логин и пароль через стандартное окно базовой аутентификации (Basic Auth). Передавать логин и пароль прямо в ссылке вида http://user:password@server/... нельзя, так как современные браузеры блокируют такие URL в целях безопасности.
  3. Анонимный доступ: Если требуется предоставить скачивание файлов без ввода учетных данных пользователем, настройте публикацию информационной базы на веб-сервере. В файле default.vrd в параметрах строки подключения базы можно явно указать специального служебного пользователя с минимальными правами (параметры usr=...;pwd=...;).

Альтернативный вариант: Стандартный интерфейс OData

Если нет возможности дорабатывать конфигурацию и создавать новый HTTP-сервис, проанализируем еще одну стандартную возможность платформы. Если файл уже хранится в типовом справочнике или регистре в реквизите с типом ХранилищеЗначения, и в базе включен стандартный интерфейс OData, то скачать двоичные данные можно стандартным GET-запросом прямо из адресной строки браузера без написания программного кода:

Для этого используется суффикс /$value в конце адреса нужного реквизита, например:

http://сервер/база/odata/standard.odata/Справочник_Файлы(guid'00000000-0000-0000-0000-000000000000')/ХранилищеФайла/$value

При таком запросе платформа 1С автоматически сформирует бинарный поток и отдаст файл клиенту.

← На главную