Как в 1С получить GUID (УИД) объекта по ссылке и найти объект по GUID?

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

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

Проанализируем две основные операции: получение идентификатора из ссылки и восстановление ссылки по идентификатору.

Решение 1: Получение УИД (GUID) из ссылки на объект

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

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

Посмотрим на практический пример. Предположим, у нас есть ссылка на документ "Реализация товаров и услуг", и нам нужно получить его УИД в строковом представлении.

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

// Предположим, у нас есть переменная СсылкаНаДокумент, 
// содержащая ссылку на нужный нам документ.
// Например:
// СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0000-000123", ТекущаяДата());

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

// 2. Преобразуем УИД в строку
СтрокаGUID = Строка(ИдентификаторОбъекта); 
// Теперь в переменной СтрокаGUID находится значение вида "d1e8d2e8-c2b3-11e9-8b2e-00155d0a1b0c"
Сообщить(СтрокаGUID);

Таким образом, для получения строкового представления GUID достаточно одной строки кода: СтрокаGUID = Строка(СсылкаНаОбъект.УникальныйИдентификатор());. Этот метод универсален и работает для всех объектов, имеющих ссылку. Если вам необходимо сформировать реестр идентификаторов или ускорить разработку, можно использовать список GUID объектов справочников и документов, который также позволяет сгенерировать готовый код 1С для поиска.

Решение 2: Получение ссылки на объект по его УИД (GUID)

Теперь решим обратную задачу: у нас есть строковое представление УИД, и нам нужно получить ссылку на соответствующий объект в базе данных.

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

Ключевая особенность: метод ПолучитьСсылку() не обращается к базе данных и не проверяет, существует ли объект с таким УИД. Он просто "конструирует" ссылку на основе переданного идентификатора. Чтобы убедиться, что объект реален, нужно дополнительно проверить это, например, попытавшись прочитать объект методом ПолучитьОбъект().

Разберем по шагам:

  1. Имеем строку с УИД.
  2. Создаем объект типа УникальныйИдентификатор из этой строки.
  3. Вызываем метод ПолучитьСсылку() у менеджера нужного нам типа объекта (например, Документы.РеализацияТоваровУслуг). Важно точно знать тип искомого объекта.
  4. (Рекомендуется) Проверяем существование объекта, чтобы избежать ошибок при дальнейшей работе со ссылкой.

Посмотрим, как это выглядит в коде:


// Исходные данные: строка с GUID и известный тип объекта.
СтрокаGUID = "d1e8d2e8-c2b3-11e9-8b2e-00155d0a1b0c";

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

// 2. Получаем ссылку с помощью менеджера документов
// Важно: мы должны точно знать, что это документ "РеализацияТоваровУслуг"
НайденнаяСсылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(ИдентификаторДляПоиска);

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

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

Практический пример: полный цикл преобразований

Чтобы закрепить понимание, давайте объединим обе операции в один логический блок. Мы возьмем существующий документ, получим его строковый УИД, а затем по этому УИД найдем исходный документ.


// --- ЭТАП 1: ПОЛУЧЕНИЕ GUID ИЗ ССЫЛКИ ---

// Найдем какой-нибудь документ для примера
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |   РеализацияТоваровУслуг.Ссылка
    |ИЗ
    |   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |   НЕ РеализацияТоваровУслуг.ПометкаУдаления";

РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
    Сообщить("В базе нет документов реализации для примера.");
    Возврат;
КонецЕсли;

Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ИсходнаяСсылка = Выборка.Ссылка;

Сообщить("Работаем с документом: " + ИсходнаяСсылка);

// Получаем его GUID в виде строки
СтрокаGUID = Строка(ИсходнаяСсылка.УникальныйИдентификатор());
Сообщить("Его строковый GUID: " + СтрокаGUID);


// --- ЭТАП 2: ПОЛУЧЕНИЕ ССЫЛКИ ИЗ GUID ---

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

// Получаем ссылку
ВосстановленнаяСсылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(ИдентификаторИзСтроки);
Сообщить("Восстановленная ссылка: " + ВосстановленнаяСсылка);

// Проверяем, что ссылки совпадают
Если ИсходнаяСсылка = ВосстановленнаяСсылка Тогда
    Сообщить("Успех! Ссылки идентичны.");
Иначе
    Сообщить("Ошибка! Что-то пошло не так.");
КонецЕсли;

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

← На главную