Работа с COM-соединением между двумя базами 1С часто сопровождается нюансами передачи данных. Одной из частых проблем, с которой сталкиваются разработчики, является ошибка Неверные параметры при попытке использовать массив объектов (например, ссылок на Справочник.Номенклатура) в условии запроса ГДЕ ... В (&Список).
Давайте разберем, почему возникает такая ситуация и как правильно организовать передачу данных, чтобы запрос выполнялся корректно.
Ошибка чаще всего вызвана тем, что массив, передаваемый в качестве параметра, создается в «локальном» контексте текущей базы, в то время как COM-соединение ожидает объект, созданный в контексте удаленной (целевой) базы. Если вы используете конструктор Новый Массив, создается локальный объект 1С, который серверная часть COM не может корректно интерпретировать при выполнении запроса.
Кроме того, распространенной ошибкой является попытка пересоздания соединения внутри цикла или функции. Это нарушает целостность сессии и приводит к тому, что ссылки на объекты становятся недействительными для контекста запроса.
Чтобы запрос в удаленной базе «понимал» переданный массив, его необходимо инициализировать непосредственно через объект Соединение, используя метод NewObject. Рассмотрим правильный алгоритм формирования списка:
Функция ПолучитьСписокНоменклатурCOM(Соединение)
// Создаем массив именно в контексте удаленной базы
МассивCOM = Соединение.NewObject("Массив");
// Получаем данные из текущей базы или выполняем поиск
Для Каждого Строка Из ПолучитьСписокНоменклатур() Цикл
// Находим объект в COM-базе
номПоиск = Соединение.Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Строка.Артикул);
// Проверяем, что ссылка не пустая и добавляем в COM-массив
Если НЕ номПоиск.Пустая() Тогда
МассивCOM.Добавить(номПоиск);
КонецЕсли;
КонецЦикла;
Возврат МассивCOM;
КонецФункции
Важно помнить: не нужно создавать соединение внутри функции. Передавайте уже существующее соединение в качестве параметра функции. Это позволит избежать накладных расходов на открытие новых сеансов и исключит ошибки типизации объектов.
После того как мы подготовили МассивCOM, установка параметра в запрос производится стандартными средствами:
ЗапросCOM = Соединение.NewObject("Запрос");
ЗапросCOM.Текст =
"ВЫБРАТЬ
| Т.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Т
|ГДЕ
| Т.Ссылка В(&СписокНоменклатур)";
ЗапросCOM.УстановитьПараметр("СписокНоменклатур", МассивCOM);
Результат = ЗапросCOM.Выполнить().Выгрузить();
Если работа с массивом ссылок кажется избыточной или приводит к сложностям, рассмотрим другие варианты передачи параметров:
ГДЕ Т.Артикул В (&СписокАртикулов). Это работает быстрее и не требует предварительного поиска ссылок в целевой базе.HTTP-сервисы. Это современный стандарт обмена данными между базами 1С, который не зависит от ограничений COM (таких как разрядность платформы или версия COM-сервера).Для успешной работы с COM-запросами всегда соблюдайте следующие правила:
Соединение.NewObject().Следуя этим рекомендациям, вы сможете избежать ошибок типа Неверные параметры и обеспечите стабильный обмен данными между базами 1С.