Как 1С:Предприятие 8.3 отдаёт и принимает данные через веб-сервисы

· 10 мин

Содержание

Веб-сервисы 1С — это объекты конфигурации, через которые внешняя программа обращается к базе по HTTP: сайт забирает остатки, мобильное приложение создаёт заказ, другая 1С отправляет документы. В платформе 8.3 есть три механизма: SOAP-сервисы (объект Web-сервисы), HTTP-сервисы для REST API (объект HTTP-сервисы, с версии 8.3.5) и автоматический интерфейс OData, который не требует программирования.

Выбор простой. Партнёр присылает WSDL и требует SOAP — делаете Web-сервис. Сайт или мобильное приложение ждёт JSON по адресам вида /orders/15 — HTTP-сервис. Нужно только читать справочники и регистры в BI-системе — хватит OData. Во всех трёх случаях базу публикуют на веб-сервере: без IIS или Apache сервис снаружи не виден.

Три вида веб-сервисов 1С и когда какой выбирать

Механизмы решают одну задачу, но устроены по-разному. Главное отличие — кто задаёт формат обмена: стандарт SOAP, вы сами или платформа.

КритерийWeb-сервис (SOAP)HTTP-сервис (REST)OData
Где создаётсяОбщие → Web-сервисыОбщие → HTTP-сервисыНе создаётся, включается
Формат данныхXML по схеме WSDLЛюбой: JSON, XML, файлJSON или Atom/XML
Описание для клиентаWSDL генерируется самПишете документацию самиМетаданные $metadata
Адрес в публикации/ws/имя/hs/корневой URL/odata/standard.odata
Нужен кодДа, на каждую операциюДа, на каждый методНет
Типичный клиентДругая 1С, банки, госсистемы, Java/.NET-системыСайты, мобильные приложения, сервисы доставкиPower BI, Excel, аналитика

💡 Если сомневаетесь, берите HTTP-сервис. JSON понимает любой современный язык, отладка идёт обычным curl или Postman, а версию API легко держать в адресе (/api/v1/...).

SOAP стоит оставить там, где он обязателен по договору или где клиент — старая корпоративная система, которая умеет только WSDL.

Как устроен SOAP-сервис в конфигурации

Web-сервис описывает набор операций — по сути, удалённых функций. Клиент скачивает WSDL, видит список операций с параметрами и вызывает их, как обычные процедуры.

Что заполнить в свойствах

  1. В Конфигураторе откройте дерево метаданных, ветку Общие → Web-сервисы, добавьте новый объект, например Exchange.
  2. На закладке «Прочее» укажите Пространство имён URI — любую уникальную строку вида http://example.org/exchange. Клиент будет ссылаться на неё при вызове.
  3. Задайте Имя файла публикации, например exchange.1cws. Из него складывается адрес сервиса.
  4. В свойстве Пакеты XDTO выберите пакеты, если операции возвращают сложные структуры. Для простых строк и чисел достаточно стандартного пакета http://www.w3.org/2001/XMLSchema.
  5. На закладке «Операции» создайте операцию, задайте тип возвращаемого значения и параметры с их типами и направлением (входной, выходной, входной-выходной).
  6. В свойстве операции «Имя процедуры» нажмите лупу — платформа создаст функцию в модуле сервиса.

Пример операции

Операция GetStock принимает артикул и возвращает остаток строкой:

Функция GetStock(Артикул)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЕСТЬNULL(СУММА(Остатки.КоличествоОстаток), 0) КАК Количество
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(
    |        ,
    |        Номенклатура.Артикул = &Артикул) КАК Остатки";
    Запрос.УстановитьПараметр("Артикул", Артикул);

    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();

    Возврат Формат(Выборка.Количество, "ЧГ=0");

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

Имя регистра в вашей конфигурации может быть другим: в БП 3.0 остатки по складам лежат в регистре бухгалтерии, а не в регистре накопления. Пример показывает схему, текст запроса подставьте свой.

Как вызвать SOAP-сервис из другой 1С

На стороне клиента используются WSОпределения и WSПрокси. Имя порта платформа формирует из имени сервиса с суффиксом Soap:

Адрес = "https://srv.example.ru/trade/ws/exchange.1cws?wsdl";
Определения = Новый WSОпределения(Адрес, "integration", "Пароль");

Прокси = Новый WSПрокси(Определения,
    "http://example.org/exchange", "Exchange", "ExchangeSoap");
Прокси.Пользователь = "integration";
Прокси.Пароль = "Пароль";

Остаток = Прокси.GetStock("00-001");

Логин и пароль передаются дважды: первый раз для загрузки WSDL, второй — для самих вызовов.

REST API на HTTP-сервисах 1С

HTTP-сервис не привязан к схеме. Вы сами решаете, какие адреса принимать, какие HTTP-методы обрабатывать и что возвращать. Отсюда и гибкость, и ответственность: документацию для разработчиков сайта придётся написать самому.

Из чего состоит HTTP-сервис

  • 🧩 Корневой URL — первая часть адреса после /hs/, например api.
  • 🧩 Шаблоны URL — адреса внутри сервиса: /orders, /orders/{id}, /stock/{article}. Фигурные скобки задают параметр.
  • 🧩 Методы — для каждого шаблона свои: GET, POST, PUT, DELETE. У каждого метода есть функция-обработчик в модуле сервиса.

Итоговый адрес собирается так: https://сервер/имя_публикации/hs/api/orders/15.

Обработчик метода GET

Функция получает объект HTTPСервисЗапрос и обязана вернуть HTTPСервисОтвет:

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

    НомерЗаказа = Запрос.ПараметрыURL["id"];
    Заказ = Документы.ЗаказКлиента.НайтиПоНомеру(НомерЗаказа);

    Если Заказ.Пустая() Тогда
        Возврат Новый HTTPСервисОтвет(404);
    КонецЕсли;

    Данные = Новый Структура;
    Данные.Вставить("number", Заказ.Номер);
    Данные.Вставить("date", Формат(Заказ.Дата, "ДФ=yyyy-MM-dd"));
    Данные.Вставить("sum", Заказ.СуммаДокумента);

    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    ЗаписатьJSON(Запись, Данные);

    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8);
    Возврат Ответ;

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

Имена документа и реквизитов здесь условные — у каждой конфигурации свои. Параметры строки запроса (?from=2026-01-01) читаются через Запрос.ПараметрыЗапроса, тело POST-запроса — через Запрос.ПолучитьТелоКакСтроку().

Коды ответа — часть контракта

Сайт ориентируется на код ответа, а не на текст. Договоритесь о кодах заранее:

КодКогда возвращать
200Данные найдены и отданы
201Объект создан (ответ на POST)
400Клиент прислал некорректные данные
404Объект не найден
500Платформа вернёт сама при необработанном исключении

Оборачивайте запись объектов в Попытка ... Исключение и возвращайте 400 с понятным текстом ошибки в JSON. Иначе клиент получит 500 и HTML-страницу, по которой ничего не понять.

OData — интеграция без кода

Если внешней системе нужно просто читать данные, используйте стандартный интерфейс OData. Состав опубликованных объектов задаётся в режиме предприятия — методом УстановитьСоставСтандартногоИнтерфейсаOData() из внешней обработки. В публикации отмечают флажок «Публиковать стандартный интерфейс OData». Дальше справочники и регистры доступны по адресу /odata/standard.odata/ без единой строки кода в конфигурации.

Публикация веб-сервисов 1С на IIS и Apache

Сервис, созданный в Конфигураторе, снаружи не виден, пока базу не опубликовали. Публикация связывает веб-сервер с модулем расширения 1С, а тот — с информационной базой.

Подготовка веб-сервера

IIS (Windows Server 2016 и новее):

  1. В «Диспетчере серверов» добавьте роль «Веб-сервер (IIS)». В компонентах разработки приложений отметьте «Расширения ISAPI» и «Фильтры ISAPI».
  2. При установке платформы 1С выберите компонент «Модули расширения веб-сервера». Без него публиковать нечего.
  3. Разрядность должна совпадать. Если стоит 32-разрядная платформа, в настройках пула приложений включите «Разрешить 32-разрядные приложения». Для 64-разрядной платформы флажок должен быть выключен.
  4. Для файловой базы дайте группе IIS_IUSRS права на изменение каталога базы. Для серверной базы этого не нужно.

Apache: установите Apache 2.4 и модули расширения 1С той же разрядности. Для Apache 2.4 используется модуль wsap24, публикация дописывает его подключение в httpd.conf.

Публикация из Конфигуратора

  1. Запустите Конфигуратор от имени администратора Windows — иначе он не сможет записать настройки IIS.
  2. Откройте меню Администрирование → Публикация на веб-сервере.
  3. Укажите имя публикации (оно станет частью адреса, лучше латиницей: trade), выберите веб-сервер и каталог.
  4. На закладке «Основные» отметьте «Публиковать Web-сервисы по умолчанию» и «Публиковать HTTP-сервисы по умолчанию». На закладках сервисов можно включить или выключить каждый сервис отдельно.
  5. Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.

Перезапуск IIS обрывает все текущие веб-сеансы: пользователи веб-клиента и внешние системы на секунды потеряют связь. На рабочем сервере публикуйте в нерабочее время.

В каталоге публикации появится файл default.vrd — в нём строка подключения к базе и список опубликованных сервисов. Адрес WSDL проверьте в браузере: http://сервер/trade/ws/exchange.1cws?wsdl.

Публикация из командной строки

Для серверов без графического интерфейса и для Linux есть утилита webinst из каталога bin платформы:

webinst -publish -iis -wsdir trade -dir "C:\inetpub\wwwroot\trade" -connstr "Srvr=srv1c;Ref=trade;"

Для Apache вместо -iis указывают -apache24 и путь к конфигурационному файлу через -confpath. Полный список ключей выводит сама утилита при запуске без параметров.

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

Аутентификация и защита веб-сервисов 1С

По умолчанию сервис работает от имени пользователя информационной базы. Клиент передаёт логин и пароль в заголовке HTTP Basic, платформа проверяет их, как при обычном входе.

Правила для пользователя интеграции

  • 👤 Заведите отдельного пользователя только для обмена, не используйте учётку администратора или сотрудника.
  • 🔑 Дайте ему роль с минимальными правами: только чтение и запись тех объектов, с которыми работает обработчик.
  • 🔤 Логин делайте латиницей. Кириллица в заголовке Basic разные клиенты кодируют по-разному, и вход ломается без внятной ошибки.
  • 🚫 В карточке пользователя снимите «Показывать в списке выбора», чтобы учётку интеграции не видели при входе в программу.

Что делать с паролем в публикации

В строку подключения default.vrd можно вписать логин и пароль (Usr=...;Pwd=...). Тогда сервис пускает всех без запроса пароля. Это удобно для внутренней сети, но опасно снаружи: пароль лежит открытым текстом в файле, а любой, кто знает адрес, работает с базой.

Публикуйте сервисы в интернет только по HTTPS. Basic-аутентификация передаёт пароль в кодировке Base64 — это не шифрование, его прочитает любой, кто перехватит трафик.

Дополнительные меры

МераЧто даёт
HTTPS с сертификатомШифрует логин, пароль и данные
Ограничение по IP в IIS или ApacheПускает только адреса партнёра
Отдельная публикация под интеграциюВыключает веб-клиент и лишние сервисы
Проверка токена в обработчике HTTP-сервисаСвой ключ доступа в заголовке вместо пароля
Аутентификация ОСВход под доменной учёткой во внутренней сети

Ещё одна настройка влияет на нагрузку — свойство сервиса «Повторное использование сеансов». Если каждый вызов открывает новый сеанс, при частых запросах лицензии и память расходуются быстро. Режим повторного использования держит сеанс между вызовами одного клиента.

Ошибки интеграции через веб-сервисы и как их найти

Почти все проблемы видны по HTTP-коду ответа. Начинайте с него, а не с кода обработчика.

Диагностика: выберите симптом

Как отладить обработчик

Ставить точку останова в модуле сервиса и ждать недостаточно: вызов приходит в отдельном сеансе, к которому отладчик сам не подключается.

  1. Включите отладку по протоколу HTTP: в Конфигураторе Сервис → Параметры → Отладка.
  2. В меню Отладка → Подключение откройте автоматическое подключение и отметьте сеансы Web-сервисов и HTTP-сервисов.
  3. Поставьте точку останова в обработчике.
  4. Отправьте запрос из Postman, SoapUI или curl, и отладчик остановится на нужной строке.

Для HTTP-сервиса быстрая проверка из командной строки выглядит так:

curl -u integration:Пароль "https://srv.example.ru/trade/hs/api/orders/15"

Если curl получает правильный ответ, а сайт нет — проблема на стороне клиента: заголовки, кодировка тела или сертификат.

Логируйте входящие запросы в самом обработчике: дата, адрес, тело, код ответа. Запись в журнал регистрации через ЗаписьЖурналаРегистрации() с отдельным именем события позволяет потом отфильтровать только обмен и разобрать спор с партнёром по фактам.

Частые вопросы

Нужна ли отдельная лицензия для веб-сервисов 1С?
Отдельного продукта нет, но каждый сеанс веб-сервиса занимает клиентскую лицензию, как обычный пользователь. Для частых вызовов включайте повторное использование сеансов.
Работают ли веб-сервисы в файловой базе?
Да. Файловую базу публикуют так же, но веб-сервер должен иметь права на каталог базы. Под большой нагрузкой лучше перейти на клиент-серверный вариант.
Можно ли добавить веб-сервис в типовую конфигурацию без снятия с поддержки?
Да, через расширение конфигурации: Web-сервисы и HTTP-сервисы можно создавать в расширении. Основная конфигурация остаётся на поддержке и обновляется штатно.
Чем HTTP-сервис отличается от OData?
HTTP-сервис вы программируете сами и отдаёте ровно те данные, которые нужны. OData открывает объекты целиком в стандартном формате без кода, но гибкости и контроля меньше.
Нужно ли переопубликовывать базу после доработки сервиса?
Изменение кода обработчика не требует переопубликации. Новый сервис попадёт в публикацию сам, если отмечена публикация сервисов по умолчанию; иначе его нужно включить в окне публикации.