При интеграции двух информационных баз 1С с использованием технологии COM-соединения программисты часто сталкиваются с проблемой получения идентификатора объекта. Ситуация выглядит следующим образом: мы успешно подключились к базе-источнику, выполнили запрос или получили выборку объектов, но при попытке обратиться к свойству УникальныйИдентификатор ссылки мы получаем не строку и не привычный объект типа UUID, а очередную "обертку" в виде COMОбъект. Это происходит из-за того, что в 1С только примитивные типы (строка, число, дата, булево) передаются через COM "как есть", а сложные типы остаются в контексте той базы, где они были созданы.
В этой статье мы подробно разберем, как правильно извлечь строковое представление GUID из COM-объекта, рассмотрим наиболее эффективные методы и обсудим вопросы производительности при обработке больших массивов данных.
Давайте проанализируем ситуацию. Когда мы пишем код Выборка.Ссылка.УникальныйИдентификатор() внутри основной базы, обращаясь к базе через COM, вторая база честно возвращает объект типа УникальныйИдентификатор. Однако для первой базы этот тип является прикладным и специфичным. COM-коннектор не умеет автоматически преобразовывать объект UUID одной базы в аналогичный объект другой базы. В результате мы получаем ссылку на прокси-объект, с которым сложно работать напрямую.
Для решения этой задачи нам нужно заставить COM-сервер вернуть нам данные в виде примитивного типа (в данном случае — строки).
Наиболее простым, коротким и надежным способом является использование встроенного метода объекта COM-соединения — XMLString (или его русскоязычного аналога XMLСтрока). Этот метод преобразует ссылку в стандартный строковый формат GUID.
Рассмотрим пример реализации:
// Установим соединение
V83 = Новый COMObject("V83.COMConnector");
Соединение = V83.Connect(СтрокаПодключения);
// Допустим, мы получили ссылку на документ через выборку
Выборка = Соединение.Документы.РеализацияТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем УИД в виде строки напрямую через метод COM-соединения
СтрокаУИД = Соединение.XMLString(Выборка.Ссылка);
Сообщить("УИД документа: " + СтрокаУИД);
КонецЦикла;
Важный нюанс: метод XMLString хорош тем, что он работает на стороне COM-сервера и возвращает готовую строку, которую основная база воспринимает без лишних преобразований.
Если по каким-то причинам XMLString вам не подходит, можно воспользоваться методом String() (аналог функции Строка()), примененным к результату метода УникальныйИдентификатор(). Здесь важно помнить, что в COM-модели УникальныйИдентификатор — это именно метод, поэтому скобки обязательны.
Разберем на примере:
// Обращаемся к идентификатору и принудительно приводим его к строке на той стороне
СтрокаУИД = Соединение.String(Выборка.Ссылка.УникальныйИдентификатор());
Обратите внимание: если вы напишете просто Соединение.String(Выборка.Ссылка), то получите не GUID, а представление объекта (например, "Реализация товаров №15 от 10.10.2023"). Чтобы получить именно уникальный код, нужно обращаться к объекту идентификатора.
Иногда требуется не просто получить УИД, а выполнить сопутствующие действия. В этом случае можно создать вспомогательный общий модуль в той базе, к которой мы подключаемся. Это позволит избежать многократных обращений через COM-обертку и инкапсулировать логику внутри источника.
В базе-источнике создадим общий модуль РаботаСВнешнимиСистемами с признаком "Внешнее соединение" и напишем функцию:
Функция ПолучитьТекстовыйУИД(Ссылка) Экспорт
Возврат Строка(Ссылка.УникальныйИдентификатор());
КонецФункции
Тогда в основной базе вызов будет выглядеть так:
УИД = Соединение.РаботаСВнешнимиСистемами.ПолучитьТекстовыйУИД(Выборка.Ссылка);
Этот метод кажется более трудоемким, так как требует изменений в конфигурации источника, но он незаменим, если логика получения данных сложнее, чем просто чтение одного реквизита.
Давайте проанализируем критически важный аспект — скорость работы. Если ваша выборка содержит 10 000 документов, и для каждого вы вызываете Соединение.XMLString(Ссылка), система совершит 10 000 сетевых вызовов (RPC) между процессами или серверами. Это крайне медленно.
Чтобы оптимизировать процесс, мы рекомендуем использовать передачу данных "пакетами". Вместо того чтобы тянуть УИД для каждой строки отдельно, лучше сформировать таблицу значений на стороне COM-базы, заполнить её строковыми представлениями УИДов и передать целиком. Для интерактивной отладки и запуска произвольного кода во внешней базе можно использовать инструмент для выполнения запросов и алгоритмов через COM-подключение.
Посмотрим на пример оптимизированного кода:
// Выполняем запрос на стороне COM
Запрос = Соединение.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг";
ТЗ_Результат = Запрос.Выполнить().Выгрузить();
// Добавляем колонку для строкового УИДа на той стороне
ТЗ_Результат.Колонки.Добавить("СтрокаУИД", Соединение.NewObject("ОписаниеТипов", "Строка", Соединение.NewObject("КвалификаторыСтроки", 36)));
// Заполняем её внутри COM-базы одним циклом
Для Каждого Стр Из ТЗ_Результат Цикл
Стр.СтрокаУИД = Соединение.XMLString(Стр.Ссылка);
КонецЦикла;
// Теперь передаем таблицу или сериализуем её в XML для мгновенной загрузки
// Это значительно быстрее, чем 10 000 отдельных обращений
Часто после того, как мы получили строковый УИД и сохранили его, нам нужно выполнить обратное действие — найти объект в COM-базе по этой строке. Выясним, как это сделать правильно:
UUID на стороне COM-базы.ПолучитьСсылку().Пример кода:
СтрокаGUID = "550e8400-e29b-41d4-a716-446655440000";
// Создаем объект УИД на стороне COM-соединения
ComУИД = Соединение.NewObject("UUID", СтрокаGUID);
// Ищем ссылку в справочнике Номенклатура
СсылкаНаОбъект = Соединение.Справочники.Номенклатура.ПолучитьСсылку(ComУИД);
// Проверим, существует ли такой объект (не пустая ли ссылка)
Если Соединение.XMLString(СсылкаНаОбъект) <> "00000000-0000-0000-0000-000000000000" Тогда
// Объект найден, можно работать
КонецЕсли;
Мы рассмотрели несколько способов получения Уникального Идентификатора через COM-соединение. Подводя итог, можно дать следующие рекомендации:
Соединение.XMLString(Ссылка). Это стандарт платформы.XMLString вернет для них строку из нулей.Используя эти подходы, вы сможете построить надежный и быстрый обмен данными между информационными базами 1С. Для решения практических задач синхронизации без ручного написания кода обмена подойдёт готовое решение для переноса объектов между базами 1С.