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

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

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

В этой статье мы проанализируем различные подходы к решению этой задачи, выберем наиболее производительные из них и разберем примеры кода.

Задача 1: Получение строки GUID из ссылки

Допустим, у нас есть ссылка на элемент справочника или документ, и нам необходимо получить его уникальный идентификатор в виде строки (например, "6f9619ff-8b86-d011-b42d-00cf4fc964ff"). Существует несколько способов сделать это. Разберем их.

Способ 1: Использование метода XMLСтрока (Рекомендуемый)

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


// Пример получения GUID из ссылки номенклатуры
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("00001");
Если НЕ СсылкаНаТовар.Пустая() Тогда
    СтрокаGUID = XMLСтрока(СсылкаНаТовар);
    Сообщить("GUID товара: " + СтрокаGUID);
КонецЕсли;

Этот метод возвращает строку, готовую для передачи в другие системы (например, в XML-файлы или JSON).

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

Второй вариант — сначала получить объект УникальныйИдентификатор из ссылки, а затем преобразовать его в строку. Это чуть более "длинный" путь для системы, но он также дает верный результат.


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

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

Задача 2: Получение ссылки по строке GUID

Теперь рассмотрим обратную ситуацию. У нас есть строка с уникальным идентификатором, и нам нужно получить ссылку на объект в базе данных. Здесь важно понимать разницу между "созданием ссылки" и "поиском объекта".

Для начала нам необходимо преобразовать строку в специальный объект платформы УникальныйИдентификатор.


СтрокаGUID = "6f9619ff-8b86-d011-b42d-00cf4fc964ff";
НовыйУИД = Новый УникальныйИдентификатор(СтрокаGUID);

Далее у нас есть два пути, в зависимости от того, что мы хотим сделать.

Вариант А: Получение ссылки (без проверки существования)

Если нам нужно просто получить ссылку для записи в реквизит или использования в запросе, и мы не хотим делать лишних обращений к базе данных для проверки, существует ли этот объект реально, используем метод менеджера ПолучитьСсылку.


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

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

Вариант Б: Поиск существующего объекта

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

Проверить существование можно так:


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

Важные нюансы

При работе с GUID следует учитывать несколько моментов, которые мы сейчас разберем:

  1. Формат строки: Конструктор Новый УникальныйИдентификатор() очень чувствителен к формату. Если строка будет содержать лишние пробелы или недопустимые символы, возникнет ошибка выполнения. Всегда оборачивайте этот код в блок Попытка ... Исключение, если вы не уверены в источнике данных.
  2. Тип объекта: Метод ПолучитьСсылку привязан к конкретному менеджеру (например, Справочники.Номенклатура). Если вы попытаетесь найти документ по GUID справочника, вы получите ссылку, но она будет указывать "в никуда" в рамках таблицы документов.
  3. Битая ссылка: Ссылка, полученная через ПолучитьСсылку по GUID несуществующего объекта, будет вести себя как "Объект не найден" (визуально в интерфейсе <Объект не найден>...).

Посмотрим на итоговый пример универсальной функции, которая пытается найти ссылку по GUID в указанном справочнике:


Функция НайтиСсылкуПоСтрокеGUID(ИмяСправочника, СтрGUID) Экспорт
    
    Результат = Справочники[ИмяСправочника].ПустаяСсылка();
    
    Попытка
        УИД = Новый УникальныйИдентификатор(СтрGUID);
        Ссылка = Справочники[ИмяСправочника].ПолучитьСсылку(УИД);
        
        // Проверка на фактическое существование через получение версии данных или ссылки
        // Самый простой способ проверить - это запрос, но для одиночного объекта:
        Если Ссылка.ПолучитьОбъект() <> Неопределено Тогда
            Результат = Ссылка;
        КонецЕсли;
        
    Исключение
        // Ошибка формата GUID
    КонецПопытки;
    
    Возврат Результат;
    
КонецФункции

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

← На главную