Как получить GUID из ссылки и найти объект по GUID в 1С?

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

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

Постановка задачи

Перед нами стоят две основные задачи, которые мы сегодня решим:

  1. Нам необходимо получить строковое представление уникального идентификатора (GUID) для конкретного объекта (ссылки) в базе данных.
  2. Имея на руках строку с GUID (например, загруженную из внешнего файла или пришедшую через API), нам нужно найти соответствующую ссылку на объект в нашей базе.

Давайте проанализируем доступные инструменты платформы 1С:Предприятие 8.3 для решения этих задач и выберем наиболее эффективные из них.

Получение строкового GUID из ссылки

Существует несколько способов получить уникальный идентификатор. Рассмотрим их подробнее, чтобы понять разницу. Если вам нужно получить данные сразу по множеству объектов, может пригодиться специальная обработка для получения списка GUID объектов справочников и документов.

Способ 1: Использование метода XMLСтрока

Это самый быстрый и рекомендуемый способ, если вам нужно просто получить строковое представление идентификатора. Функция XMLСтрока преобразует значение ссылки в строку формата UUID.

Посмотрим на пример кода:


// Предположим, у нас есть ссылка на номенклатуру
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("00001");

// Получаем строковый GUID
СтрокаGUID = XMLСтрока(СсылкаНаТовар);

// Результат будет в формате "6f9619ff-8b86-d011-b42d-00cf4fc964f0"

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

Способ 2: Через объект УникальныйИдентификатор

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

Разберем, как это выглядит на практике:


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

// Преобразуем объект в строку
СтрокаGUID = Строка(ОбъектGUID);

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

Получение ссылки по известному GUID

Теперь рассмотрим обратную ситуацию. Представьте, что вы загрузили данные из XML-файла и у вас есть строка вида "6f9619ff-8b86-d011-b42d-00cf4fc964f0". Вам нужно найти элемент справочника или документ с таким идентификатором. В случае, если идентификаторы хранятся в файле, удобнее использовать массовый поиск объектов 1С по УИН из табличного документа.

Важно понимать: В 1С поиск по GUID не требует выполнения запроса к базе данных для создания самой ссылки. Ссылка "генерируется" на лету. Однако, чтобы проверить, существует ли объект в базе реально, нам потребуется дополнительная проверка.

Пошагово реализуем поиск:

  1. Сначала нам нужно создать объект УникальныйИдентификатор из строки.
  2. Затем мы используем метод менеджера справочника (или документа) ПолучитьСсылку().

Проанализируем код:


// Исходная строка GUID
ВходящийGUIDСтрока = "6f9619ff-8b86-d011-b42d-00cf4fc964f0";

// 1. Создаем объект УникальныйИдентификатор
НовыйGUID = Новый УникальныйИдентификатор(ВходящийGUIDСтрока);

// 2. Получаем ссылку. Обратите внимание: метод выполняется мгновенно
ИскомаяСсылка = Справочники.Номенклатура.ПолучитьСсылку(НовыйGUID);

Проверка существования объекта

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

Чтобы убедиться, что объект реально существует в базе, давайте добавим проверку. Самый простой способ — попробовать получить код или наименование через точку (что вызовет чтение из БД) или использовать метод ПолучитьОбъект(), но это может быть "тяжело" для системы. Особенно критично наличие таких ссылок в регистрах, где может потребоваться быстрый поиск и восстановление битых ссылок в записях.

Рассмотрим оптимальный способ проверки через запрос, если объектов много, или использовать универсальный поиск ссылок для анализа взаимосвязей объекта:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ИскомаяСсылка);

Если Не Запрос.Выполнить().Пустой() Тогда
    // Объект точно существует в базе
Иначе
    // Это "битая" ссылка, объекта нет
КонецЕсли;

Создание нового объекта с заданным GUID

Иногда возникает задача не найти, а создать новый элемент с конкретным GUID (например, при миграции данных, чтобы сохранить идентификаторы из старой системы).

Давайте посмотрим, как это сделать. Мы снова используем метод ПолучитьСсылку, но затем вызываем метод УстановитьСсылкуНового.


// 1. Генерируем ссылку из нужного нам GUID
НужныйGUID = Новый УникальныйИдентификатор("6f9619ff-8b86-d011-b42d-00cf4fc964f0");
СсылкаСНужнымGUID = Справочники.Номенклатура.ПолучитьСсылку(НужныйGUID);

// 2. Создаем новый объект
НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();

// 3. Подменяем ссылку нового объекта на нашу
НовыйТовар.УстановитьСсылкуНового(СсылкаСНужнымGUID);

НовыйТовар.Наименование = "Товар с фиксированным GUID";
НовыйТовар.Записать();

Обратите внимание: метод УстановитьСсылкуНового сработает только для только что созданного, еще не записанного объекта. Если вы попытаетесь применить его к существующему объекту, возникнет ошибка.

Краткие выводы

Подведем итоги нашей работы с уникальными идентификаторами:

  1. Для получения строки из ссылки используйте функцию XMLСтрока(Ссылка) — это быстро и надежно.
  2. Для получения ссылки из строки сначала создайте Новый УникальныйИдентификатор(Строка), а затем используйте метод менеджера ПолучитьСсылку().
  3. Помните, что получение ссылки не гарантирует существование объекта. Обязательно проверяйте наличие данных в базе запросом или попыткой чтения, если в этом есть сомнения.

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

← На главную