К статье
Практический материал

Разработка и Конфигурация · 10 мин

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

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

Передача файлов через веб-сервисы — типовая задача интеграции 1С с внешними системами: сайтами, мобильными приложениями, другими учётными базами. У платформы 1С:Предприятие есть два основных механизма — классические SOAP веб-сервисы и HTTP-сервисы (REST-подход). Файл в обоих случаях передаётся либо как двоичные данные в теле запроса, либо в виде строки Base64 внутри XML или JSON.

Выбор способа зависит от размера файла, формата обмена и возможностей внешней системы. Небольшие документы (счета, акты, картинки до нескольких мегабайт) удобно передавать в Base64 прямо в структуре сообщения. Большие файлы — архивы, видео, выгрузки — лучше передавать бинарным потоком через тело HTTP-запроса, чтобы не тратить память на кодирование.

Ниже разобраны оба подхода с готовыми примерами кода на встроенном языке 1С: публикация сервиса, приём файла на стороне сервера 1С, отправка файла из 1С во внешний сервис, а также типичные ошибки и ограничения.

Выбор способа передачи: Base64 или двоичные данные

Base64 — это текстовое кодирование бинарных данных. Его главное преимущество: файл можно вставить прямо в структуру XML или JSON вместе с другими реквизитами (именем файла, датой, типом документа). Недостаток — рост объёма примерно на треть и дополнительные затраты памяти на кодирование и декодирование. Для файлов больше 10–20 мегабайт это уже ощутимо.

Передача двоичных данных в теле HTTP-запроса экономнее: файл уходит «как есть», без накладных расходов. Но в этом случае метаданные приходится передавать отдельно — в заголовках, параметрах URL или в multipart-формате. Такой подход естественен для HTTP-сервисов и плохо сочетается с классическим SOAP.

Сравнение вариантов

Base64 в SOAP веб-сервисе

Подходит для небольших файлов и строгих контрактов обмена. Ограничение: рост объёма сообщения и нагрузка на память при больших файлах.

Base64 в JSON (HTTP-сервис)

Удобен, когда файл идёт вместе с набором реквизитов в одном JSON. Ограничение то же — не для больших файлов.

Двоичные данные в теле POST

Оптимально для больших файлов. Метаданные передаются в заголовках или параметрах URL, что требует дисциплины в описании API.

Multipart/form-data

Позволяет в одном запросе передать и файл, и поля формы. В 1С тело multipart приходится формировать вручную.

Подготовка: публикация веб-сервиса

Чтобы 1С могла принимать файлы снаружи, сервис нужно опубликовать на веб-сервере (IIS или Apache). Делается это через конфигуратор: меню «Администрирование» → «Публикация на веб-сервере». На вкладке публикации отметьте нужные HTTP-сервисы или веб-сервисы и выполните публикацию. После этого сервис доступен по адресу вида http://server/base/hs/api/upload для HTTP-сервиса или http://server/base/ws/Exchange.1cws для SOAP.

Проверьте два момента до начала отладки обмена. Первый — анонимный доступ или аутентификация: если сервис требует логин, внешняя система должна передавать учётные данные (Basic-аутентификация в заголовке Authorization). Второй — права пользователя, от имени которого выполняется сервис: ему нужны права на запись тех объектов, куда сохраняется файл.

Приём файла в HTTP-сервисе 1С

Создайте в конфигураторе объект «HTTP-сервис», добавьте шаблон URL (например, /upload) и метод POST. В обработчике метода файл доступен через тело запроса: Запрос.ПолучитьТелоКакДвоичныеДанные() возвращает объект ДвоичныеДанные, который можно сразу записать на диск или в хранилище значения.

Пример обработчика, принимающего файл и сохраняющего его во временный каталог:

Функция UploadPOST(Запрос)

ДвоичныеДанные = Запрос.ПолучитьТелоКакДвоичныеДанные();

ИмяФайла = Запрос.ПараметрыURL.Получить("filename");

Если ИмяФайла = Неопределено Тогда

ИмяФайла = "file_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss") + ".bin";

КонецЕсли;

ПолныйПуть = "C:\1C_Files\" + ИмяФайла;

ДвоичныеДанные.Записать(ПолныйПуть);

Ответ = Новый HTTPСервисОтвет(200);

Ответ.УстановитьТелоИзСтроки("Файл сохранён: " + ИмяФайла);

Возврат Ответ;

КонецФункции

Если файл приходит в JSON вместе с реквизитами, тело читается как строка, разбирается через ПрочитатьJSON(), а поле с содержимым декодируется функцией Base64Значение(СтрокаФайла). Результат — те же ДвоичныеДанные, дальше логика идентична.

Приём файла в SOAP веб-сервисе 1С

В SOAP веб-сервисе файл передаётся как параметр операции. В конфигураторе создайте веб-сервис, добавьте операцию (например, UploadFile) с параметрами: FileData типа base64Binary и FileName типа string. Тип base64Binary — стандартный способ передачи бинарных данных в SOAP, платформа автоматически преобразует его в ХранилищеЗначения или двоичные данные в зависимости от настройки.

Пример обработчика операции:

Функция UploadFile(FileData, FileName)

// FileData приходит как двоичные данные (или хранилище значения)

ПолныйПуть = "C:\1C_Files\" + FileName;

FileData.Записать(ПолныйПуть);

Возврат "OK: " + FileName;

КонецФункции

После публикации WSDL-описание сервиса доступно по адресу http://server/base/ws/ИмяСервиса?wsdl. Внешняя система (C#, Java, PHP, другая база 1С) генерирует по нему клиентский код и вызывает операцию, передавая файл в виде массива байт — кодирование в Base64 выполняется автоматически на уровне SOAP-клиента.

Отправка файла из 1С во внешний сервис

Обратная задача — когда 1С выступает клиентом и отправляет файл во внешний API. Используется объект HTTPСоединение и HTTPЗапрос с установленным телом из двоичных данных:

ФайлДвоичные = Новый ДвоичныеДанные("C:\1C_Files\akt.pdf");

Соединение = Новый HTTPСоединение("api.example.com", 443, , , , ,

Новый ЗащищенноеСоединениеOpenSSL);

Запрос = Новый HTTPЗапрос("/upload?filename=akt.pdf");

Запрос.Заголовки.Вставить("Content-Type", "application/octet-stream");

Запрос.Заголовки.Вставить("Authorization", "Bearer токен");

Запрос.УстановитьТелоИзДвоичныхДанных(ФайлДвоичные);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Если Ответ.КодСостояния = 200 Тогда

Сообщить("Файл отправлен успешно");

Иначе

Сообщить("Ошибка: " + Ответ.КодСостояния + " " + Ответ.ПолучитьТелоКакСтроку());

КонецЕсли;

Если внешний сервис ждёт JSON с Base64, тело формируется иначе: файл читается в двоичные данные, кодируется функцией Base64Строка(), вставляется в структуру и сериализуется через ЗаписатьJSON(). Учтите, что Base64Строка иногда формирует строку с переносами — многие API такие переносы не принимают, их нужно удалить функцией СтрЗаменить по символам ПС и ВК.

Порядок действий при отправке файла из 1С
  1. 1
    Прочитайте файл в объект ДвоичныеДанные
  2. 2
    Выберите формат: тело-файл или Base64 в JSON
  3. 3
    Сформируйте HTTPЗапрос с нужными заголовками и аутентификацией
  4. 4
    Отправьте запрос методом ОтправитьДляОбработки (POST)
  5. 5
    Проверьте код состояния ответа и тело ответа
  6. 6
    Запишите результат в журнал регистрации или регистр обмена

Проверка результата и ограничения

Признак успешной передачи — не только код 200. Убедитесь, что размер сохранённого файла совпадает с исходным: сравните ДвоичныеДанные.Размер() на отправляющей стороне с размером файла на принимающей. Для критичных обменов полезно передавать контрольную сумму (хеш) файла в отдельном поле и сверять её после записи.

Основные ограничения, о которых стоит помнить. Веб-сервер ограничивает максимальный размер запроса: у IIS это параметр maxAllowedContentLength (по умолчанию порядка 30 МБ), у Apache — LimitRequestBody. При превышении клиент получит ошибку 413 или обрыв соединения. Тайм-ауты соединения тоже имеют значение: передача большого файла по медленному каналу может прерваться по тайм-ауту, тогда файл стоит делить на части.

Контрольные точки

Как проверить результат

Код ответа сервиса
Норма

200 или 201 с осмысленным телом ответа

Тревожный признак

4xx/5xx, пустое тело, обрыв соединения

Размер файла после приёма
Норма

Совпадает с размером исходного файла

Тревожный признак

Файл меньше исходного или нулевого размера

Открытие файла
Норма

Файл открывается штатной программой без ошибок

Тревожный признак

Файл повреждён — признак порчи при кодировании Base64

Журнал регистрации 1С
Норма

Есть запись об успешной обработке

Тревожный признак

Ошибки прав доступа или преобразования типов

Типичные ошибки и частые вопросы

Типичные ошибки
01
Передача большого файла в Base64 — рост трафика и ошибки нехватки памяти на сервере; для больших файлов используйте двоичное тело
02
Переносы строк в Base64Строка() — внешний API отклоняет запрос; удаляйте символы ПС и ВК перед отправкой
03
Чтение тела запроса дважды — второй вызов возвращает пустые данные; сохраняйте тело в переменную
04
Отсутствие проверки расширения и размера на приёме — риск сохранить вредоносный или переполняющий диск файл
05
Игнорирование кода ответа — файл считается отправленным, хотя сервер вернул ошибку
Какой максимальный размер файла можно передать через веб-сервис 1С?

Жёсткого ограничения в самой платформе нет — упор обычно в настройки веб-сервера (по умолчанию у IIS порядка 30 МБ) и в доступную память сервера 1С. Для файлов больше нескольких десятков мегабайт практичнее передавать файл частями или использовать обмен через промежуточное файловое хранилище, а через сервис передавать только ссылку.

Чем HTTP-сервис лучше SOAP для передачи файлов?

HTTP-сервис позволяет передать файл бинарным телом без обёрток, что экономит трафик и память, и проще отлаживается (запрос можно проверить любым REST-клиентом). SOAP оправдан, когда внешняя система уже работает по WSDL-контракту или требуется строгое описание типов данных.

Как передать файл вместе с дополнительными реквизитами одним запросом?

Два рабочих варианта: JSON с полем Base64 для файла и остальными реквизитами, либо multipart/form-data, где файл идёт отдельной частью тела. В 1С multipart-запрос формируется вручную — тело собирается как двоичные данные с разделителями boundary.

Почему принятый файл не открывается после передачи в Base64?

Чаще всего причина в лишних переносах строк или потерянных символах при кодировании/декодировании. Проверьте, что на отправке строка очищена от ПС и ВК, а на приёме используется именно Base64Значение(), а не ручное преобразование строки.

Как защитить сервис приёма файлов?

Минимальный набор: аутентификация (Basic или токен), HTTPS, проверка расширения и размера файла в коде обработчика, сохранение файлов в отдельный каталог вне веб-публикации и, при возможности, ограничение доступа по IP на уровне веб-сервера.

Можно ли передать файл между двумя базами 1С без веб-сервера?

Да, если базы соединены локально, файл можно передать через общий сетевой каталог, FTP или планы обмена с пакетами EnterpriseData. Веб-сервис нужен, когда базы разделены сетью интернет или одна из сторон — не 1С.

Итог

Что важно запомнить

Небольшие файлы передавайте в Base64 внутри XML или JSON, большие — двоичными данными в теле HTTP-запроса. На приёме всегда проверяйте размер и тип файла, на отправке — код ответа сервера. Публикуйте сервис только с аутентификацией и учитывайте лимиты веб-сервера на размер запроса.