Развертывание и интеграция веб-сервисов (Web Services) на платформе 1С — это мощный инструмент для организации межсистемного взаимодействия. Однако при первом знакомстве с этим механизмом разработчики часто сталкиваются с неочевидными ошибками. Наиболее популярными из них являются падение платформы на этапе создания объекта WSПрокси с сообщениями «Сервис не найден» или «Неверный порт», а также сложности с публикацией файлов описания веб-сервисов на сторонних веб-серверах (IIS или Apache).
В этой статье мы подробно разберем, как устроена работа SOAP веб-сервисов в 1С, выясним связь между веб-сервисами и пакетами XDTO, пошагово настроим популярные веб-серверы и проанализируем неочевидные тонкости программного кода на стороне клиента, которые могут приводить к сбоям.
Прежде чем переходить к практической настройке, важно понять теоретическую базу. Веб-сервисы в 1С используют открытый стандарт SOAP (Simple Object Access Protocol). Передача данных в SOAP происходит в формате XML. Для того чтобы платформа 1С понимала, какие типы данных передаются через веб-сервис и как их структурировать, используются пакеты XDTO (XML Data Transfer Objects).
Пакет XDTO — это своего рода схема-шаблон (аналог XML Schema, или .xsd файла), описывающая типы данных: свойства объектов, их структуру, типы (строка, число, дата) и связи между ними. Когда мы создаем веб-сервис в Конфигураторе 1С:
Файлы с расширением .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-файл.
Рассмотрим классический сценарий. Разработчик успешно настроил веб-сервер, опубликовал веб-сервис и проверил его работоспособность через браузер. Однако при попытке программного подключения со стороны клиента 1С на строке создания прокси-клиента происходит аварийное завершение работы.
Типичный проблемный код выглядит следующим образом:
Определения = Новый WSОпределения("http://localhost/MyBase/ws/MyService.1cws?wsdl");
// Инициализация прокси-класса
Прокси = Новый WSПрокси(Определения, "http://www.myuri.org", "MyService", "MyService" + "SOAP");
При выполнении этого кода система выдает ошибку «Сервис не найден» или «Неверный порт». Давайте выясним причину такого поведения. Проанализируем параметры конструктора WSПрокси:
WSОпределения, который мы успешно получили на первом шаге.Главная засада кроется именно в четвертом параметре — Имя точки подключения. Платформа 1С генерирует имена точек подключения автоматически, добавляя суффикс протокола к имени сервиса. По умолчанию используется протокол SOAP. Но регистр написания критически важен! Платформа генерирует имя точки подключения с суффиксом Soap (где первая буква заглавная, а остальные — строчные), а не полностью заглавными буквами SOAP.
Таким образом, если написать "MyService" + "SOAP", платформа выдаст ошибку, так как точное совпадение имени точки подключения в WSDL-схеме не найдено. Исправим код на правильный:
Определения = Новый WSОпределения("http://localhost/MyBase/ws/MyService.1cws?wsdl");
ПространствоИмен = "http://www.myuri.org";
ИмяСервиса = "MyService";
ТочкаПодключения = "MyServiceSoap"; // Правильный регистр!
Прокси = Новый WSПрокси(Определения, ПространствоИмен, ИмяСервиса, ТочкаПодключения);
После корректировки регистра букв в суффиксе точки подключения создание прокси-клиента пройдет успешно.
Если вы используете веб-сервер 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>
Разберем параметры этой конфигурации:
LoadModule указывает путь к соответствующей dll-библиотеке расширения веб-сервисов 1С. Обратите внимание на версию веб-сервера. Для разных версий Apache используются разные файлы: например, wsapch2.dll для Apache 2.0, wsapch22.dll для Apache 2.2 и так далее.Alias задает имя виртуального каталога в URL-адресе (в нашем примере /ws) и сопоставляет его с физической папкой на диске сервера, где будут лежать файлы публикации веб-сервисов.<Directory> предписывает веб-серверу обрабатывать все входящие запросы к этому каталогу силами обработчика 1С (SetHandler 1cws-process).Для развертывания веб-сервисов на Microsoft IIS необходимо выполнить настройку сопоставления обработчиков. Без этого веб-сервер не поймет, как обрабатывать запросы к файлам с расширением .1cws.
Рассмотрим последовательность действий для ручной настройки IIS:
.1cws (для веб-сервисов).1crs (для удаленного администрирования)"C:\Program Files\1cv81\bin\wsisapi.dll"wsisapi.dll должна иметь статус "Allowed" / "Разрешено").В современных версиях платформы 1С (8.2, 8.3) ручная модификация конфигурационных файлов веб-серверов больше не требуется. Платформа перешла на использование единого файла описания публикации — default.vrd.
Файл default.vrd представляет собой XML-документ, который автоматически размещается в физическом каталоге публикации на веб-сервере. В нем содержатся параметры подключения к информационной базе, а также списки доступных SOAP и HTTP веб-сервисов.
Для публикации веб-сервисов в актуальных версиях платформы выполните следующие шаги:
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
Частой причиной ошибки HTTP 500.0 - Internal Server Error при обращении к веб-сервису 1С через IIS является конфликт разрядности процессов.
По умолчанию современные операционные системы Windows работают в 64-разрядном режиме, и пулы приложений IIS запускаются как 64-битные процессы. Если на сервере установлена 32-битная платформа 1С, то библиотека расширения wsisapi.dll также является 32-битной. 64-битный пул IIS не сможет загрузить 32-битную библиотеку.
Для решения этой проблемы выполните следующие действия в диспетчере IIS:
DefaultAppPool).Если вы используете полноценную 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).
Обязательно предоставьте следующие права:
bin установленной платформы 1С (где расположены файлы wsisapi.dll или wsapch2.dll). В противном случае веб-сервер вернет ошибку доступа при попытке загрузить модуль расширения.default.vrd, для возможности обновления конфигурации публикации.1Cv8.1CD), так как сеанс веб-сервиса будет обращаться к файлу базы напрямую от имени процесса веб-сервера.При использовании динамического подключения с помощью конструкции Новый 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");
// Удаление временного файла после работы
УдалитьФайлы(ИмяФайлаСхемы);
При выводе веб-сервисов в промышленную эксплуатацию (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);
Несмотря на то, что SOAP веб-сервисы остаются надежным решением, современная экосистема интеграций все чаще отдает предпочтение HTTP-сервисам, которые появились в платформе 1С начиная с версии 8.3.
Преимущества перехода на HTTP-сервисы:
ЧтениеJSON и ЗаписьJSON.Мы подробно изучили все этапы работы с классическими SOAP веб-сервисами в 1С: от проектирования структуры данных XDTO и настройки веб-серверов до тонкостей написания кода инициализации WSПрокси. Соблюдение регистра имен параметров, корректная настройка разрядности пулов веб-серверов и управление правами доступа избавят вас от необходимости использовать "шаманский бубен" при интеграции систем.