Как настроить веб-сервисы SOAP в 1С и исправить ошибки при инициализации WSПрокси

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Развертывание и интеграция веб-сервисов (Web Services) на платформе 1С — это мощный инструмент для организации межсистемного взаимодействия. Однако при первом знакомстве с этим механизмом разработчики часто сталкиваются с неочевидными ошибками. Наиболее популярными из них являются падение платформы на этапе создания объекта WSПрокси с сообщениями «Сервис не найден» или «Неверный порт», а также сложности с публикацией файлов описания веб-сервисов на сторонних веб-серверах (IIS или Apache).

В этой статье мы подробно разберем, как устроена работа SOAP веб-сервисов в 1С, выясним связь между веб-сервисами и пакетами XDTO, пошагово настроим популярные веб-серверы и проанализируем неочевидные тонкости программного кода на стороне клиента, которые могут приводить к сбоям.

В чем связь пакетов XDTO и веб-сервисов

Прежде чем переходить к практической настройке, важно понять теоретическую базу. Веб-сервисы в 1С используют открытый стандарт SOAP (Simple Object Access Protocol). Передача данных в SOAP происходит в формате XML. Для того чтобы платформа 1С понимала, какие типы данных передаются через веб-сервис и как их структурировать, используются пакеты XDTO (XML Data Transfer Objects).

Пакет XDTO — это своего рода схема-шаблон (аналог XML Schema, или .xsd файла), описывающая типы данных: свойства объектов, их структуру, типы (строка, число, дата) и связи между ними. Когда мы создаем веб-сервис в Конфигураторе 1С:

  1. Мы определяем операции веб-сервиса (методы, которые будут вызываться удаленно).
  2. Для каждого входного или выходного параметра операции мы указываем тип данных. Этот тип берется непосредственно из созданного нами или стандартного пакета XDTO.
  3. При обращении к веб-сервису платформа автоматически сериализует объекты 1С в XML по правилам схемы XDTO на стороне отправителя и десериализует обратно в объекты на стороне получателя.

Файлы с расширением .1cws — это внутреннее описание веб-сервиса в системе 1С. Файл с расширением .wsdl (Web Services Description Language) — это стандартизированное XML-описание веб-сервиса, понятное любым внешним системам (Java, C#, PHP и др.). Включать вручную содержимое .xsd схем в .1cws файл не нужно. Веб-сервер 1С формирует WSDL-схему динамически «на лету». Чтобы получить готовый файл описания WSDL, достаточно к адресу публикации веб-сервиса в браузере добавить суффикс ?wsdl (например, http://localhost/MyBase/ws/MyService.1cws?wsdl). Платформа сама включит все необходимые XSD-схемы из пакетов XDTO в итоговый WSDL-файл.

Разбор ошибки инициализации WSПрокси: регистр имеет значение

Рассмотрим классический сценарий. Разработчик успешно настроил веб-сервер, опубликовал веб-сервис и проверил его работоспособность через браузер. Однако при попытке программного подключения со стороны клиента 1С на строке создания прокси-клиента происходит аварийное завершение работы.

Типичный проблемный код выглядит следующим образом:


Определения = Новый WSОпределения("http://localhost/MyBase/ws/MyService.1cws?wsdl");
// Инициализация прокси-класса
Прокси = Новый WSПрокси(Определения, "http://www.myuri.org", "MyService", "MyService" + "SOAP");

При выполнении этого кода система выдает ошибку «Сервис не найден» или «Неверный порт». Давайте выясним причину такого поведения. Проанализируем параметры конструктора WSПрокси:

  1. Первый параметр: Объект WSОпределения, который мы успешно получили на первом шаге.
  2. Второй параметр: Пространство имен (URI) веб-сервиса, заданное в Конфигураторе в свойствах веб-сервиса (а не адрес прокси-сервера!).
  3. Третий параметр: Имя самого веб-сервиса, как оно задано в конфигурации.
  4. Четвертый параметр: Имя точки подключения (Port Name в терминологии WSDL).

Главная засада кроется именно в четвертом параметре — Имя точки подключения. Платформа 1С генерирует имена точек подключения автоматически, добавляя суффикс протокола к имени сервиса. По умолчанию используется протокол SOAP. Но регистр написания критически важен! Платформа генерирует имя точки подключения с суффиксом Soap (где первая буква заглавная, а остальные — строчные), а не полностью заглавными буквами SOAP.

Таким образом, если написать "MyService" + "SOAP", платформа выдаст ошибку, так как точное совпадение имени точки подключения в WSDL-схеме не найдено. Исправим код на правильный:


Определения = Новый WSОпределения("http://localhost/MyBase/ws/MyService.1cws?wsdl");

ПространствоИмен = "http://www.myuri.org";
ИмяСервиса = "MyService";
ТочкаПодключения = "MyServiceSoap"; // Правильный регистр!

Прокси = Новый WSПрокси(Определения, ПространствоИмен, ИмяСервиса, ТочкаПодключения);

После корректировки регистра букв в суффиксе точки подключения создание прокси-клиента пройдет успешно.

Ручная настройка веб-сервера Apache для работы с 1С

Если вы используете веб-сервер Apache (например, версию 2.0 или 2.2), для корректной работы веб-сервисов 1С необходимо вручную прописать библиотеки расширения в конфигурационный файл httpd.conf. Выясним, как правильно это сделать.

Откроем файл httpd.conf текстовым редактором и добавим в самый конец следующие строки настроек:


# Подключение модуля расширения 1С для Apache 2.0
LoadModule _1cws_module "C:\Program Files\1cv81\bin\wsapch2.dll"

# Настройка виртуального каталога для публикации
Alias /ws "C:\Inet\localhost\www"

<Directory "C:\Inet\localhost\www">
    DirectorySlash Off
    SetHandler 1cws-process
</Directory>

Разберем параметры этой конфигурации:

Ручная настройка IIS (Internet Information Services)

Для развертывания веб-сервисов на Microsoft IIS необходимо выполнить настройку сопоставления обработчиков. Без этого веб-сервер не поймет, как обрабатывать запросы к файлам с расширением .1cws.

Рассмотрим последовательность действий для ручной настройки IIS:

  1. Откройте Диспетчер служб IIS (Internet Information Services Manager).
  2. Создайте или выберите существующий виртуальный каталог (Virtual Directory) для вашей публикации 1С.
  3. Перейдите в свойства виртуального каталога. В разделе Application Settings (Настройки приложения) нажмите кнопку Create (Создать), чтобы создать приложение для данного каталога.
  4. Нажмите кнопку Configuration (Настройка).
  5. На вкладке Mappings (Сопоставления расширений) нажмите кнопку Add (Добавить) и зарегистрируйте два расширения:
    • Расширение: .1cws (для веб-сервисов)
    • Расширение: .1crs (для удаленного администрирования)
  6. В поле Executable (Исполняемый файл) для обоих расширений укажите путь к библиотеке расширения ISAPI от 1С. По умолчанию для платформы 1С 8.1 это:
    "C:\Program Files\1cv81\bin\wsisapi.dll"
  7. Убедитесь, что в свойствах IIS разрешено выполнение ISAPI-расширений (в разделе веб-сервера "Веб-службы расширений" / "ISAPI and CGI Restrictions" библиотека wsisapi.dll должна иметь статус "Allowed" / "Разрешено").

Современные практики: Автоматизация через default.vrd

В современных версиях платформы 1С (8.2, 8.3) ручная модификация конфигурационных файлов веб-серверов больше не требуется. Платформа перешла на использование единого файла описания публикации — default.vrd.

Файл default.vrd представляет собой XML-документ, который автоматически размещается в физическом каталоге публикации на веб-сервере. В нем содержатся параметры подключения к информационной базе, а также списки доступных SOAP и HTTP веб-сервисов.

Для публикации веб-сервисов в актуальных версиях платформы выполните следующие шаги:

  1. Запустите Конфигуратор 1С от имени Администратора.
  2. Перейдите в меню Администрирование — Публикация на веб-сервере....
  3. В открывшемся окне выберите тип веб-сервера (IIS или Apache) и укажите имя каталога.
  4. На вкладке Веб-сервисы установите флажки напротив тех веб-сервисов вашей конфигурации, которые должны быть доступны внешним клиентам.
  5. Нажмите кнопку Опубликовать. Платформа сама сконфигурирует веб-сервер и создаст корректный файл default.vrd.

Для автоматизации развертывания веб-сервисов на серверах без графического интерфейса (например, под управлением ОС Linux) рекомендуется использовать консольную утилиту webinst, которая поставляется вместе с дистрибутивом платформы 1С. Пример команды для публикации базы и всех веб-сервисов на веб-сервере Apache:


webinst -apache24 -ws -dir /var/www/html/mybase -connstr "Srvr=Server1C;Ref=MyBase;" -confPath /etc/httpd/conf/httpd.conf

Проблема разрядности (32-bit vs 64-bit) на IIS

Частой причиной ошибки HTTP 500.0 - Internal Server Error при обращении к веб-сервису 1С через IIS является конфликт разрядности процессов.

По умолчанию современные операционные системы Windows работают в 64-разрядном режиме, и пулы приложений IIS запускаются как 64-битные процессы. Если на сервере установлена 32-битная платформа 1С, то библиотека расширения wsisapi.dll также является 32-битной. 64-битный пул IIS не сможет загрузить 32-битную библиотеку.

Для решения этой проблемы выполните следующие действия в диспетчере IIS:

  1. Перейдите в раздел Пулы приложений (Application Pools).
  2. Выберите пул приложений, который обслуживает ваш виртуальный каталог (по умолчанию это DefaultAppPool).
  3. В панели действий справа выберите пункт Дополнительные параметры (Advanced Settings).
  4. Найдите параметр Разрешить 32-разрядные приложения (Enable 32-Bit Applications) и установите его в значение True.
  5. Нажмите кнопку ОК и перезапустите пул приложений.

Если вы используете полноценную 64-битную версию сервера 1С, убедитесь, что в настройках обработчика IIS указан путь к 64-битной библиотеке wsisapi.dll из каталога C:\Program Files\1cv8\..., а не из каталога 32-битных приложений C:\Program Files (x86)\1cv8\....

Настройка прав доступа для пользователей операционной системы

Для успешного выполнения запросов к веб-сервису процессы веб-сервера должны обладать правами доступа к бинарным файлам платформы 1С и к каталогу публикации базы данных. Работа веб-сервера под административной учетной записью крайне небезопасна, поэтому веб-серверы используют ограниченные системные учетные записи (например, IUSR, IIS_IUSRS в Windows или пользователь www-data / apache в Linux).

Обязательно предоставьте следующие права:

Борьба с кэшированием WSDL-схем и статическое подключение

При использовании динамического подключения с помощью конструкции Новый WSОпределения(URL) разработчики часто сталкиваются с проблемой кэширования схем. Если вы внесли изменения в структуру веб-сервиса, обновили пакет XDTO или добавили новые реквизиты, клиентское приложение 1С может продолжать использовать старую структуру, хранящуюся в кэше операционной системы или платформы. Это приводит к труднодиагностируемым ошибкам в рантайме.

Для решения проблемы кэширования можно использовать два подхода:

Вариант 1. Использование статических WS-ссылок

Вместо динамического конструирования объектов через программный код, добавьте в дерево метаданных конфигурации-клиента объект WS-ссылка. При создании ссылки укажите адрес WSDL-описания. Платформа один раз импортирует структуру веб-сервиса непосредственно в конфигурацию. Обращение к сервису из кода станет значительно проще и быстрее, так как системе не потребуется тратить время и сетевой трафик на загрузку WSDL-схемы при каждом вызове:


// Вызов веб-сервиса через статическую WS-ссылку
Прокси = WSСсылки.МояСтатическаяСсылка.СоздатьWSПрокси();
Результат = Прокси.ИмяМетода(Параметры);

Недостаток этого метода заключается в том, что при любом изменении структуры веб-сервиса вам потребуется обновлять конфигурацию клиента, заново импортируя схему в WS-ссылку.

Вариант 2. Принудительный сброс кэша программным путем

Если необходимо сохранить динамическое подключение, можно программно скачивать файл WSDL на локальный диск клиента во временный каталог, а затем инициализировать WSОпределения, указывая путь к локальному файлу. Это гарантирует, что схема будет загружена заново, минуя системный кэш сетевых запросов:


ИмяФайлаСхемы = ПолучитьИмяВременногоФайла("wsdl");

// Скачивание файла схемы на диск с помощью HTTP-соединения
Соединение = Новый HTTPСоединение("localhost", 80);
Соединение.Получить("MyBase/ws/MyService.1cws?wsdl", ИмяФайлаСхемы);

// Инициализация по локальному файлу схемы
Определения = Новый WSОпределения(ИмяФайлаСхемы);
Прокси = Новый WSПрокси(Определения, "http://www.myuri.org", "MyService", "MyServiceSoap");

// Удаление временного файла после работы
УдалитьФайлы(ИмяФайлаСхемы);

Безопасность (HTTPS), авторизация и таймауты

При выводе веб-сервисов в промышленную эксплуатацию (production) критически важно обеспечить безопасность передаваемых данных и стабильность работы системы под нагрузкой.

Использование безопасного протокола HTTPS

Если ваш веб-сервер настроен на работу по защищенному протоколу HTTPS с использованием SSL/TLS сертификатов, попытка инициализировать веб-сервис стандартным способом вызовет ошибку безопасности. Для работы по HTTPS необходимо передавать объект защищенного соединения в конструктор:


// Создание объекта защищенного соединения
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

// Передаем защищенное соединение в конструктор определений
Определения = Новый WSОпределения("https://secure.myserver.ru/MyBase/ws/MyService.1cws?wsdl", , , , ЗащищенноеСоединение);

Авторизация пользователей

Для предотвращения несанкционированного доступа к данным веб-сервисы всегда должны требовать авторизацию. Вы можете использовать стандартную Basic-авторизацию 1С. Логин и пароль пользователя 1С (с правами на выполнение веб-сервиса) необходимо передавать как в WSОпределения, так и дублировать в свойствах созданного WSПрокси:


ИмяПользователя = "WS_User";
ПарольПользователя = "StrongPassword123";

Определения = Новый WSОпределения("http://localhost/MyBase/ws/MyService.1cws?wsdl", ИмяПользователя, ПарольПользователя);

Прокси = Новый WSПрокси(Определения, "http://www.myuri.org", "MyService", "MyServiceSoap");
// Дублируем авторизацию для выполнения самих методов
Прокси.Пользователь = ИмяПользователя;
Прокси.Пароль = ПарольПользователя;

Установка таймаута соединения

По умолчанию время ожидания ответа от веб-сервиса может быть неограниченным или очень длительным. Если удаленный сервер зависнет или связь прервется в процессе передачи пакета данных, сеанс пользователя 1С также окажется заблокированным. Чтобы избежать этого, всегда устанавливайте предельное время ожидания (таймаут) при создании прокси-объекта:


// Установка таймаута в 30 секунд при создании прокси
Прокси = Новый WSПрокси(Определения, "http://www.myuri.org", "MyService", "MyServiceSoap", , 30);

Современная альтернатива: HTTP-сервисы (REST API)

Несмотря на то, что SOAP веб-сервисы остаются надежным решением, современная экосистема интеграций все чаще отдает предпочтение HTTP-сервисам, которые появились в платформе 1С начиная с версии 8.3.

Преимущества перехода на HTTP-сервисы:

Мы подробно изучили все этапы работы с классическими SOAP веб-сервисами в 1С: от проектирования структуры данных XDTO и настройки веб-серверов до тонкостей написания кода инициализации WSПрокси. Соблюдение регистра имен параметров, корректная настройка разрядности пулов веб-серверов и управление правами доступа избавят вас от необходимости использовать "шаманский бубен" при интеграции систем.

← На главную