Как устроены веб-сервисы 1С и как подключить к базе внешнюю систему
Содержание
Веб-сервис в 1С — это объект конфигурации, который открывает часть логики базы для внешних программ по сети: сайт, мобильное приложение или другая база вызывают метод по URL и получают ответ в XML или JSON. Работает это через веб-сервер (Apache или IIS), на котором база опубликована из Конфигуратора командой Администрирование → Публикация на веб-сервере.
Обычная боль интеграции: интернет-магазин должен видеть остатки, а CRM — создавать заказы, и всё это без выгрузок файлов вручную. Веб-сервис решает задачу напрямую. Ниже по шагам: из чего состоит схема обмена, чем SOAP отличается от HTTP-сервисов, как опубликовать базу, написать методы, закрыть доступ и найти причину, когда сервис отвечает ошибкой.
Как веб-сервис 1С связан с базой и веб-сервером
Внешняя система не подключается к базе 1С напрямую. Между ними всегда стоит веб-сервер с модулем расширения 1С. Цепочка выглядит так:
- 🌐 Клиент отправляет HTTP-запрос на адрес вида
http://server/base/ws/...илиhttp://server/base/hs/.... - 🧩 Веб-сервер передаёт запрос модулю 1С (
wsap24для Apache 2.4,wsisapi.dllдля IIS). - 📄 Модуль читает файл публикации
default.vrd: в нём записано, к какой базе подключаться и какие сервисы открыты. - ⚙️ Модуль открывает сеанс в информационной базе — файловой или на кластере серверов 1С.
- 📤 Выполняется процедура-обработчик из модуля сервиса, ответ уходит обратно клиенту.
Отсюда важный практический вывод. Веб-сервер и платформа должны быть одной разрядности: 64-битный Apache работает только с 64-битным модулем 1С. И модули расширения веб-сервера ставятся вместе с платформой — при установке нужно отметить компонент «Модули расширения веб-сервера». Без него публикация в Конфигураторе недоступна или Apache не стартует.
Протоколы обмена в 1С — обычный HTTP или HTTPS. Поверх них идёт либо SOAP-конверт с XML, либо произвольное тело: JSON, XML, файл.
SOAP или HTTP-сервис: какой тип веб-сервиса выбрать
В платформе 8.3 есть три способа отдать данные наружу. Два из них разработчик создаёт сам, третий платформа даёт готовым.
| Тип | Где создаётся | Формат | Адрес | Когда брать |
|---|---|---|---|---|
| Web-сервис (SOAP) | Общие → Web-сервисы | XML по схеме WSDL | /ws/имя?wsdl | Обмен с корпоративными системами, 1С ↔ 1С, где нужен строгий контракт |
| HTTP-сервис (REST) | Общие → HTTP-сервисы (с 8.3.5) | Любой, чаще JSON | /hs/корневой_URL/... | Сайты, мобильные приложения, сервисы на PHP, Python, JS |
| Стандартный интерфейс OData | Включается при публикации | JSON или Atom | /odata/standard.odata/ | Быстрое чтение и запись справочников и документов без программирования |
SOAP-сервис описан WSDL-файлом. Внешняя сторона загружает WSDL и сразу видит все операции, их параметры и типы. Плюс — строгая типизация. Минус — тяжёлый XML и сложнее вызывать из скриптов.
HTTP-сервис — это свободный REST: вы сами задаёте шаблоны адресов (/orders/{id}), методы (GET, POST, PUT, DELETE) и формат тела. Для веб-разработчиков это привычнее, а JSON легче разбирать.
OData удобен, когда нужно просто читать объекты базы. Перед использованием состав объектов, доступных через OData, задают программно методом УстановитьСоставСтандартногоИнтерфейсаOData(). Бизнес-логику (проверки, расчёты) через OData не реализовать — для этого нужен свой сервис.
Если внешняя команда пишет на PHP или JavaScript и не просит WSDL — делайте HTTP-сервис. Сэкономите время и им, и себе.
Публикация базы на веб-сервере и доступ к сервисам
Перед публикацией подготовьте веб-сервер. Для Windows это чаще Apache 2.4 или IIS с включённой ролью ISAPI-расширений, для Linux — Apache.
Публикация из Конфигуратора (Windows)
- Запустите Конфигуратор от имени администратора — иначе он не сможет записать настройки Apache и каталог публикации.
- Откройте
Администрирование → Публикация на веб-сервере. - Укажите имя публикации латиницей, например
trade. Оно станет частью адреса:http://server/trade/. - Выберите веб-сервер и каталог, где появится
default.vrd. - Отметьте нужное: публикацию Web-сервисов, HTTP-сервисов, стандартного интерфейса OData. В списках ниже снимите галочки с сервисов, которые наружу открывать не надо.
- Нажмите «Опубликовать» и согласитесь на перезапуск веб-сервера.
Перезапуск Apache или IIS обрывает все текущие подключения через этот веб-сервер, включая веб-клиент и мобильные приложения. На рабочем сервере публикуйте вне рабочих часов.
Публикация на Linux
На Linux используют утилиту webinst из каталога платформы:
sudo /opt/1cv8/x86_64/8.3.25.1374/webinst -publish -apache24 \
-wsdir trade -dir /var/www/trade \
-connstr "Srvr=srv1c;Ref=trade;" \
-confpath /etc/apache2/apache2.conf
Номер версии в пути подставьте свой. После команды перезапустите Apache: sudo systemctl restart apache2.
Проверка, что сервис доступен
Откройте в браузере адрес WSDL:
http://server/trade/ws/Exchange?wsdl
http://server/trade/ws/exchange.1cws?wsdl
Подойдут оба варианта: по имени сервиса или по имени файла публикации из его свойств. Если браузер показал XML-описание — SOAP-сервис работает. Для HTTP-сервиса проверьте GET-метод: http://server/trade/hs/api/ping.
Разработка методов: код сервера и клиента
SOAP-сервис: операции и параметры
В дереве конфигурации добавьте объект в ветку Общие → Web-сервисы. В свойствах заполните:
- 📌 URI пространства имён — уникальная строка, например
http://example.ru/exchange; - 📦 Пакеты XDTO — схемы типов, если передаёте сложные структуры, а не строки и числа;
- 📄 Имя файла публикации — например
exchange.1cws; - 🔁 Повторное использование сеансов и время жизни сеанса — о них ниже.
Затем добавьте операцию, укажите тип возвращаемого значения (например, xs:string) и параметры с направлением «Входной». Процедура-обработчик создаётся в модуле сервиса:
Функция ПолучитьОстаток(Артикул)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(СУММА(Остатки.КоличествоОстаток), 0) КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура.Артикул = &Артикул) КАК Остатки";
Запрос.УстановитьПараметр("Артикул", Артикул);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Формат(Выборка.Остаток, "ЧГ=0");
КонецФункции
Имя регистра здесь условное — подставьте регистр своей конфигурации. Агрегатная функция без группировки всегда возвращает одну строку, поэтому Следующий() без проверки безопасен.
Вызов такого сервиса из другой базы 1С:
Определения = Новый WSОпределения("http://server/trade/ws/Exchange?wsdl", "Обмен", "Пароль");
Прокси = Новый WSПрокси(Определения, "http://example.ru/exchange", "Exchange", "ExchangeSoap");
Прокси.Пользователь = "Обмен";
Прокси.Пароль = "Пароль";
Остаток = Прокси.ПолучитьОстаток("A-1024");
Имя точки подключения платформа формирует как имя сервиса плюс Soap (для SOAP 1.2 — Soap12). Если WSDL меняется редко, вместо загрузки по адресу создайте в конфигурации объект Общие → WS-ссылки — описание сохранится в базе.
HTTP-сервис: шаблоны и методы
В ветке Общие → HTTP-сервисы создайте сервис с корневым URL, например api. Добавьте шаблон /orders/{id} и метод GET. Обработчик возвращает объект HTTPСервисОтвет:
Функция ЗаказGET(Запрос)
Номер = Запрос.ПараметрыURL["id"];
Данные = Новый Структура("number, status", Номер, "в работе");
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Тело POST-запроса читают через Запрос.ПолучитьТелоКакСтроку() и разбирают ПрочитатьJSON(). Сам заказ ищите в базе по номеру — в примере данные упрощены, чтобы показать каркас.
Вызов внешнего HTTP-сервиса из 1С делают через HTTPСоединение:
Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
Ответ = Соединение.Получить(Новый HTTPЗапрос("/v1/orders/15"));
Если Ответ.КодСостояния = 200 Тогда
Текст = Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
Повторное использование сеансов
Каждый вызов без повторного использования открывает новый сеанс и занимает лицензию на время работы. При частых запросах (раз в секунду и чаще) это ощутимо грузит сервер. Значение «Автоматически» позволяет платформе держать сеанс между вызовами в пределах времени жизни. Но тогда не храните состояние в переменных модуля сеанса — следующий вызов может прийти от другого клиента в тот же сеанс.
Защита веб-сервиса: пользователи, права и HTTPS
По умолчанию веб-сервис требует Basic-аутентификацию: клиент передаёт логин и пароль пользователя информационной базы. Чтобы доступ был безопасным:
- 👤 Заведите в базе отдельного пользователя, например «Обмен», без права интерактивного входа.
- 🔐 Создайте роль, в которой включено право «Использование» только на нужные операции веб-сервиса или методы HTTP-сервиса, и права на чтение и запись нужных объектов.
- 🔒 Включите HTTPS на веб-сервере. По HTTP логин и пароль идут в заголовке почти открытым текстом (Base64 — это не шифрование).
- 🚫 В публикации оставьте только нужные сервисы. Публикацию для тонкого и веб-клиента, если она не нужна, снимите.
- 🧱 Ограничьте доступ к адресу по IP на уровне веб-сервера или файрвола, если клиентов немного.
Анонимный доступ возможен: в default.vrd прописывают логин и пароль в атрибутах usr и pwd. Тогда любой, кто знает адрес, работает с правами этого пользователя. Используйте это только во внутренней сети и с минимальной ролью.
Для доменных сетей доступна аутентификация операционной системы — тогда пользователь базы должен быть связан с учётной записью Windows, а веб-сервер настроен на Windows-аутентификацию.
Отладка и мониторинг веб-сервисов 1С
Обработчик веб-сервиса выполняется на сервере, поэтому точка останова сама по себе не сработает. Нужна отладка по протоколу HTTP:
- На сервере 1С (или для файловой базы — при запуске) включите режим отладки по HTTP.
- В
default.vrdдобавьте элемент отладки внутри корневогоpoint:
<debug enable="true" protocol="http" url="http://localhost:1550"/>
- В Конфигураторе откройте
Отладка → Подключение, затем «Автоматическое подключение» и отметьте сеансы веб-сервисов и HTTP-сервисов. - Поставьте точку останова в обработчике и вызовите сервис из Postman или SoapUI.
Отладку на рабочей базе не держите включённой: остановка на точке блокирует вызов клиента, а при повторном использовании сеансов — и других клиентов. После проверки уберите строку debug из default.vrd.
Для наблюдения за сервисом в работе:
- 📒 Журнал регистрации — пишите туда исключения через
ЗаписьЖурналаРегистрации()в блокеПопытка ... Исключение. Так вы увидите текст ошибки, а не только код 500 у клиента. - 📈 Технологический журнал (
logcfg.xml) — показывает длительность вызовов, ошибки и блокировки на сервере. - 🗂 Логи веб-сервера — access.log и error.log Apache или журналы IIS покажут, дошёл ли запрос до 1С вообще.
- 🧪 Postman / SoapUI — проверка сервиса в отрыве от внешней системы: если тут работает, проблема на стороне клиента.
Ошибки при вызове веб-сервиса и их причины
Код ответа сразу подсказывает, на каком звене цепочки сбой.
После обновления платформы путь к модулю wsap24 в настройках Apache указывает на старый каталог версии. Переопубликуйте базу из Конфигуратора новой версии — это частая причина «сломалось после обновления».
Частые вопросы
Нужна ли отдельная лицензия на веб-сервис 1С?
Можно ли сделать веб-сервис в типовой конфигурации без снятия с поддержки?
Работает ли веб-сервис с файловой базой?
Чем WS-ссылка отличается от загрузки WSDL по адресу?
Как передать файл через веб-сервис?
ПолучитьТелоКакДвоичныеДанные(). В SOAP файл передают параметром типа xs:base64Binary.