Как программно получить уникальный идентификатор (GUID) элемента справочника или документа в 1С 8.3?

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

При работе с системой 1С:Предприятие 8.3, особенно в задачах интеграции с внешними системами или при разработке сложной логики, нам часто требуется однозначно идентифицировать объекты базы данных, такие как элементы справочников или документы. Для этой цели в платформе 1С предусмотрен уникальный идентификатор, или GUID (Globally Unique Identifier).

В этой статье мы подробно рассмотрим, как получить этот идентификатор программным способом, разберем различные сценарии и предоставим примеры кода для работы с GUID, которые помогут вам эффективно решать задачи разработки.

Понимание уникальных идентификаторов в 1С

Каждый ссылочный объект в 1С (справочник, документ, план видов характеристик и т.д.) имеет свой уникальный идентификатор. Этот идентификатор генерируется платформой автоматически при создании объекта и остается неизменным на протяжении всего жизненного цикла объекта в базе данных. Он является гарантией уникальности объекта не только в рамках одной базы, но и при обмене данными между разными базами 1С или другими системами — для этого подойдёт готовая система обмена данными между базами 1С.

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


Объектом
или со

Ссылкой
.

Получение GUID для существующих объектов

Самый распространенный сценарий — это получение GUID для объекта, который уже существует в базе данных. В этом случае мы работаем с


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

Для получения уникального идентификатора существующего элемента справочника или документа, нам необходимо обратиться к свойству


УникальныйИдентификатор()
у

Ссылке
объекта. Рассмотрим этот процесс по шагам.

Шаг 1: Получение ссылки на объект

Прежде чем получить GUID, нам нужно получить саму ссылку на объект. Это можно сделать различными способами, например, используя поиск по коду, наименованию или номеру. При работе со сложными структурами часто требуется не только GUID, но и получение значения реквизита по ссылке на любом уровне вложенности.


// Пример получения ссылки на элемент справочника "Номенклатура" по коду
СсылкаНаНоменклатуру = Справочники.Номенклатура.НайтиПоКоду("000000001");

// Пример получения ссылки на документ "РеализацияТоваровУслуг" по номеру и дате
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("00000001", Дата("20230101"));

// Если у нас уже есть объект, мы можем получить его ссылку так:
ОбъектСправочника = Справочники.Мой Справочник.СоздатьЭлемент();
// ... заполняем свойства объекта ...
// После записи объекта, его ссылка будет доступна
// ОбъектСправочника.Записать();
// СсылкаОбъекта = ОбъектСправочника.Ссылка;

Мы видим, что сначала мы должны получить объект типа


Ссылка
. Если

СсылкаНаНоменклатуру
или

СсылкаНаДокумент
окажутся

Неопределено
, значит, объект с заданными параметрами не найден, и дальнейшие действия по получению GUID будут бессмысленны.

Шаг 2: Получение уникального идентификатора из ссылки

После того как у нас есть


Ссылка
на объект, мы можем вызвать у нее метод

УникальныйИдентификатор()
. Этот метод вернет нам объект типа

УникальныйИдентификатор
.


Если СсылкаНаНоменклатуру <> Неопределено Тогда
    GUIDНоменклатуры = СсылкаНаНоменклатуру.УникальныйИдентификатор();
    Сообщить("GUID номенклатуры: " + GUIDНоменклатуры);
Иначе
    Сообщить("Номенклатура не найдена.");
КонецЕсли;

Если СсылкаНаДокумент <> Неопределено Тогда
    GUIDДокумента = СсылкаНаДокумент.УникальныйИдентификатор();
    Сообщить("GUID документа: " + GUIDДокумента);
Иначе
    Сообщить("Документ не найден.");
КонецЕсли;

Результатом выполнения


УникальныйИдентификатор()
будет значение типа

УникальныйИдентификатор
. Этот тип данных удобен для работы внутри 1С, например, для сравнения идентификаторов или использования в запросах. Однако, для обмена с внешними системами или для логирования, нам часто требуется строковое представление GUID.

Преобразование GUID в строку

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


Строка()
.


Если СсылкаНаНоменклатуру <> Неопределено Тогда
    GUIDНоменклатуры = СсылкаНаНоменклатуру.УникальныйИдентификатор();
    GUIDНоменклатурыСтрокой = Строка(GUIDНоменклатуры);
    Сообщить("GUID номенклатуры как строка: " + GUIDНоменклатурыСтрокой);
КонецЕсли;

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

Особенности работы с GUID для новых, еще не записанных объектов

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

Рассмотрим следующий пример:


НовыйЭлементСправочника = Справочники.МойСправочник.СоздатьЭлемент();
НовыйЭлементСправочника.Наименование = "Тестовый Элемент";
НовыйЭлементСправочника.Код = "000000002";

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

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

Мы выяснили, что до записи объекта в базу данных его


Ссылка
еще не сформирована, и попытка обратиться к

НовыйЭлементСправочника.Ссылка
приведет к ошибке или вернет

Неопределено
. Только после успешной записи объекта в базу данных платформа присваивает ему уникальный идентификатор, который становится доступен через свойство

Ссылка
.

Генерация нового уникального идентификатора

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

Для этого в 1С используется конструктор


Новый УникальныйИдентификатор()
.


НовыйGUID = Новый УникальныйИдентификатор();
Сообщить("Сгенерирован новый GUID: " + Строка(НовыйGUID));

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

Использование GUID в запросах

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


// Предположим, у нас есть строковый GUID, полученный извне
СтроковыйGUIDИзВне = "a1b2c3d4-e5f6-7890-1234-567890abcdef";

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

// Использование в запросе
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.УникальныйИдентификатор = &GUID";
Запрос.УстановитьПараметр("GUID", GUIDДляПоиска);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

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

Итоги и рекомендации

В ходе нашего анализа мы рассмотрели различные аспекты работы с уникальными идентификаторами (GUID) в 1С 8.3. Мы выяснили, что:

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

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

← На главную