Как 1С:Предприятие 8.3 отдаёт и принимает данные через веб-сервисы
Содержание
Веб-сервисы 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, видит список операций с параметрами и вызывает их, как обычные процедуры.
Что заполнить в свойствах
- В Конфигураторе откройте дерево метаданных, ветку
Общие → Web-сервисы, добавьте новый объект, напримерExchange. - На закладке «Прочее» укажите Пространство имён URI — любую уникальную строку вида
http://example.org/exchange. Клиент будет ссылаться на неё при вызове. - Задайте Имя файла публикации, например
exchange.1cws. Из него складывается адрес сервиса. - В свойстве Пакеты XDTO выберите пакеты, если операции возвращают сложные структуры. Для простых строк и чисел достаточно стандартного пакета
http://www.w3.org/2001/XMLSchema. - На закладке «Операции» создайте операцию, задайте тип возвращаемого значения и параметры с их типами и направлением (входной, выходной, входной-выходной).
- В свойстве операции «Имя процедуры» нажмите лупу — платформа создаст функцию в модуле сервиса.
Пример операции
Операция 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 и новее):
- В «Диспетчере серверов» добавьте роль «Веб-сервер (IIS)». В компонентах разработки приложений отметьте «Расширения ISAPI» и «Фильтры ISAPI».
- При установке платформы 1С выберите компонент «Модули расширения веб-сервера». Без него публиковать нечего.
- Разрядность должна совпадать. Если стоит 32-разрядная платформа, в настройках пула приложений включите «Разрешить 32-разрядные приложения». Для 64-разрядной платформы флажок должен быть выключен.
- Для файловой базы дайте группе
IIS_IUSRSправа на изменение каталога базы. Для серверной базы этого не нужно.
Apache: установите Apache 2.4 и модули расширения 1С той же разрядности. Для Apache 2.4 используется модуль wsap24, публикация дописывает его подключение в httpd.conf.
Публикация из Конфигуратора
- Запустите Конфигуратор от имени администратора Windows — иначе он не сможет записать настройки IIS.
- Откройте меню
Администрирование → Публикация на веб-сервере. - Укажите имя публикации (оно станет частью адреса, лучше латиницей:
trade), выберите веб-сервер и каталог. - На закладке «Основные» отметьте «Публиковать Web-сервисы по умолчанию» и «Публиковать HTTP-сервисы по умолчанию». На закладках сервисов можно включить или выключить каждый сервис отдельно.
- Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.
Перезапуск 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-коду ответа. Начинайте с него, а не с кода обработчика.
Как отладить обработчик
Ставить точку останова в модуле сервиса и ждать недостаточно: вызов приходит в отдельном сеансе, к которому отладчик сам не подключается.
- Включите отладку по протоколу HTTP: в Конфигураторе
Сервис → Параметры → Отладка. - В меню
Отладка → Подключениеоткройте автоматическое подключение и отметьте сеансы Web-сервисов и HTTP-сервисов. - Поставьте точку останова в обработчике.
- Отправьте запрос из Postman, SoapUI или
curl, и отладчик остановится на нужной строке.
Для HTTP-сервиса быстрая проверка из командной строки выглядит так:
curl -u integration:Пароль "https://srv.example.ru/trade/hs/api/orders/15"
Если curl получает правильный ответ, а сайт нет — проблема на стороне клиента: заголовки, кодировка тела или сертификат.
Логируйте входящие запросы в самом обработчике: дата, адрес, тело, код ответа. Запись в журнал регистрации через ЗаписьЖурналаРегистрации() с отдельным именем события позволяет потом отфильтровать только обмен и разобрать спор с партнёром по фактам.