Разработка и поддержка веб-сервисов в среде 1С:Предприятие — задача очень распространенная, но для начинающих разработчиков она часто сопряжена с техническими трудностями. Особенно когда дело доходит до этапа тестирования: точка останова в конфигураторе упорно «не ловит» вызовы, а внешняя система присылает данные в сложных бинарных форматах, таких как base64Binary.
В этой статье мы подробно и по шагам разберем, как правильно подготовить серверное окружение для отладки веб-сервисов, как обойти типичные проблемы блокировок и как эмулировать входящие запросы с передачей бинарных файлов несколькими удобными способами.
Часто разработчики сталкиваются с ситуацией: веб-сервис опубликован, внешняя система отправляет запросы и даже получает ответы, но при установке точки останова в модуле веб-сервиса или общем модуле конфигуратор никак не реагирует. Разберем основные причины этой проблемы и пошагово настроим систему.
Шаг 1. Включение режима отладки на сервере 1С
По умолчанию сервер «1С:Предприятия» запускается в рабочем режиме, в котором отладка серверных вызовов полностью отключена в целях оптимизации производительности. Если ваша информационная база развернута в клиент-серверном варианте, необходимо принудительно активировать отладочный режим службы.
Для операционной системы Windows:
Win + R, введите regedit и нажмите Enter).HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent... (название ветки зависит от конкретной версии платформы).ImagePath.-debug.services.msc) и перезапустите службу «Агент сервера 1С:Предприятия».Для операционной системы Linux:
/etc/init.d/srv1cv83 или systemd-юнит по адресу /lib/systemd/system/srv1cv83.service).SRV1CV8_DEBUG (или добавьте ее в секцию окружения) и присвойте ей значение 1 (SRV1CV8_DEBUG=1).systemctl restart srv1cv83.Шаг 2. Разрешение отладки в файле публикации веб-сервиса (default.vrd)
Когда вы публикуете базу данных на веб-сервере (IIS или Apache), в каталоге публикации создается специальный файл конфигурации default.vrd. Без явного указания параметров отладки в этом файле веб-сервер не будет передавать информацию отладчику 1С.
Рассмотрим, как его правильно настроить:
C:\inetpub\wwwroot\MyBase\ для IIS или соответствующую директорию для Apache).default.vrd с помощью любого текстового редактора (например, Блокнота) с правами администратора.<point> добавьте блок <debug>. Пример правильной структуры файла:
<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="/MyBase"
ib="Srvr="MyServer";Ref="MyBase";">
<ws>
<point name="MyWebService" alias="ws1.1cws" enable="true"/>
</ws>
<debug enable="true" protocol="tcp" url="tcp://localhost" />
</point>
Важный нюанс: Вместо протокола tcp и адреса localhost в современных версиях платформы (начиная с 8.3.8) рекомендуется использовать HTTP-отладку. В этом случае строка может выглядеть так: <debug enable="true" protocol="http" url="http://Адрес_Сервера_Отладки:Диапазон_Портов" />. После любого ручного изменения файла default.vrd обязательно перезапустите ваш веб-сервер (IIS или Apache), иначе новые настройки не применятся.
Шаг 3. Включение автоматического подключения веб-сервисов в Конфигураторе
Даже если сервер и веб-публикация настроены верно, Конфигуратор должен знать, какие именно типы сессий ему нужно перехватывать.
Шаг 4. Настройка брандмауэра (Firewall)
При использовании классического TCP/IP протокола отладки служба веб-сервиса пытается инициировать обратное подключение к вашему запущенному Конфигуратору. Если на вашем компьютере разработчика или на сервере включен брандмауэр Windows (или сторонний фаервол), эти сетевые пакеты будут заблокированы. Чтобы этого избежать, добавьте исполняемый файл 1cv8.exe в список исключений брандмауэра или временно отключите его для проверки связи.
Шаг 5. Под каким пользователем заходить?
У многих разработчиков возникает вопрос: нужно ли запускать Конфигуратор под тем же пользователем 1С, учетные данные которого использует внешняя система для авторизации в веб-сервисе?
Ответ: Нет, это делать не обязательно. Отладчик 1С перехватывает абсолютно любые сеансы веб-сервисов на сервере, если у вас включено «Автоматическое подключение» и версии конфигурации в вашем Конфигураторе и на сервере полностью совпадают (база обновлена).
---
Перейдем ко второму вопросу автора: у нас есть входящий XML-файл, который нужно обработать в процедуре, но на входе веб-сервиса ожидается тип base64Binary. Как проверить работу алгоритма, не привлекая сторонних разработчиков?
Тип данных base64Binary в стандартах XML-схем автоматически сопоставляется платформой 1С с типом ДвоичныеДанные. При вызове веб-сервиса платформа сама конвертирует пришедшую base64-строку в объект 1С. Поэтому аргумент Data в функции автора уже является готовыми двоичными данными, которые успешно записываются на диск методом Data.Записать(ПутьКФайлу).
Рассмотрим три удобных способа имитации вызова веб-сервиса для тестирования логики.
Если веб-сервис выполняет лишь роль «транспорта» (принимает файл, сохраняет его во временную папку и передает в общий модуль CW), то на этапе отладки бизнес-логики совершенно необязательно дергать сам веб-сервер. Мы можем написать простую внешнюю обработку (.epf), которая сделает всю подготовительную работу локально.
Разберем пример кода для кнопки такой обработки:
&НаКлиенте
Процедура ВыполнитьТест(Команда)
// 1. Указываем путь к реальному отладочному XML-файлу на диске
ПутьКФайлуXML = "C:\DebugFiles\Order_001.xml";
// 2. Передаем выполнение на сервер для имитации работы общего модуля
РезультатОбработки = ВыполнитьОбработкуНаСервере(ПутьКФайлуXML);
ПоказатьПредупреждение(, "Результат выполнения: " + РезультатОбработки);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВыполнитьОбработкуНаСервере(ПутьКФайлуXML)
// Создаем объект "ДвоичныеДанные" из нашего локального файла.
// Это полностью соответствует тому типу данных, который веб-сервис получает в параметре Data.
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлуXML);
// Имитируем логику веб-сервиса: записываем во временный файл
ПутьКВременномуФайлу = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанныеФайла.Записать(ПутьКВременномуФайлу);
ФайлXML = Новый Файл(ПутьКВременномуФайлу);
Результат = "Ошибка обработки";
Если ФайлXML.Существует() Тогда
// Напрямую вызываем метод нашего общего модуля CW
Результат = CW.ОбработатьFlasBackЗаказыПокупателей(ФайлXML.ПолноеИмя);
КонецЕсли;
// Удаляем временный файл
Попытка
УдалитьФайлы(ФайлXML.ПолноеИмя);
Исключение
// Обработка возможных исключений блокировки файла
КонецПопытки;
Возврат Строка(Результат);
КонецФункции
Запустив эту обработку в обычном режиме «1С:Предприятие», вы можете спокойно поставить точку останова прямо внутри процедуры CW.ОбработатьFlasBackЗаказыПокупателей. Отладка сработает мгновенно, без участия веб-сервера.
Если вам крайне важно проверить весь путь прохождения запроса, включая сериализацию/десериализацию данных SOAP, вы можете вызвать опубликованный веб-сервис программно из 1С. Для этого также создадим внешнюю обработку и напишем следующий код:
&НаСервереБезКонтекста
Процедура ВызватьОпубликованныйВебСервис()
// Адрес публикации вашего веб-сервиса (WSDL)
АдресПодключения = "http://localhost/MyBase/ws/MyWebService.1cws?wsdl";
ИмяПользователяWeb = "WebUser";
ПарольWeb = "12345";
Попытка
// Инициализируем WS-определения
Определения = Новый WSОпределения(АдресПодключения, ИмяПользователяWeb, ПарольWeb);
// Создаем прокси-объект. Обратите внимание на точное соответствие имен URI пространства,
// имени сервиса и имени точки подключения (настраивается в свойствах веб-сервиса в конфигураторе)
Прокси = Новый WSProxy(Определения, "http://www.w3.org/2001/XMLSchema", "MyWebService", "MyWebServiceSoap");
Прокси.Пользователь = ИмяПользователяWeb;
Прокси.Пароль = ПарольWeb;
// Считываем наш XML-файл в двоичные данные
ДвоичныеДанныеФайла = Новый ДвоичныеДанные("C:\DebugFiles\Order_001.xml");
// Вызываем веб-сервис. 1С сама сконвертирует ДвоичныеДанные в строку Base64
Результат = Прокси.LoadDoc(ДвоичныеДанныеФайла, 1);
ЗаписьЖурналаРегистрации("ОтладкаWeb", УровеньЖурналаРегистрации.Информация,,, "Результат: " + Результат);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("ОтладкаWeb", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
КонецПопытки;
КонецПроцедуры
Запуск этого кода приведет к реальному сетевому обращению к вашему веб-серверу. Если все шаги из Части 1 были выполнены успешно, отладчик в Конфигураторе перехватит выполнение прямо в момент входа в функцию веб-сервиса LoadDoc.
Когда интеграция тестируется с внешней системой (написанной на Java, C#, PHP и др.), полезно уметь воспроизводить запросы из сторонних программ. Лучшим инструментом для этого является утилита SoapUI.
Проанализируем по шагам, как настроить отправку запроса в SoapUI:
http://localhost/MyBase/ws/MyWebService.1cws?wsdl) и нажмите ОК.Request 1.Data имеет тип base64Binary, вы не можете просто вставить туда обычный XML-текст — веб-сервер выдаст ошибку разбора пакета SOAP. Нам нужно предварительно перекодировать содержимое нашего XML-файла в формат Base64.
Base64Строка(Новый ДвоичныеДанные("C:\DebugFiles\Order_001.xml"))
Полученную длинную текстовую строку вставьте внутрь XML-тега <web:Data> в SoapUI. Итоговый шаблон SOAP-запроса примет следующий вид:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.w3.org/2001/XMLSchema">
<soapenv:Header/>
<soapenv:Body>
<web:LoadDoc>
<web:Data>M0c0S0lDQm9kV0p1WVcxbFBTQXhNREUlM0Q...[Ваша Base64 строка]...</web:Data>
<web:DocType>1</web:DocType>
</web:LoadDoc>
</soapenv:Body>
</soapenv:Envelope>
Перед отправкой запроса перейдите во вкладку Auth внизу окна запроса в SoapUI, выберите тип авторизации Preemptive Pre-auth или Basic, укажите имя пользователя и пароль учетной записи 1С, под которой разрешен доступ к публикации базы. Нажмите зеленую кнопку запуска (зеленый треугольник). Запрос уйдет на веб-сервер, а ваш Конфигуратор остановит выполнение кода на заданной точке останова.