Как правильно вызвать метод Receive веб-сервиса Сфера EDI в 1С при ошибке параметров?

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

Интеграция с EDI-провайдерами (Electronic Data Interchange), такими как Сфера EDI (ныне СберКорус), является стандартной задачей для современного программиста 1С. Однако при работе через протокол SOAP часто возникают сложности, связанные с тем, как платформа 1С интерпретирует WSDL-описания. Одной из самых распространенных проблем является вызов метода Receive, который отказывается работать по стандартной схеме вызова функций веб-сервиса.

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

Анализ проблемы: почему стандартный подход не работает

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

Проблема с методом Receive заключается в его описании внутри WSDL. В отличие от других методов, он использует так называемые выходные параметры (out-parameters). Это означает, что данные возвращаются не через оператор Return, а записываются непосредственно в переменные, которые были переданы в метод при вызове. Платформа 1С при импорте такой WS-ссылки видит этот метод не как функцию, а как процедуру.

Именно поэтому попытка написать Результат = Прокси.process(Запрос) приводит к ошибке. Нам необходимо подготовить переменные-приемники и вызвать метод без присваивания результата переменной.

Шаг 1. Определение правильного состава параметров

Проанализируем структуру вызова. Как показывает практика и отладка, сервис ожидает ровно 7 параметров. Если передать меньше или попытаться упаковать их в одну структуру (как в случае с ReceiveInput), 1С выдаст ошибку о несоответствии количества фактических параметров.

Разберем назначение каждого из семи параметров по порядку:

  1. Name — логин пользователя для авторизации в системе Сфера EDI.
  2. Password — пароль пользователя.
  3. RelationId — идентификатор взаимосвязи (получается предварительно методом Relationships).
  4. DocumentId — идентификатор конкретного документа. Если мы хотим получить следующий документ из очереди, обычно передается пустая строка или неопределено.
  5. Filter — строковый фильтр. Чаще всего используется значение "N", что означает получение только новых (непрочитанных) документов.
  6. Res — (Выходной параметр) Сюда сервис запишет тело самого документа (обычно в формате XDTO или строку Base64).
  7. Cnt — (Выходной параметр) Сюда сервис запишет количество оставшихся документов в очереди.

Шаг 2. Реализация вызова в коде 1С

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


// 1. Инициализируем переменные для получения результата
ПеременнаяРезультат = Неопределено;
ОстатокДокументов = Неопределено;

// 2. Определяем параметры подключения
Логин = "ВашЛогин";
Пароль = "ВашПароль";
ИдентификаторСвязи = "12345-67890"; // Получен ранее
ИдентификаторДокумента = ""; // Пусто для получения следующего
Фильтр = "N";

// 3. Вызываем метод как ПРОЦЕДУРУ
// Обратите внимание: Результат = Прокси.process(...) писать НЕЛЬЗЯ
Попытка
    Прокси.process(
        Логин, 
        Пароль, 
        ИдентификаторСвязи, 
        ИдентификаторДокумента, 
        Фильтр, 
        ПеременнаяРезультат, 
        ОстатокДокументов
    );
    
    // После успешного выполнения ПеременнаяРезультат будет содержать объект XDTO с данными документа
    Если ПеременнаяРезультат <> Неопределено Тогда
        // Обработка полученного документа
        Сообщить("Документ успешно получен. Осталось в очереди: " + ОстатокДокументов);
    КонецЕсли;
    
Исключение
    Инфо = ИнформацияОбОшибке();
    Сообщить("Ошибка при вызове Receive: " + Инфо.Описание);
КонецПопытки;

Шаг 3. Обработка особенностей параметра Cnt

Проанализируем ситуацию с параметром Cnt (Count). Многие разработчики отмечают, что серверная часть "Сферы" не всегда корректно заполняет это поле. Иногда оно возвращается пустым, даже если в очереди есть еще документы.

Рекомендация: Не полагайтесь исключительно на значение Cnt для организации цикла получения документов. Правильнее всего организовать цикл Пока, который будет запрашивать документы до тех пор, пока параметр Res (ПеременнаяРезультат) не вернется со значением Неопределено или пока тело документа не окажется пустым.

Альтернативные способы интеграции

Если работа через WS-ссылку и SOAP в 1С кажется вам слишком нестабильной или сложной из-за особенностей платформы, рассмотрим два других варианта, которые предлагает провайдер:

  1. Использование COM-компоненты (DLL). Провайдер предоставляет специальную библиотеку (Sfera.EDI Core), которая скрывает внутри себя всю сложность SOAP-запросов. В 1С вы просто создаете Новый COMОбъект и вызываете его методы. Это избавляет от проблем с типами данных XDTO и выходными параметрами в веб-сервисах 1С.
  2. Переход на REST API. Современный стандарт взаимодействия. В этом случае мы используем объект HTTPСоединение. Авторизация передается в заголовках, а данные приходят в виде обычного JSON или XML. REST API лишен проблем с "процедурным" вызовом и гораздо легче отлаживается через инструменты типа Postman.

Заключение

Мы выяснили причину ошибки при работе со Сферой EDI: она кроется в специфике реализации метода Receive в WSDL. Для успешного решения задачи необходимо:

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

← На главную