Как отладить веб-сервис в 1С и передать XML-файл в формате base64Binary?

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

Разработка и поддержка веб-сервисов в среде 1С:Предприятие — задача очень распространенная, но для начинающих разработчиков она часто сопряжена с техническими трудностями. Особенно когда дело доходит до этапа тестирования: точка останова в конфигураторе упорно «не ловит» вызовы, а внешняя система присылает данные в сложных бинарных форматах, таких как base64Binary.

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

Часть 1. Почему точка останова «не ловит»? Настраиваем окружение для отладки

Часто разработчики сталкиваются с ситуацией: веб-сервис опубликован, внешняя система отправляет запросы и даже получает ответы, но при установке точки останова в модуле веб-сервиса или общем модуле конфигуратор никак не реагирует. Разберем основные причины этой проблемы и пошагово настроим систему.

Шаг 1. Включение режима отладки на сервере 1С

По умолчанию сервер «1С:Предприятия» запускается в рабочем режиме, в котором отладка серверных вызовов полностью отключена в целях оптимизации производительности. Если ваша информационная база развернута в клиент-серверном варианте, необходимо принудительно активировать отладочный режим службы.

Для операционной системы Windows:

  1. Откройте редактор реестра (нажмите Win + R, введите regedit и нажмите Enter).
  2. Перейдите по пути: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent... (название ветки зависит от конкретной версии платформы).
  3. Найдите строковый параметр ImagePath.
  4. В самый конец значения этого параметра (после всех кавычек) добавьте через пробел ключ -debug.
  5. Откройте оснастку «Службы» (services.msc) и перезапустите службу «Агент сервера 1С:Предприятия».

Для операционной системы Linux:

  1. Откройте конфигурационный файл службы (в зависимости от дистрибутива и версии платформы это может быть файл /etc/init.d/srv1cv83 или systemd-юнит по адресу /lib/systemd/system/srv1cv83.service).
  2. Найдите переменную SRV1CV8_DEBUG (или добавьте ее в секцию окружения) и присвойте ей значение 1 (SRV1CV8_DEBUG=1).
  3. Перезапустите службу сервера 1С с помощью команды терминала: systemctl restart srv1cv83.

Шаг 2. Разрешение отладки в файле публикации веб-сервиса (default.vrd)

Когда вы публикуете базу данных на веб-сервере (IIS или Apache), в каталоге публикации создается специальный файл конфигурации default.vrd. Без явного указания параметров отладки в этом файле веб-сервер не будет передавать информацию отладчику 1С.

Рассмотрим, как его правильно настроить:

  1. Перейдите в каталог, куда была выполнена публикация (например, C:\inetpub\wwwroot\MyBase\ для IIS или соответствующую директорию для Apache).
  2. Откройте файл default.vrd с помощью любого текстового редактора (например, Блокнота) с правами администратора.
  3. Внутри корневого тега <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=&quot;MyServer&quot;;Ref=&quot;MyBase&quot;;">
    <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. Включение автоматического подключения веб-сервисов в Конфигураторе

Даже если сервер и веб-публикация настроены верно, Конфигуратор должен знать, какие именно типы сессий ему нужно перехватывать.

  1. Откройте Конфигуратор вашей базы данных.
  2. В главном меню перейдите в раздел Отладка -> Подключение...
  3. В открывшемся окне нажмите кнопку Автоматическое подключение.
  4. Установите флажок (галочку) напротив пункта Web-сервисы.
  5. Нажмите «ОК» и закройте окно подключений.

Шаг 4. Настройка брандмауэра (Firewall)

При использовании классического TCP/IP протокола отладки служба веб-сервиса пытается инициировать обратное подключение к вашему запущенному Конфигуратору. Если на вашем компьютере разработчика или на сервере включен брандмауэр Windows (или сторонний фаервол), эти сетевые пакеты будут заблокированы. Чтобы этого избежать, добавьте исполняемый файл 1cv8.exe в список исключений брандмауэра или временно отключите его для проверки связи.

Шаг 5. Под каким пользователем заходить?

У многих разработчиков возникает вопрос: нужно ли запускать Конфигуратор под тем же пользователем 1С, учетные данные которого использует внешняя система для авторизации в веб-сервисе?

Ответ: Нет, это делать не обязательно. Отладчик 1С перехватывает абсолютно любые сеансы веб-сервисов на сервере, если у вас включено «Автоматическое подключение» и версии конфигурации в вашем Конфигураторе и на сервере полностью совпадают (база обновлена).

---

Часть 2. Как эмулировать вызов веб-сервиса и передать XML-данные

Перейдем ко второму вопросу автора: у нас есть входящий 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ЗаказыПокупателей. Отладка сработает мгновенно, без участия веб-сервера.

Вариант Б. Эмуляция вызова веб-сервиса через WS-прокси из другой (или этой же) базы

Если вам крайне важно проверить весь путь прохождения запроса, включая сериализацию/десериализацию данных 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.

Вариант В. Использование внешних SOAP-клиентов (например, SoapUI)

Когда интеграция тестируется с внешней системой (написанной на Java, C#, PHP и др.), полезно уметь воспроизводить запросы из сторонних программ. Лучшим инструментом для этого является утилита SoapUI.

Проанализируем по шагам, как настроить отправку запроса в SoapUI:

  1. Скачайте и запустите SoapUI.
  2. Выберите пункт меню File -> New SOAP Project.
  3. В поле Initial WSDL вставьте ссылку на ваш опубликованный веб-сервис (например: http://localhost/MyBase/ws/MyWebService.1cws?wsdl) и нажмите ОК.
  4. SoapUI автоматически импортирует структуру и создаст шаблон запроса. Откройте сгенерированный запрос Request 1.
  5. Поскольку параметр Data имеет тип base64Binary, вы не можете просто вставить туда обычный XML-текст — веб-сервер выдаст ошибку разбора пакета SOAP. Нам нужно предварительно перекодировать содержимое нашего XML-файла в формат Base64.
  6. Чтобы быстро получить Base64-строку из вашего XML-файла, можно использовать простую встроенную функцию 1С, выполнив ее, например, в табло конфигуратора:

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С, под которой разрешен доступ к публикации базы. Нажмите зеленую кнопку запуска (зеленый треугольник). Запрос уйдет на веб-сервер, а ваш Конфигуратор остановит выполнение кода на заданной точке останова.

← На главную