Как передать ссылку в параметр запроса при работе с другой базой 1С через COM-соединение?

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

При организации обмена данными между несколькими базами 1С через COM-соединение (ComConnection) часто возникает необходимость выполнить запрос в удаленной базе с отбором по конкретному элементу справочника или списку элементов. В этой статье разберем, как правильно получить ссылку на объект в подключаемой базе и успешно передать её в параметр объекта Запрос.

Причина проблемы при передаче параметров через COM

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

  1. Передача объектов локального контекста: попытались передать в удаленный запрос массив или список значений, созданный в текущей базе, а не в контексте подключаемой. All параметры сложных типов должны инстанцироваться в удаленной базе.
  2. Ошибки при формировании массива или списка: если передается массив, содержащий одинаковые дублирующиеся ссылки, результатом выполнения запроса будет всего одна строка, что может показаться некорректной работой отбора.
  3. Передача строки вместо объекта уникального идентификатора: если передать строковый GUID напрямую в отбор по ссылке без конвертации в объект УникальныйИдентификатор или без получения по нему ссылки, запрос не найдет совпадений.

Способ 1. Получение ссылки по GUID и передача одиночной ссылки в запрос

Рассмотрим стандартный и наиболее надежный вариант получения ссылки по уникальному идентификатору (GUID) с последующим передачей в параметр запроса.

Сначала создадим объект УникальныйИдентификатор в контексте удаленной базы с помощью метода NewObject, после чего получим ссылку через менеджер справочника:


// Инициализируем COM-соединение (пример для внешней базы)
// Переменная СоединениеBase1C хранит объект COM-подключения

СтрокаGUID = "0b6d9e8f-f2e1-11e1-be19-0050568699bc";

// Создаем УИД и получаем ссылку в удаленной базе
ГУИДВнешний = СоединениеBase1C.NewObject("УникальныйИдентификатор", СтрокаGUID);
СсылкаТам = СоединениеBase1C.Справочники.Номенклатура.ПолучитьСсылку(ГУИДВнешний);

// Создаем объект запроса в удаленной базе
Запрос = СоединениеBase1C.NewObject("Запрос");
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Ссылка,
    |	Номенклатура.Наименование КАК Наименование
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", СсылкаТам);
Результат = Запрос.Выполнить();

Также получить ссылку можно с использованием встроенных механизмов XML-сериализации удаленной базы:


ТипМД = СоединениеBase1C.XMLTypeOf(СоединениеBase1C.Справочники.Номенклатура.ПустаяСсылка());
СсылкаТам = СоединениеBase1C.XMLValue(СоединениеBase1C.FromXMLType(ТипМД), СтрокаGUID);

Способ 2. Передача списка или массива ссылок в параметр запроса

Проанализируем случай, когда в условие запроса В (&Ссылка) нужно передать коллекцию элементов. Главное правило — сама коллекция (массив или список значений) должна создаваться в удаленной базе через объект COM-соединения.

Рассмотрим пример с использованием списка значений:


// Создаем СписокЗначений в контексте удаленной базы
СписокСсылок = СоединениеBase1C.NewObject("СписокЗначений");
СписокСсылок.Добавить(СсылкаТам);

Запрос = СоединениеBase1C.NewObject("Запрос");
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Ссылка,
    |	Номенклатура.Код КАК Код
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.Ссылка В (&Ссылка)";

Запрос.УстановитьПараметр("Ссылка", СписокСсылок);
Рез = Запрос.Выполнить();

Аналогично можно использовать массив, созданный через СоединениеBase1C.NewObject("Массив") или СоединениеBase1C.NewObject("Array").

Рекомендации и правила работы с COM-запросами

  1. Проверяйте заполнение коллекций: если запрос по массиву ссылок возвращает меньше данных, чем ожидалось, убедитесь с помощью отладчика, что массив на стороне источника не заполнился дублирующимися элементами.
  2. Создавайте объекты в целевом контексте: любые коллекции (Массив, СписокЗначений, ТаблицаЗначений) и типы данных (УникальныйИдентификатор), передаваемые в параметры запроса, должны создаваться конструктором СоединениеBase1C.NewObject(...).
  3. Использование англоязычных методов: при вызове методов COM-объекта можно использовать как кириллические, так и англоязычные аналоги (например, getRef() вместо ПолучитьСсылку(), setParameter() вместо УстановитьПараметр()).
  4. Вынос сложной логики в удаленную базу: если запрос содержит много условий и объемных выборок, эффективнее создать экспортную функцию в модуле внешнего соединения удаленной базы, передавать туда примитивные данные (строки GUID) и получать готовую структуру или массив результатов. Это существенно снижает накладные расходы на маршалинг данных между процессами.
← На главную