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

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

При работе с внешними базами данных через COM-соединение разработчики часто сталкиваются с тем, что специфические типы данных, такие как УникальныйИдентификатор, не передаются напрямую. Вместо привычного значения мы получаем COMОбъект, с которым невозможно работать стандартными методами платформы. Давайте разберем, как правильно извлечь GUID объекта из другой информационной базы.

Почему возникает проблема?

При использовании COM-соединения объектная модель целевой базы инкапсулирована. Когда мы запрашиваем поле типа Уникальный идентификатор, платформа передает его не как примитивный тип, а как ссылку на COM-объект, представляющий собой интерфейс к этому идентификатору. Для того чтобы превратить его в понятную для нашей текущей базы строку (и далее в объект УникальныйИдентификатор), необходимо выполнить сериализацию.

Решение через метод XMLСтрока

Самым быстрым и надежным способом получения GUID через COM-соединение является использование метода XMLСтрока(). Этот метод позволяет получить стандартизированное строковое представление идентификатора, которое платформа 1С распознает мгновенно.

Рассмотрим, как это реализовать на практике. Допустим, у нас уже установлено Соединение с внешней базой, и мы получили выборку данных:


// Предположим, Выборка - это результат запроса, полученный через COM-соединение
// Получаем строковое представление GUID
СтрокаУИД = Соединение.XMLСтрока(Выборка.Ссылка);

// Теперь создаем объект типа УникальныйИдентификатор в нашей текущей базе
УИД = Новый УникальныйИдентификатор(СтрокаУИД);

Использование XMLСтрока(Выборка.Ссылка) предпочтительнее простого вызова Строка(), так как он работает значительно быстрее и гарантирует корректность формата идентификатора для дальнейшей десериализации.

Решение через метод ПолучитьУникальныйИдентификатор

Если в процессе работы вы обращаетесь непосредственно к объекту, а не к результату запроса, можно использовать метод ПолучитьУникальныйИдентификатор(). Рассмотрим этот подход:


// Получаем ссылку на объект через COM-соединение
ОбъектCOM = Соединение.Справочники.Договоры.НайтиПоКоду("000000001");

// Извлекаем идентификатор и преобразуем его в строку на стороне COM
СтрокаGUID = Соединение.Строка(ОбъектCOM.ПолучитьУникальныйИдентификатор());

// Формируем объект УникальныйИдентификатор в нашей базе
УИД = Новый УникальныйИдентификатор(СтрокаGUID);

Этот способ удобен, если вы работаете с конкретными объектами, а не с массивами данных в запросе.

Как использовать полученный УИД для поиска?

После того как мы успешно получили GUID в виде строки, часто возникает задача найти соответствующий объект в нашей (текущей) базе. Для этого мы используем менеджер справочника и метод ПолучитьСсылку():


// Имея СтрокаGUID, полученный из COM-соединения:
УИД = Новый УникальныйИдентификатор(СтрокаGUID);

// Получаем ссылку в нашей базе
СсылкаНаОбъект = Справочники.Договоры.ПолучитьСсылку(УИД);

// Проверяем, существует ли объект на самом деле
Если НЕ СсылкаНаОбъект.Пустая() И СсылкаНаОбъект.ПолучитьОбъект() <> Неопределено Тогда
    Сообщить("Объект найден: " + СсылкаНаОбъект);
Иначе
    Сообщить("Объект не найден или помечен на удаление");
КонецЕсли;

Важные замечания по работе с запросами

Если вы используете версию платформы 8.3.22 и выше, получение GUID стало еще проще. В тексте запроса, который вы отправляете через COM-соединение, теперь можно использовать функцию УНИКАЛЬНЫЙИДЕНТИФИКАТОР():

Пример запроса:


Запрос.Текст = 
    "ВЫБРАТЬ
    |    Договоры.Наименование,
    |    УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Договоры.Ссылка) КАК УИД
    |ИЗ
    |    Справочник.Договоры КАК Договоры";

Этот подход позволяет избежать постобработки результатов на стороне COM-объекта, что значительно ускоряет работу обмена данными.

Заключение: чек-лист действий

  1. Всегда старайтесь получать строковое представление идентификатора непосредственно на стороне COM-соединения, используя XMLСтрока().
  2. Если работаете с объектами напрямую — используйте ПолучитьУникальныйИдентификатор().
  3. Для поиска объекта по полученному GUID используйте конструктор Новый УникальныйИдентификатор(Строка) и метод менеджера ПолучитьСсылку().
  4. Если платформа позволяет, используйте встроенную функцию УНИКАЛЬНЫЙИДЕНТИФИКАТОР() прямо в тексте запроса для оптимизации кода.

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

← На главную