Веб-сервис в 1С 8.3 от конфигуратора до первого SOAP-вызова: IIS, Apache, права и отладка

· 10 мин

Содержание

Настройка веб-сервиса 1С сводится к трём шагам: описать сервис в конфигураторе (Общие → Web-сервисы), опубликовать базу на веб-сервере через Администрирование → Публикация на веб-сервере и проверить, что по адресу http://сервер/база/ws/ИмяСервиса.1cws?wsdl открывается WSDL-описание. Если WSDL открылся — сервис живой, дальше остаётся отладить операции и закрыть доступ.

Порядок одинаков для любой конфигурации на платформе 8.3, файловой и клиент-серверной базы. Различается только веб-сервер: на Windows обычно IIS, на Linux — Apache. Ниже разобраны оба варианта, а также права, безопасность, тестирование и производительность.

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

Большинство проблем с публикацией возникает не в 1С, а на стороне веб-сервера. Проверьте заранее:

  • 🖥️ Веб-сервер установлен. На Windows — роль IIS с компонентами «Расширения ISAPI» и «Фильтры ISAPI» (раздел «Разработка приложений»), плюс «Консоль управления IIS». На Linux — Apache 2.4.
  • 🧩 Модули расширения веб-сервера 1С. Это отдельный компонент в установщике платформы. Если при установке его не отметили, запустите установку повторно, выберите «Изменить» и добавьте компонент.
  • 🔢 Разрядность. Модуль расширения веб-сервера должен совпадать по разрядности с процессом веб-сервера. 64-битный IIS и 64-битная платформа — самый простой вариант.
  • 📌 Одна версия платформы. На веб-сервере нужна та же версия платформы, что у кластера серверов 1С (для клиент-серверной базы). Иначе модуль не сможет подключиться к базе.
  • 👤 Отдельный пользователь 1С для сервиса. Например, ws_exchange с паролем и ролью только на нужные данные.
  • 🔐 Права на каталоги. Для файловой базы учётной записи веб-сервера нужны права на чтение и запись в каталог базы. Иначе сервис ответит ошибкой доступа к файлам.

Сеансы веб-сервисов расходуют клиентские лицензии, как и обычные пользователи. Если лицензий впритык, внешняя система может «съесть» последнюю, и бухгалтер не войдёт в базу. Учтите это при планировании.

Как создать веб-сервис в конфигураторе 1С

Типовые конфигурации править напрямую неудобно — после этого они снимаются с полной поддержки. Если сервис нужен в типовой БП 3.0 или ЗУП 3.1, создавайте его в расширении конфигурации. Веб-сервисы в расширениях поддерживаются в актуальных версиях платформы 8.3.

Создание объекта

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

Операции и параметры

На закладке «Операции» добавьте операцию, например GetCounterparty. Для неё задайте:

СвойствоЧто указать
Тип возвращаемого значенияНапример, string (http://www.w3.org/2001/XMLSchema)
Возможно пустоеВключите, если операция может вернуть «ничего»
В транзакцииВключайте только для операций, которые пишут данные
Имя процедурыИмя функции в модуле сервиса, создаётся кнопкой с лупой

У операции добавьте параметры, например INN с типом string и направлением «Входной».

Модуль обработчика

Пример операции, которая ищет контрагента по ИНН и возвращает его наименование:

Функция GetCounterparty(INN)

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

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Наименование;
    КонецЕсли;

    Возврат "";

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

После правок выполните Конфигурация → Обновить конфигурацию базы данных (F7). Без этого шага сервис не появится в публикации.

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

Публикация веб-сервиса на IIS в Windows

Публикацию делает сам конфигуратор. Запускайте конфигуратор от имени администратора Windows, иначе 1С не сможет записать настройки в IIS и каталог inetpub.

  1. В конфигураторе откройте Администрирование → Публикация на веб-сервере.
  2. Имя — короткое имя публикации латиницей, например buh. Оно станет частью адреса.
  3. Веб-сервер — Internet Information Services.
  4. Каталог — физическая папка публикации, например C:\inetpub\wwwroot\buh.
  5. На закладке «Web-сервисы» отметьте «Публиковать Web-сервисы» и поставьте галочку напротив нужного сервиса. Здесь же можно поменять адрес (псевдоним).
  6. Снимите флажки с того, что публиковать не нужно: тонкий и веб-клиент, стандартный интерфейс OData, HTTP-сервисы. Каждый лишний пункт — ещё одна точка входа снаружи.
  7. Нажмите «Опубликовать». Согласитесь на перезапуск веб-сервера.

1С создаст в каталоге публикации файл default.vrd и зарегистрирует в IIS приложение с обработчиком wsisapi.dll.

Пул приложений IIS

Откройте «Диспетчер служб IIS», найдите приложение buh и посмотрите, какой пул ему назначен. В дополнительных параметрах пула проверьте флаг «Разрешены 32-разрядные приложения»:

Платформа на веб-сервереЗначение флага
64-разряднаяFalse
32-разряднаяTrue

Для файловой базы дайте группе IIS_IUSRS (или учётной записи пула) права «Изменение» на каталог базы. Для клиент-серверной базы это не нужно: с базой работает кластер 1С, а не IIS.

Команда iisreset и перезапуск пула обрывают все текущие сеансы веб-клиента и веб-сервисов. Перезапускайте IIS, когда обмены не идут.

Публикация на Apache в Linux

На Linux удобнее публиковать утилитой webinst из каталога платформы, например /opt/1cv8/x86_64/8.3.xx.xxxx/. Пример для клиент-серверной базы:

cd /opt/1cv8/x86_64/8.3.xx.xxxx
sudo ./webinst -publish -apache24 -wsdir buh \
  -dir /var/www/buh \
  -connstr "Srvr=srv1c;Ref=buh;" \
  -confpath /etc/apache2/apache2.conf

Утилита создаст default.vrd в /var/www/buh и допишет в конфиг Apache директиву загрузки модуля wsap24.so и блок Alias для каталога. Для файловой базы строка подключения выглядит как File="/var/1c/buh";.

Дальше:

  1. Проверьте синтаксис конфигурации: sudo apachectl configtest.
  2. Дайте пользователю Apache (www-data в Debian и Ubuntu) права на чтение /var/www/buh, а для файловой базы — на чтение и запись каталога базы.
  3. Перезапустите Apache: sudo systemctl restart apache2. Как и на IIS, перезапуск рвёт активные сеансы.

Список веб-сервисов, которые попадут в публикацию, webinst сам не выбирает. По умолчанию публикуются все. Чтобы управлять ими поштучно, правьте default.vrd — см. следующий раздел.

Файл default.vrd: тонкая настройка публикации

Файл default.vrd — главный пульт публикации. Конфигуратор пишет его сам, но тонкие параметры удобнее задать руками. Пример для одного сервиса:

<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       base="/buh"
       ib="Srvr=srv1c;Ref=buh;">
  <ws pointEnableCommon="false">
    <point name="Exchange"
           alias="Exchange.1cws"
           enable="true"
           reuseSessions="autouse"
           sessionMaxAge="20"
           poolSize="10"
           poolTimeout="5"/>
  </ws>
</point>

Что здесь важно:

  • 🚪 pointEnableCommon="false" — публикуются только сервисы, явно перечисленные с enable="true". Новые сервисы, добавленные в конфигурацию, наружу сами не выйдут.
  • ♻️ reuseSessions — повторное использование сеансов: dontuse, use или autouse.
  • ⏱️ sessionMaxAge — сколько секунд живёт сеанс в пуле.
  • 📦 poolSize и poolTimeout — размер пула сеансов и время ожидания свободного сеанса.

После правки default.vrd перезапустите пул IIS или Apache, иначе изменения не подхватятся.

Права и безопасность веб-сервиса

Опубликованный сервис — дверь в учётную базу из сети. Закройте её по минимуму:

  1. Только HTTPS. На IIS добавьте привязку https с сертификатом к сайту, на Apache — виртуальный хост на 443 порту. HTTP оставьте только для внутренней сети, а лучше уберите совсем.
  2. Отдельный пользователь. Внешняя система подключается под своим пользователем 1С с ролью, где есть права только на нужные справочники и документы. Полные права сервисной учётке не давайте.
  3. Basic-аутентификация. Клиент передаёт логин и пароль пользователя 1С в заголовке. Без HTTPS этот пароль летит по сети открытым текстом.
  4. Без пароля в default.vrd. В строку ib можно дописать Usr= и Pwd=, и тогда сервис будет пускать без авторизации. Это удобно для теста, но пароль лежит в файле открыто, а сервис доступен всем. Для рабочей схемы не годится.
  5. Ограничение по IP. В IIS — «Ограничения IP-адресов и доменов», в Apache — директива Require ip в блоке каталога. Если сервисом пользуется один партнёр, пускайте только его адреса.
  6. Ничего лишнего. Не публикуйте тонкий клиент и OData на тот же адрес, если они не нужны.

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

Как протестировать веб-сервис и найти ошибку

Проверка WSDL в браузере

Откройте http://сервер/buh/ws/Exchange.1cws?wsdl. Браузер спросит логин и пароль пользователя 1С. В ответ должен прийти XML с описанием операций. Если он пришёл — публикация и права в порядке.

Вызов из SoapUI или Postman

В SoapUI создайте проект по адресу WSDL — он сам построит шаблон запроса для каждой операции. Укажите логин и пароль на вкладке Auth (Basic), подставьте ИНН и отправьте запрос. Так проверяется сам сервис без участия чужой системы.

Вызов из другой базы 1С

Определения = Новый WSОпределения(
    "https://сервер/buh/ws/Exchange.1cws?wsdl", "ws_exchange", "Пароль");
Прокси = Новый WSПрокси(Определения,
    "http://mycompany.ru/exchange", "Exchange", "ExchangeSoap");
Прокси.Пользователь = "ws_exchange";
Прокси.Пароль = "Пароль";

Наименование = Прокси.GetCounterparty("7700000000");
Сообщить(Наименование);

Имя точки подключения ExchangeSoap берётся из WSDL — посмотрите элемент port, если сомневаетесь.

Отладка обработчика

Чтобы остановиться на точке останова в модуле сервиса, в default.vrd добавьте строку отладки, например <debug enable="true" protocol="http" url="http://localhost:1550"/> внутри корневого point. Затем в конфигураторе откройте Отладка → Подключение и включите автоматическое подключение для сеансов веб-сервисов. После отладки строку уберите: отладчик в рабочей публикации тормозит все вызовы.

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

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

Производительность: чтобы сервис не тормозил под нагрузкой

Медленный веб-сервис почти всегда упирается в одно из трёх: создание сеансов, тяжёлые запросы в обработчике или блокировки.

  • ♻️ Повторное использование сеансов. Без него каждый вызов открывает новый сеанс 1С — это заметные доли секунды на старт и лишняя лицензия. Включите reuseSessions="autouse" в default.vrd или свойство «Повторное использование сеансов» у самого сервиса в конфигураторе.
  • 📦 Пакетные операции. Сто вызовов по одному товару медленнее, чем один вызов со списком из ста. Опишите в XDTO тип-список и принимайте данные пачкой.
  • 🔍 Запросы вместо обращения через точку. Чтение Контрагент.Наименование в цикле — отдельное обращение к базе на каждой итерации. Собирайте данные одним запросом.
  • 🔒 Короткие транзакции. Флаг «В транзакции» держит блокировки до конца операции. Для операций чтения его не включайте.
  • ⏳ Таймауты на стороне клиента. Задайте разумный таймаут в вызывающей системе (у WSОпределения и WSПрокси он передаётся параметром конструктора), чтобы зависший вызов не копил очередь.

Для замеров используйте технологический журнал на сервере 1С или замер производительности в конфигураторе при отладке операции.

Частые вопросы о веб-сервисах 1С

Чем веб-сервис отличается от HTTP-сервиса 1С?
Веб-сервис работает по SOAP и сам отдаёт WSDL-описание, поэтому клиент генерирует вызовы автоматически. HTTP-сервис — это REST: произвольные URL и методы GET/POST, формат данных вы задаёте сами, чаще JSON.
Можно ли опубликовать веб-сервис файловой базы?
Да. Публикация работает и для файловой базы. Нужны права учётной записи веб-сервера на каталог базы. Под нагрузкой с десятками одновременных вызовов файловая база проигрывает клиент-серверной.
Нужно ли переопубликовывать базу после обновления конфигурации?
Если добавлен новый сервис или изменено имя файла публикации — да, иначе он не попадёт в default.vrd. Изменения кода в существующих операциях подхватываются без переопубликации.
Где посмотреть, кто и когда вызывал веб-сервис?
В журнале регистрации базы. Поставьте отбор по пользователю сервиса или по приложению «Web-сервис» — увидите начало и конец каждого сеанса, ошибки и изменения данных.
Можно ли менять код операции без остановки обмена?
Можно, но новый код заработает после обновления конфигурации базы данных. Чтобы сеансы из пула гарантированно взяли новый код, перезапустите пул IIS или Apache в паузе между обменами.