При настройке обмена данными между различными базами 1С через COM-соединение разработчики часто сталкиваются с необходимостью синхронизации объектов по их уникальным идентификаторам. Получение правильного строкового представления GUID из базы-источника (или базы-корреспондента) — важная задача. Рассмотрим подробнее, как правильно извлечь уникальный идентификатор, какие методы работают быстрее, и проанализируем частые ошибки. Если требуется настроить обмен без написания собственного кода, можно использовать готовое решение для переноса данных между конфигурациями через COM.
Разберем по шагам основные способы извлечения идентификатора. В платформе 1С метод УникальныйИдентификатор доступен у ссылочных типов. Когда мы обращаемся к удаленной базе по COM, нам необходимо не просто вызвать этот метод, но и корректно преобразовать результат в строку на стороне базы-корреспондента.
Первый вариант, который часто приходит на ум — использование метода String(). Посмотрим на пример кода:
ВнешнийДок = ВнешБаза.Документы.МойДокумент.НайтиПоНомеру(НомерДок, ДатаДок);
УИД_Строкой = ВнешБаза.String(ВнешнийДок.УникальныйИдентификатор());
Этот код вполне рабочий, однако на практике он имеет существенный недостаток — низкую скорость выполнения при массовой обработке данных. Очевидно, значительное время тратится на выполнение самого метода УникальныйИдентификатор() через границу COM-соединения.
Проанализируем более оптимальный подход — сериализацию через метод XMLСтрока() (или его англоязычный синоним XMLString()). Сериализация ссылки напрямую работает значительно быстрее. Разберем пример:
ВнешнийДок = ВнешБаза.Документы.МойДокумент.НайтиПоНомеру(НомерДок, ДатаДок);
УИД_Строкой = ВнешБаза.XMLСтрока(ВнешнийДок);
Как показывает практика, время выполнения сокращается в несколько раз (например, с 133 секунд до 27 на больших объемах данных). Плюс сериализации в том, что она выполняется по установленным платформенным правилам, а не просто возвращает представление. В некоторых случаях (в зависимости от релиза платформы) для избежания проблем с кириллицей в COM-соединении мы настоятельно рекомендуем использовать англоязычный вариант функции:
УИД_Строкой = ВнешБаза.XMLString(ВнешнийДок);
Проанализируем ситуацию, когда программист пытается получить GUID, но сталкивается с ошибкой или пустым значением. Очень часто это происходит из-за попытки вызвать УникальныйИдентификатор() у объекта, а не у ссылки.
Важно: метод УникальныйИдентификатор есть только у типа ДокументСсылка (или СправочникСсылка) и отсутствует у типа ДокументОбъект.
Посмотрим на ошибочный пример:
// ОШИБКА: Получаем объект документа
ВнешнийДок = ВнешБаза.Документы.МойДокумент.НайтиПоНомеру(Номер).ПолучитьОбъект();
// Этот код не сработает!
УИ = ВнешБаза.String(ВнешнийДок.УникальныйИдентификатор());
Всегда работайте с ссылками при получении GUID.
Рассмотрим обратную задачу. Если у вас уже есть строковое представление GUID, и вам нужно найти или создать объект в подключенной по COM базе, необходимо сформировать тип УникальныйИдентификатор именно в контексте внешней базы.
Для этого мы воспользуемся методом NewObject() внешнего соединения. Разберем по шагам:
СтрокаGUID = "123e4567-e89b-12d3-a456-426655440000";
// 1. Формируем УИД во внешней базе
УИД_Внешний = ВнешБаза.NewObject("УникальныйИдентификатор", СтрокаGUID);
// 2. Получаем ссылку нужного типа
СсылкаВнешнейБазы = ВнешБаза.Документы.МойДокумент.ПолучитьСсылку(УИД_Внешний);
Если мы синхронизируем данные и хотим создать новый объект с конкретным (таким же, как в источнике) GUID, мы используем метод УстановитьСсылкуНового перед записью объекта в базу-приемник:
НовыйДокВнешний = ВнешБаза.Документы.МойДокумент.СоздатьДокумент();
НовыйДокВнешний.УстановитьСсылкуНового(СсылкаВнешнейБазы);
// ... заполнение реквизитов ...
НовыйДокВнешний.Записать();
Выясним причину опасений некоторых разработчиков относительно использования XMLСтрока() для удаленных объектов. Существует мнение, что если объект физически удален из базы данных (осталась "битая" ссылка, или "Объект не найден" в таблице изменений), XMLСтрока() вызовет ошибку. Это не так. Идентификатор хранится в самом значении ссылки, и платформе не нужно обращаться к таблицам базы данных. Метод отработает корректно.
// Пример корректной обработки даже для удаленной ссылки
Ссылка = ВнешБаза.Справочники.Номенклатура.ПолучитьСсылку(ВнешБаза.NewObject("УникальныйИдентификатор"));
УИД_Строкой = ВнешБаза.XMLСтрока(Ссылка);
В завершение рассмотрим новые возможности. Начиная с версии платформы 1С:Предприятие 8.3.22, был добавлен встроенный функционал для языка запросов. Теперь функцию УникальныйИдентификатор(Ссылка) можно вызывать прямо внутри текста запроса. Это значит, что при выполнении запросов к COM-базе больше не нужно перебирать выборку в цикле и преобразовывать каждую ссылку отдельно — GUID можно получить сразу в колонках результата на стороне COM-сервера, что колоссально экономит ресурсы. Для интерактивного составления и выполнения запросов к удаленной базе подойдёт обработка для подключения к сторонней базе через COM и выполнения запросов.