При разработке обменов данными, интеграции со сторонними системами или при глубокой отладке часто возникает задача работы с уникальными идентификаторами объектов (UUID или GUID). Рассмотрим подробно, как в 1С:Предприятие 8.3 получить строковое представление идентификатора из ссылки и, что еще важнее, как по имеющейся строке GUID найти соответствующую ссылку в базе данных.
В этой статье мы проанализируем различные подходы к решению этой задачи, выберем наиболее производительные из них и разберем примеры кода.
Допустим, у нас есть ссылка на элемент справочника или документ, и нам необходимо получить его уникальный идентификатор в виде строки (например, "6f9619ff-8b86-d011-b42d-00cf4fc964ff"). Существует несколько способов сделать это. Разберем их.
Способ 1: Использование метода XMLСтрока (Рекомендуемый)
Самый быстрый и оптимизированный способ получения строкового представления ссылки — это использование глобальной функции XMLСтрока. Этот метод работает непосредственно с платформенным представлением и требует минимум ресурсов.
// Пример получения GUID из ссылки номенклатуры
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("00001");
Если НЕ СсылкаНаТовар.Пустая() Тогда
СтрокаGUID = XMLСтрока(СсылкаНаТовар);
Сообщить("GUID товара: " + СтрокаGUID);
КонецЕсли;
Этот метод возвращает строку, готовую для передачи в другие системы (например, в XML-файлы или JSON).
Способ 2: Через объект УникальныйИдентификатор
Второй вариант — сначала получить объект УникальныйИдентификатор из ссылки, а затем преобразовать его в строку. Это чуть более "длинный" путь для системы, но он также дает верный результат.
// Менее оптимальный, но рабочий способ
УИДОбъекта = СсылкаНаТовар.УникальныйИдентификатор();
СтрокаGUID = Строка(УИДОбъекта);
Мы рекомендуем использовать первый способ (XMLСтрока), так как он выполняется быстрее, что может быть заметно при обработке больших массивов данных в циклах.
Теперь рассмотрим обратную ситуацию. У нас есть строка с уникальным идентификатором, и нам нужно получить ссылку на объект в базе данных. Здесь важно понимать разницу между "созданием ссылки" и "поиском объекта".
Для начала нам необходимо преобразовать строку в специальный объект платформы УникальныйИдентификатор.
СтрокаGUID = "6f9619ff-8b86-d011-b42d-00cf4fc964ff";
НовыйУИД = Новый УникальныйИдентификатор(СтрокаGUID);
Далее у нас есть два пути, в зависимости от того, что мы хотим сделать.
Вариант А: Получение ссылки (без проверки существования)
Если нам нужно просто получить ссылку для записи в реквизит или использования в запросе, и мы не хотим делать лишних обращений к базе данных для проверки, существует ли этот объект реально, используем метод менеджера ПолучитьСсылку.
// Получаем ссылку, даже если объекта физически нет в базе (будет "битая" ссылка)
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(НовыйУИД);
Этот метод работает мгновенно, так как он просто конструирует ссылку в памяти.
Вариант Б: Поиск существующего объекта
Если нам критически важно убедиться, что объект с таким GUID действительно существует в базе данных, нам придется либо попытаться получить объект, либо выполнить запрос. Однако, часто программисты используют комбинацию получения ссылки и проверки на пустоту (хотя ПолучитьСсылку вернет не пустую ссылку, а ссылку с этим GUID).
Проверить существование можно так:
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(НовыйУИД);
Попытка
// Пытаемся прочитать объект
Объект = СсылкаНаТовар.ПолучитьОбъект();
Если Объект = Неопределено Тогда
Сообщить("Объект с таким GUID не найден в базе.");
Иначе
Сообщить("Объект найден: " + Объект.Наименование);
КонецЕсли;
Исключение
Сообщить("Ошибка при чтении объекта.");
КонецПопытки;
При работе с GUID следует учитывать несколько моментов, которые мы сейчас разберем:
Новый УникальныйИдентификатор() очень чувствителен к формату. Если строка будет содержать лишние пробелы или недопустимые символы, возникнет ошибка выполнения. Всегда оборачивайте этот код в блок Попытка ... Исключение, если вы не уверены в источнике данных.ПолучитьСсылку привязан к конкретному менеджеру (например, Справочники.Номенклатура). Если вы попытаетесь найти документ по GUID справочника, вы получите ссылку, но она будет указывать "в никуда" в рамках таблицы документов.ПолучитьСсылку по GUID несуществующего объекта, будет вести себя как "Объект не найден" (визуально в интерфейсе <Объект не найден>...).Посмотрим на итоговый пример универсальной функции, которая пытается найти ссылку по GUID в указанном справочнике:
Функция НайтиСсылкуПоСтрокеGUID(ИмяСправочника, СтрGUID) Экспорт
Результат = Справочники[ИмяСправочника].ПустаяСсылка();
Попытка
УИД = Новый УникальныйИдентификатор(СтрGUID);
Ссылка = Справочники[ИмяСправочника].ПолучитьСсылку(УИД);
// Проверка на фактическое существование через получение версии данных или ссылки
// Самый простой способ проверить - это запрос, но для одиночного объекта:
Если Ссылка.ПолучитьОбъект() <> Неопределено Тогда
Результат = Ссылка;
КонецЕсли;
Исключение
// Ошибка формата GUID
КонецПопытки;
Возврат Результат;
КонецФункции
Используя эти методы, вы сможете надежно связывать данные между различными базами 1С или внешними приложениями, опираясь на неизменяемые уникальные идентификаторы.