Почему веб-сервис 1С возвращает «Неопределено» и как правильно передавать параметры

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

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

Разбор синтаксиса и типичные ошибки возврата

Начнем с основ. В языке 1С оператор Возврат не является функцией, поэтому использование скобок, таких как Возврат("Ок");, технически допустимо (как выражение в скобках), но избыточно и может запутать. Правильный синтаксис выглядит так:


Функция ОбновитьДанные(Параметр1)
    // Логика функции
    Возврат "Ок";
КонецФункции

Если вы видите, что сервис возвращает Неопределено, в первую очередь нужно проверить, доходит ли выполнение кода до оператора Возврат. Рассмотрим ситуацию, когда в коде вызывающей стороны используется блок Попытка...Исключение.

Ловушка блока Попытка-Исключение

Проанализируем типичный код вызова веб-сервиса, который часто становится причиной «необъяснимого» поведения:


Попытка
    Результат = Прокси.Update(СтрокаВыгрузки);
Исключение
    // Пустой блок или просто запись в лог без остановки
КонецПопытки;

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

Совет: Для диагностики всегда выводите подробное описание ошибки в блоке исключения, используя функцию ОписаниеОшибки() или записывайте её в Журнал регистрации на сервере.

Обязательность параметров и направления передачи

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

  1. Возможно пустое: Если здесь стоит Ложь, а вы не передали значение при вызове (или передали Неопределено), сервис выдаст ошибку еще на этапе разбора SOAP-пакета.
  2. Направление передачи:
    • Входной (In): Параметр передается от клиента к серверу.
    • Выходной (Out): Параметр возвращается от сервера к клиенту (аналог передачи по ссылке).
    • Входной-Выходной (Inout): Значение передается в обе стороны.

Если ваша задача — просто получить результат работы функции, достаточно использовать возвращаемое значение самой операции. Однако, если вы хотите изменить несколько переменных, вам придется настроить дополнительные параметры с направлением Выходной.

Передача сложных типов данных: Текстовые документы и Хранилища

Рассмотрим ситуацию, когда необходимо передать не просто строку, а целый объект, например, ТекстовыйДокумент. Напрямую передать объект 1С через веб-сервис нельзя, так как стандарт WSDL «знает» только базовые типы XSD (строка, число, дата и т.д.).

Способ 1: Использование Хранилища Значения (ValueStorage)

Это самый простой, но «неканоничный» метод, подходящий для обмена между двумя базами 1С. Мы используем тип ValueStorage из пакета http://v8.1c.ru/8.1/data/core.

На стороне отправителя:


// Упаковываем текстовый документ в хранилище со сжатием
СтрокаВыгрузки = Новый ХранилищеЗначения(МойТекстовыйДокумент, Новый СжатиеДанных(9));
Результат = Прокси.Update(СтрокаВыгрузки);

На стороне веб-сервиса (сервер):


Функция Update(List)
    // Распаковываем данные
    ТекстовыйДокумент = List.Получить();
    Если ТипЗнч(ТекстовыйДокумент) = Тип("ТекстовыйДокумент") Тогда
        // Обработка
        Возврат "Ок";
    КонецЕсли;
    Возврат "Ошибка типа данных";
КонецФункции

Важно: Этот метод не подойдет, если к вашему сервису будет подключаться внешняя система (не 1С), так как она не сможет расшифровать внутренний формат ValueStorage.

Способ 2: Использование XDTO-пакетов (Профессиональный подход)

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

Как настроить отладку веб-сервиса

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

  1. Убедитесь, что в файле публикации default.vrd на веб-сервере (IIS или Apache) прописан параметр debug="true".
  2. В конфигураторе перейдите в меню Отладка -> Подключение -> Автоматическое подключение.
  3. Установите флажок «Сеансы на сервере» и «HTTP/SOAP соединения».
  4. Поставьте точку останова в модуле веб-сервиса и запустите вызов с клиента.

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

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

← На главную