Разработка и Конфигурация · 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.
Сравнение вариантов
Подходит для небольших файлов и строгих контрактов обмена. Ограничение: рост объёма сообщения и нагрузка на память при больших файлах.
Удобен, когда файл идёт вместе с набором реквизитов в одном JSON. Ограничение то же — не для больших файлов.
Оптимально для больших файлов. Метаданные передаются в заголовках или параметрах URL, что требует дисциплины в описании API.
Позволяет в одном запросе передать и файл, и поля формы. В 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Прочитайте файл в объект ДвоичныеДанные
- 2Выберите формат: тело-файл или Base64 в JSON
- 3Сформируйте HTTPЗапрос с нужными заголовками и аутентификацией
- 4Отправьте запрос методом ОтправитьДляОбработки (POST)
- 5Проверьте код состояния ответа и тело ответа
- 6Запишите результат в журнал регистрации или регистр обмена
Проверка результата и ограничения
Признак успешной передачи — не только код 200. Убедитесь, что размер сохранённого файла совпадает с исходным: сравните ДвоичныеДанные.Размер() на отправляющей стороне с размером файла на принимающей. Для критичных обменов полезно передавать контрольную сумму (хеш) файла в отдельном поле и сверять её после записи.
Основные ограничения, о которых стоит помнить. Веб-сервер ограничивает максимальный размер запроса: у IIS это параметр maxAllowedContentLength (по умолчанию порядка 30 МБ), у Apache — LimitRequestBody. При превышении клиент получит ошибку 413 или обрыв соединения. Тайм-ауты соединения тоже имеют значение: передача большого файла по медленному каналу может прерваться по тайм-ауту, тогда файл стоит делить на части.
Как проверить результат
200 или 201 с осмысленным телом ответа
4xx/5xx, пустое тело, обрыв соединения
Совпадает с размером исходного файла
Файл меньше исходного или нулевого размера
Файл открывается штатной программой без ошибок
Файл повреждён — признак порчи при кодировании Base64
Есть запись об успешной обработке
Ошибки прав доступа или преобразования типов
Типичные ошибки и частые вопросы
Какой максимальный размер файла можно передать через веб-сервис 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-запроса. На приёме всегда проверяйте размер и тип файла, на отправке — код ответа сервера. Публикуйте сервис только с аутентификацией и учитывайте лимиты веб-сервера на размер запроса.