SOAP-сервис на 1С: от объекта в конфигураторе до первого ответа клиенту

· 10 мин

Содержание

Веб-сервис в 1С 8.3 — это объект конфигурации из ветки Общие → Web-сервисы, который после публикации на веб-сервере (IIS или Apache) принимает SOAP-запросы по адресу вида http://сервер/база/ws/имя.1cws. Описание методов внешняя система забирает по тому же адресу с хвостом ?wsdl. Создание, настройка и использование сводятся к трём шагам: описать операции в конфигураторе, написать их код в модуле и опубликовать базу.

Типичная ситуация: сайт интернет-магазина должен получать остатки из 1С, а складская программа подрядчика — отправлять в 1С заказы. Выгрузка файлов по расписанию уже не устраивает, нужен обмен «по запросу». Именно для этого и нужны веб-сервисы 1С: внешняя система вызывает метод, 1С отвечает сразу.

Как устроены веб-сервисы 1С: SOAP, HTTP-сервисы и OData

У платформы 8.3 есть три механизма, через которые внешняя программа может обратиться к базе по HTTP. Их часто путают, хотя задачи у них разные.

МеханизмПротоколАдрес после публикацииКогда выбирать
Web-сервисыSOAP 1.1/1.2, XML/ws/имя.1cwsПартнёр требует SOAP и WSDL, жёсткий контракт, обмен 1С ↔ 1С
HTTP-сервисыЛюбой HTTP: GET, POST, PUT, DELETE; JSON или XML/hs/корневой_URL/...Свой REST API для сайта или мобильного приложения
Стандартный интерфейс ODataREST по стандарту OData/odata/standard.odata/Чтение и запись справочников и документов без программирования

HTTP-сервисы появились в 8.3.5. До этого SOAP был единственным способом сделать в 1С свой программный интерфейс, поэтому в старых интеграциях его встречают чаще всего.

Сама схема работы веб-сервиса проста:

  • 🌐 клиент шлёт XML-конверт SOAP на адрес публикации;
  • 🔌 модуль расширения веб-сервера (wsisapi.dll для IIS, wsap24.dll для Apache 2.4) передаёт запрос платформе;
  • ⚙️ платформа открывает сеанс в базе под пользователем из авторизации, вызывает процедуру из модуля веб-сервиса;
  • 📦 результат превращается в XML по типам из WSDL и уходит обратно.

Код модуля веб-сервиса всегда выполняется на сервере. Клиентских форм, диалогов и Предупреждение() там быть не может: вызов просто упадёт с ошибкой.

Создание веб-сервиса в конфигураторе: операции, параметры, модуль

Изменять типовую конфигурацию напрямую неудобно: это снимает её с полной поддержки. Для своих веб-сервисов в типовых базах удобнее расширение конфигурации — web-сервис можно добавить и в него.

Шаг 1. Объект и пространство имён

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

Шаг 2. Операции и параметры

На закладке «Операции» добавьте метод, например GetStock. У операции задаются:

  • 🔹 «Тип возвращаемого значения» — например, xs:string или тип из своего пакета XDTO;
  • 🔹 «Возможно пустое значение» — можно ли вернуть Неопределено;
  • 🔹 «В транзакции» — выполнять ли весь вызов в транзакции (имеет смысл для операций, которые записывают данные);
  • 🔹 «Имя процедуры» — функция в модуле, которая обрабатывает вызов.

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

Шаг 3. Код модуля

Откройте модуль веб-сервиса и напишите функцию с тем же именем, что указано в свойствах операции. Пример: вернуть остаток по артикулу.

Функция GetStock(Article)

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

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

	Возврат Формат(Выборка.Остаток, "ЧГ=0; ЧН=0");

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

Имя регистра в примере условное: в вашей конфигурации подставьте свой регистр остатков. Агрегатная функция СУММА гарантирует одну строку в результате, поэтому Следующий() без проверки здесь безопасен.

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

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

Публиковать можно и файловую, и клиент-серверную базу . На машине с веб-сервером должны стоять модули расширения веб-сервера — это отдельный компонент в установщике платформы. Разрядность Apache и платформы 1С должна совпадать: 64-битный модуль не загрузится в 32-битный Apache, и наоборот.

Через конфигуратор

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

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

Через webinst

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

"C:\Program Files\1cv8\8.3.24.1548\bin\webinst.exe" -publish -apache24 -wsdir buh -dir "C:\Apache24\htdocs\buh" -connstr "Srvr=srv1c;Ref=buh;" -confPath "C:\Apache24\conf\httpd.conf"

Номер версии в пути подставьте свой. Для IIS вместо -apache24 указывают -iis, параметр -confPath тогда не нужен.

Что лежит в default.vrd

Публикация создаёт в каталоге файл default.vrd. В нём строка подключения к базе и список сервисов:

<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=&quot;srv1c&quot;;Ref=&quot;buh&quot;;">
  <ws pointEnableCommon="true">
    <point name="Exchange" alias="Exchange.1cws" enable="true"/>
  </ws>
</point>

Через default.vrd удобно включать и выключать отдельные сервисы, не переопубликовывая базу. После ручной правки файла веб-сервер нужно перезапустить.

WSDL опубликованного веб-сервиса и описание методов

Откройте в браузере адрес публикации с параметром ?wsdl:

http://webserver/buh/ws/Exchange.1cws?wsdl

Браузер запросит логин и пароль пользователя 1С. Если в ответ пришёл XML — сервис опубликован правильно.

Что внутри WSDL и зачем это знать:

РазделЧто содержитЗачем смотреть
typesXML-схема параметров и ответовПроверить, что тип параметра именно тот, который ждёт клиент
messageСообщения запроса и ответа для каждой операцииВидно имена параметров, которые попадут в конверт
portTypeСписок операцийВсе ли операции опубликованы после F7
bindingПривязки SOAP 1.1 и SOAP 1.2Клиенту нужна версия протокола, которую он поддерживает
serviceТочки подключения и адресИмена вида ExchangeSoap и ExchangeSoap12 нужны при вызове из 1С

В разделе service адрес собирается из того, по какому адресу пришёл запрос WSDL. Если сервер стоит за NAT или обратным прокси, клиент может получить внутренний адрес. Тогда при вызове адрес точки подключения задают явно.

Контракт меняйте аккуратно. Переименовали параметр или поменяли его тип — внешняя система, собранная по старому WSDL, начнёт получать ошибки. Новые методы лучше добавлять отдельными операциями, а старые оставлять до перехода всех клиентов.

Передача данных через веб-сервис: типы 1С и XDTO

SOAP знает только XML-типы. Ссылку на справочник, таблицу значений или структуру 1С напрямую в ответ не положить — их нужно привести к типам XML-схемы.

Простые типы

Тип в 1СТип в WSDLНюанс
Строкаxs:stringСамый универсальный, в него упаковывают JSON
Числоxs:decimal, xs:intДля xs:int дробная часть недопустима
Булевоxs:booleanКлиент шлёт true или false
Датаxs:dateTimeФормат 2026-10-07T15:30:00, без часового пояса 1С его не интерпретирует
Двоичные данныеxs:base64BinaryФайлы, PDF, картинки

Сложные типы через пакет XDTO

Для ответа со структурой (например, заказ с шапкой и строками) создайте в Общие → XDTO-пакеты свой пакет. В нём опишите тип объекта Order со свойствами Number, Date и списком Lines. Затем укажите пакет в свойстве веб-сервиса и выберите тип как возвращаемое значение.

В модуле объект создаётся через фабрику:

Функция GetOrder(Number)

	ТипЗаказа = ФабрикаXDTO.Тип("http://mycompany.ru/exchange", "Order");
	Заказ = ФабрикаXDTO.Создать(ТипЗаказа);
	Заказ.Number = Number;
	Заказ.Date = ТекущаяДатаСеанса();

	Возврат Заказ;

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

Строка с JSON или XML

Практичный компромисс — передавать одну строку, а внутри JSON. Контракт WSDL остаётся простым, структуру можно расширять без переопубликации. Минус: клиент не видит схему данных, её придётся описать отдельно.

Ссылки 1С (СправочникСсылка) снаружи не имеют смысла. Передавайте код, артикул, ИНН или уникальный идентификатор строкой — Строка(Ссылка.УникальныйИдентификатор()).

Вызов внешнего веб-сервиса из 1С

Обратная задача — когда 1С сама обращается к чужому SOAP-сервису. Для этого есть два варианта.

Статическая WS-ссылка. В Общие → WS-ссылки добавляют ссылку и указывают адрес WSDL. Конфигуратор загрузит описание в конфигурацию. Удобно, когда контракт стабилен.

Динамический вызов. WSDL читается в момент вызова. Гибче, но каждый раз тратит время на загрузку описания:

Определения = Новый WSОпределения(
	"http://webserver/buh/ws/Exchange.1cws?wsdl", "ws_user", "Пароль");

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

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

Второй и третий параметры WSПрокси берутся из WSDL: пространство имён и имя сервиса из раздела service, имя точки подключения — оттуда же. Логин и пароль задают дважды: в WSОпределения — для загрузки WSDL, в свойствах прокси — для самих вызовов.

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

Веб-сервис открывает базу наружу. Ошибка в настройке прав здесь стоит дороже, чем в обычном интерфейсе.

Отдельный пользователь и роль

  1. Создайте роль, например ВебСервисОбмен. Дайте в ней право «Использование» на нужный веб-сервис.
  2. В той же роли дайте минимальные права на объекты, которые читает или пишет модуль. Только чтение регистра остатков — значит, только чтение.
  3. Заведите пользователя ws_user только с этой ролью и аутентификацией 1С:Предприятия.
  4. Отключите ему «Показывать в списке выбора»: интерактивно под ним никто работать не должен.

Если в модуле нужен доступ к данным шире, чем у роли, используйте привилегированный режим точечно: УстановитьПривилегированныйРежим(Истина) и обратно сразу после нужной операции.

Чек-лист защиты публикации

Перед выводом веб-сервиса в интернет
Выполнено: 0 / 6

Не вписывайте логин и пароль администратора в строку подключения публикации. Тогда каждый запрос без авторизации будет выполняться с полными правами, а файл default.vrd лежит в каталоге веб-сервера в открытом виде.

HTTPS настраивается на стороне веб-сервера, не в 1С. Сама платформа принимает запрос уже расшифрованным от IIS или Apache.

Тестирование и диагностика интеграции через веб-сервисы

Проверяйте по слоям: сначала веб-сервер, потом WSDL, потом вызов метода.

  1. Браузер. Открыть ...Exchange.1cws?wsdl. Пришёл XML — публикация живая.
  2. SoapUI или Postman. Создать проект по адресу WSDL. SoapUI сам построит конверты для каждой операции, останется подставить значения и авторизацию Basic.
  3. curl — когда на сервере нет графики:
curl -u ws_user:Пароль -H "Content-Type: text/xml; charset=utf-8" --data-binary @request.xml http://webserver/buh/ws/Exchange.1cws

Файл request.xml с конвертом SOAP 1.1:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:ex="http://mycompany.ru/exchange">
  <soap:Body>
    <ex:GetStock>
      <ex:Article>А-1024</ex:Article>
    </ex:GetStock>
  </soap:Body>
</soap:Envelope>
  1. Отладка модуля. В конфигураторе в настройках автоматического подключения отладки (Отладка → Подключение) включите отладку сеансов веб-сервисов. В default.vrd для публикации должна быть разрешена отладка. Тогда точка останова в модуле сработает при внешнем вызове.
  2. Журнал регистрации. Исключения из модуля фиксируются там с текстом ошибки. Отбор по приложению «Web-сервис» быстро отсекает события пользователей.

Расшифровка типичных ответов:

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

При обновлении платформы путь в httpd.conf к wsap24.dll остаётся старым. Удалите старую версию платформы — и публикация перестанет работать. Перепубликуйте базу или поправьте путь вручную.

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

Нужна ли отдельная лицензия для веб-сервисов 1С?
Отдельного вида лицензии для веб-сервисов нет. Сеанс веб-сервиса работает в рамках лицензий, установленных для базы, поэтому при активном обмене учитывайте его при расчёте числа лицензий.
Можно ли опубликовать веб-сервис в файловой базе?
Да. Публикация работает и для файловой базы, но пользователь, от которого запущен веб-сервер, должен иметь права на чтение и запись в каталог базы.
Что выбрать для нового обмена с сайтом: SOAP или HTTP-сервис?
Если сайт работает с JSON и REST, выбирайте HTTP-сервис: его проще вызывать из PHP или JavaScript. SOAP оставьте для партнёров, которые требуют WSDL.
Почему первый вызов веб-сервиса медленный, а следующие быстрые?
При первом вызове платформа открывает сеанс и загружает конфигурацию. Повторное использование сеансов настраивается в default.vrd атрибутом reuseSessions у точки сервиса.
Как передать файл через веб-сервис 1С?
Объявите параметр типа xs:base64Binary. В модуле он придёт как ДвоичныеДанные, которые можно записать в файл или в присоединённые файлы.