Интеграция с EDI-провайдерами (Electronic Data Interchange), такими как Сфера EDI (ныне СберКорус), является стандартной задачей для современного программиста 1С. Однако при работе через протокол SOAP часто возникают сложности, связанные с тем, как платформа 1С интерпретирует WSDL-описания. Одной из самых распространенных проблем является вызов метода Receive, который отказывается работать по стандартной схеме вызова функций веб-сервиса.
В данной статье мы подробно разберем, почему возникает ошибка "Недостаточно фактических параметров" или "Обращение к процедуре как к функции", и научимся правильно передавать данные для получения входящих документов.
Рассмотрим стандартную логику работы с веб-сервисом в 1С. Обычно мы создаем WSПрокси, формируем объект XDTO (входной параметр) и вызываем метод, ожидая получить результат в качестве возвращаемого значения. С методом Relationships это работает без проблем, так как он спроектирован как классическая функция.
Проблема с методом Receive заключается в его описании внутри WSDL. В отличие от других методов, он использует так называемые выходные параметры (out-parameters). Это означает, что данные возвращаются не через оператор Return, а записываются непосредственно в переменные, которые были переданы в метод при вызове. Платформа 1С при импорте такой WS-ссылки видит этот метод не как функцию, а как процедуру.
Именно поэтому попытка написать Результат = Прокси.process(Запрос) приводит к ошибке. Нам необходимо подготовить переменные-приемники и вызвать метод без присваивания результата переменной.
Проанализируем структуру вызова. Как показывает практика и отладка, сервис ожидает ровно 7 параметров. Если передать меньше или попытаться упаковать их в одну структуру (как в случае с ReceiveInput), 1С выдаст ошибку о несоответствии количества фактических параметров.
Разберем назначение каждого из семи параметров по порядку:
Relationships)."N", что означает получение только новых (непрочитанных) документов.XDTO или строку Base64).Рассмотрим пример кода, который позволяет корректно вызвать метод и получить данные. Важно предварительно инициализировать переменные для выходных параметров значениями Неопределено.
// 1. Инициализируем переменные для получения результата
ПеременнаяРезультат = Неопределено;
ОстатокДокументов = Неопределено;
// 2. Определяем параметры подключения
Логин = "ВашЛогин";
Пароль = "ВашПароль";
ИдентификаторСвязи = "12345-67890"; // Получен ранее
ИдентификаторДокумента = ""; // Пусто для получения следующего
Фильтр = "N";
// 3. Вызываем метод как ПРОЦЕДУРУ
// Обратите внимание: Результат = Прокси.process(...) писать НЕЛЬЗЯ
Попытка
Прокси.process(
Логин,
Пароль,
ИдентификаторСвязи,
ИдентификаторДокумента,
Фильтр,
ПеременнаяРезультат,
ОстатокДокументов
);
// После успешного выполнения ПеременнаяРезультат будет содержать объект XDTO с данными документа
Если ПеременнаяРезультат <> Неопределено Тогда
// Обработка полученного документа
Сообщить("Документ успешно получен. Осталось в очереди: " + ОстатокДокументов);
КонецЕсли;
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить("Ошибка при вызове Receive: " + Инфо.Описание);
КонецПопытки;
Проанализируем ситуацию с параметром Cnt (Count). Многие разработчики отмечают, что серверная часть "Сферы" не всегда корректно заполняет это поле. Иногда оно возвращается пустым, даже если в очереди есть еще документы.
Рекомендация: Не полагайтесь исключительно на значение Cnt для организации цикла получения документов. Правильнее всего организовать цикл Пока, который будет запрашивать документы до тех пор, пока параметр Res (ПеременнаяРезультат) не вернется со значением Неопределено или пока тело документа не окажется пустым.
Если работа через WS-ссылку и SOAP в 1С кажется вам слишком нестабильной или сложной из-за особенностей платформы, рассмотрим два других варианта, которые предлагает провайдер:
Новый COMОбъект и вызываете его методы. Это избавляет от проблем с типами данных XDTO и выходными параметрами в веб-сервисах 1С.HTTPСоединение. Авторизация передается в заголовках, а данные приходят в виде обычного JSON или XML. REST API лишен проблем с "процедурным" вызовом и гораздо легче отлаживается через инструменты типа Postman.Мы выяснили причину ошибки при работе со Сферой EDI: она кроется в специфике реализации метода Receive в WSDL. Для успешного решения задачи необходимо:
process именно как процедуру.Используя этот подход, вы сможете стабильно получать документы из системы электронного документооборота непосредственно в вашу конфигурацию 1С.