Как получить уникальный идентификатор (GUID) через COM-соединение в 1С?

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

При настройке обмена данными между различными базами 1С через COM-соединение разработчики часто сталкиваются с необходимостью синхронизации объектов по их уникальным идентификаторам. Получение правильного строкового представления GUID из базы-источника (или базы-корреспондента) — важная задача. Рассмотрим подробнее, как правильно извлечь уникальный идентификатор, какие методы работают быстрее, и проанализируем частые ошибки. Если требуется настроить обмен без написания собственного кода, можно использовать готовое решение для переноса данных между конфигурациями через COM.

Базовые методы получения GUID: String() и XMLСтрока()

Разберем по шагам основные способы извлечения идентификатора. В платформе 1С метод УникальныйИдентификатор доступен у ссылочных типов. Когда мы обращаемся к удаленной базе по COM, нам необходимо не просто вызвать этот метод, но и корректно преобразовать результат в строку на стороне базы-корреспондента.

Первый вариант, который часто приходит на ум — использование метода String(). Посмотрим на пример кода:


ВнешнийДок = ВнешБаза.Документы.МойДокумент.НайтиПоНомеру(НомерДок, ДатаДок);
УИД_Строкой = ВнешБаза.String(ВнешнийДок.УникальныйИдентификатор());

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

Проанализируем более оптимальный подход — сериализацию через метод XMLСтрока() (или его англоязычный синоним XMLString()). Сериализация ссылки напрямую работает значительно быстрее. Разберем пример:


ВнешнийДок = ВнешБаза.Документы.МойДокумент.НайтиПоНомеру(НомерДок, ДатаДок);
УИД_Строкой = ВнешБаза.XMLСтрока(ВнешнийДок);

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

УИД_Строкой = ВнешБаза.XMLString(ВнешнийДок);

Частая ошибка: вызов ПолучитьОбъект() перед получением GUID

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

Важно: метод УникальныйИдентификатор есть только у типа ДокументСсылка (или СправочникСсылка) и отсутствует у типа ДокументОбъект.

Посмотрим на ошибочный пример:


// ОШИБКА: Получаем объект документа
ВнешнийДок = ВнешБаза.Документы.МойДокумент.НайтиПоНомеру(Номер).ПолучитьОбъект();
// Этот код не сработает!
УИ = ВнешБаза.String(ВнешнийДок.УникальныйИдентификатор()); 

Всегда работайте с ссылками при получении GUID.

Обратное действие: поиск или создание объекта по GUID через COM

Рассмотрим обратную задачу. Если у вас уже есть строковое представление GUID, и вам нужно найти или создать объект в подключенной по COM базе, необходимо сформировать тип УникальныйИдентификатор именно в контексте внешней базы.

Для этого мы воспользуемся методом NewObject() внешнего соединения. Разберем по шагам:

  1. Создаем уникальный идентификатор во внешней базе.
  2. Получаем ссылку по этому идентификатору.

СтрокаGUID = "123e4567-e89b-12d3-a456-426655440000";
// 1. Формируем УИД во внешней базе
УИД_Внешний = ВнешБаза.NewObject("УникальныйИдентификатор", СтрокаGUID);

// 2. Получаем ссылку нужного типа
СсылкаВнешнейБазы = ВнешБаза.Документы.МойДокумент.ПолучитьСсылку(УИД_Внешний);

Если мы синхронизируем данные и хотим создать новый объект с конкретным (таким же, как в источнике) GUID, мы используем метод УстановитьСсылкуНового перед записью объекта в базу-приемник:


НовыйДокВнешний = ВнешБаза.Документы.МойДокумент.СоздатьДокумент();
НовыйДокВнешний.УстановитьСсылкуНового(СсылкаВнешнейБазы);
// ... заполнение реквизитов ...
НовыйДокВнешний.Записать();

Работа с "битыми" ссылками и новые возможности платформы

Выясним причину опасений некоторых разработчиков относительно использования XMLСтрока() для удаленных объектов. Существует мнение, что если объект физически удален из базы данных (осталась "битая" ссылка, или "Объект не найден" в таблице изменений), XMLСтрока() вызовет ошибку. Это не так. Идентификатор хранится в самом значении ссылки, и платформе не нужно обращаться к таблицам базы данных. Метод отработает корректно.


// Пример корректной обработки даже для удаленной ссылки
Ссылка = ВнешБаза.Справочники.Номенклатура.ПолучитьСсылку(ВнешБаза.NewObject("УникальныйИдентификатор"));
УИД_Строкой = ВнешБаза.XMLСтрока(Ссылка);

В завершение рассмотрим новые возможности. Начиная с версии платформы 1С:Предприятие 8.3.22, был добавлен встроенный функционал для языка запросов. Теперь функцию УникальныйИдентификатор(Ссылка) можно вызывать прямо внутри текста запроса. Это значит, что при выполнении запросов к COM-базе больше не нужно перебирать выборку в цикле и преобразовывать каждую ссылку отдельно — GUID можно получить сразу в колонках результата на стороне COM-сервера, что колоссально экономит ресурсы. Для интерактивного составления и выполнения запросов к удаленной базе подойдёт обработка для подключения к сторонней базе через COM и выполнения запросов.

← На главную