При организации обмена данными между несколькими базами 1С через COM-соединение (ComConnection) часто возникает необходимость выполнить запрос в удаленной базе с отбором по конкретному элементу справочника или списку элементов. В этой статье разберем, как правильно получить ссылку на объект в подключаемой базе и успешно передать её в параметр объекта Запрос.
Разберем типичную ситуацию: разработчик получает ссылку на элемент справочника из удаленной базы, передает её в параметр запроса через метод УстановитьПараметр, однако запрос возвращает пустой результат. Причин у такого поведения может быть несколько:
УникальныйИдентификатор или без получения по нему ссылки, запрос не найдет совпадений.Рассмотрим стандартный и наиболее надежный вариант получения ссылки по уникальному идентификатору (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);
Проанализируем случай, когда в условие запроса В (&Ссылка) нужно передать коллекцию элементов. Главное правило — сама коллекция (массив или список значений) должна создаваться в удаленной базе через объект COM-соединения.
Рассмотрим пример с использованием списка значений:
// Создаем СписокЗначений в контексте удаленной базы
СписокСсылок = СоединениеBase1C.NewObject("СписокЗначений");
СписокСсылок.Добавить(СсылкаТам);
Запрос = СоединениеBase1C.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В (&Ссылка)";
Запрос.УстановитьПараметр("Ссылка", СписокСсылок);
Рез = Запрос.Выполнить();
Аналогично можно использовать массив, созданный через СоединениеBase1C.NewObject("Массив") или СоединениеBase1C.NewObject("Array").
Массив, СписокЗначений, ТаблицаЗначений) и типы данных (УникальныйИдентификатор), передаваемые в параметры запроса, должны создаваться конструктором СоединениеBase1C.NewObject(...).getRef() вместо ПолучитьСсылку(), setParameter() вместо УстановитьПараметр()).