К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как присвоить уникальный идентификатор элементу в 1С

Как получить и присвоить уникальный идентификатор (GUID) элементу справочника или документа в 1С: методы Ссылка.УникальныйИдентификатор() и УстановитьСсылкуНового, обмен данными, ошибки.

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

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

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

Что такое уникальный идентификатор в 1С и когда он нужен

GUID (глобально уникальный идентификатор) — это значение вида 8a3f5c2e-..., которое платформа 1С присваивает каждой ссылке при создании объекта. Внутри информационной базы ссылка хранится именно как этот идентификатор, а код и наименование — лишь представление для пользователя. Два элемента с одинаковым наименованием «ООО Ромашка» — это разные объекты с разными GUID.

Практические ситуации, где требуется работа с идентификатором:

  • обмен данными между базами (РИБ, универсальный обмен, конвертация данных) — элементы сопоставляются по GUID;
  • интеграция с сайтом, CRM или учётной системой, где GUID хранится как внешний ключ;
  • восстановление удалённого элемента с сохранением ссылок на него из документов;
  • загрузка данных из файла, где элемент уже имеет идентификатор, который нужно сохранить.

Как получить GUID существующего элемента

Для уже записанного элемента идентификатор возвращает метод УникальныйИдентификатор(), вызванный у ссылки. Пример встроенного кода:

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

Если Не ЭлементСсылка.Пустая() Тогда

ГУИД = ЭлементСсылка.УникальныйИдентификатор();

Сообщить(Строка(ГУИД));

КонецЕсли;

Результат — строка из 36 символов вида b2c4d8e6-1a2b-4c3d-9e8f-7a6b5c4d3e2f. Именно в таком виде идентификатор передаётся во внешние системы и сохраняется в файлах обмена.

Если нужен идентификатор в виде, пригодном для запроса по строке (например, при поиске элемента по GUID из внешней системы), используйте конструктор Новый УникальныйИдентификатор(СтрокаГУИД) и метод ПолучитьСсылку():

ГУИД = Новый УникальныйИдентификатор("b2c4d8e6-1a2b-4c3d-9e8f-7a6b5c4d3e2f");

Ссылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);

Обратите внимание: ПолучитьСсылку() вернёт ссылку даже если элемента с таким GUID в базе нет. Чтобы отличить реальный объект от «битой» ссылки, проверяйте Ссылка.ПолучитьОбъект() — для несуществующего элемента он вернёт Неопределено.

Как присвоить заданный GUID новому элементу

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

Порядок действий
  1. 1
    Сформируйте объект УникальныйИдентификатор из строки: Новый УникальныйИдентификатор(СтрокаГУИД)
  2. 2
    Получите ссылку нужного типа: Справочники.Номенклатура.ПолучитьСсылку(ГУИД)
  3. 3
    Убедитесь, что элемента с таким GUID ещё нет в базе (проверка через ПолучитьОбъект)
  4. 4
    Создайте новый объект: Справочники.Номенклатура.СоздатьЭлемент()
  5. 5
    Вызовите НовыйОбъект.УстановитьСсылкуНового(Ссылка)
  6. 6
    Заполните реквизиты и запишите объект методом Записать()
  7. 7
    Проверьте, что Ссылка.УникальныйИдентификатор() совпадает с исходным GUID

Полный пример кода:

СтрокаГУИД = "b2c4d8e6-1a2b-4c3d-9e8f-7a6b5c4d3e2f";

ГУИД = Новый УникальныйИдентификатор(СтрокаГУИД);

НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);

// Проверка, что элемент с таким GUID ещё не существует

Если НоваяСсылка.ПолучитьОбъект() = Неопределено Тогда

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

НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);

НовыйОбъект.Наименование = "Загруженный элемент";

НовыйОбъект.Записать();

КонецЕсли;

Ключевой момент: УстановитьСсылкуНового() вызывается строго до записи объекта. После записи изменить идентификатор штатными средствами нельзя — ссылка уже зафиксирована во всех таблицах базы, где на неё ссылаются другие объекты.

Альтернативные способы и их ограничения

Не всегда требуется именно фиксация GUID. В зависимости от задачи подходят разные варианты.

Сравнение вариантов

Автоматическая генерация GUID

Подходит для обычной работы и новых элементов; идентификатор создаётся платформой, никаких действий не требуется. Ограничение: GUID нельзя предугадать и сопоставить с внешней системой заранее.

УстановитьСсылкуНового с заданным GUID

Подходит для обменов и миграций, где нужно сохранить идентичность элемента между базами. Ограничение: работает только до первой записи объекта.

Дополнительный реквизит с внешним кодом

Подходит, когда менять GUID нельзя или нежелательно: внешний идентификатор хранится в отдельном реквизите или регистре сведений. Ограничение: требуется доработка конфигурации и механизмов поиска.

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

Проверка результата и контрольные точки

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

Контрольные точки

Как проверить результат

GUID записанного элемента
Норма

Ссылка.УникальныйИдентификатор() возвращает исходную строку GUID

Тревожный признак

Идентификатор отличается — УстановитьСсылкуНового не была вызвана до записи

Существование объекта
Норма

Ссылка.ПолучитьОбъект() возвращает объект с заполненными реквизитами

Тревожный признак

ПолучитьОбъект() возвращает Неопределено — объект не записан, ссылка битая

Ссылки из других объектов
Норма

Документы и регистры корректно открывают элемент по ссылке

Тревожный признак

В полях отображается «Объект не найден» — элемент удалён или не был записан

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

Типичные ошибки и риски

Типичные ошибки
01
Вызов УстановитьСсылкуНового после Записать() — идентификатор уже зафиксирован платформой, метод не даст эффекта
02
Присвоение GUID, который уже занят другим элементом, — ПолучитьСсылку вернёт существующий объект, и загрузка перезапишет чужие данные
03
Передача строки GUID с ошибкой формата (лишние пробелы, неверный регистр не критичен, но нарушение структуры — да) — конструктор выдаст исключение
04
Попытка изменить GUID существующего элемента прямой правкой таблиц СУБД — нарушение целостности базы и потеря поддержки

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

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

Описанный механизм одинаково работает для справочников, документов, планов видов характеристик, планов счетов и других ссылочных типов. Отличия только в методе создания объекта: СоздатьЭлемент() для справочников, СоздатьДокумент() для документов и так далее. Сама пара ПолучитьСсылку() + УстановитьСсылкуНового() неизменна.

Для предопределённых элементов справочников GUID также фиксируется платформой, но их дополнительно идентифицируют по имени предопределённого элемента — при обменах сопоставление часто идёт именно по имени, а не по GUID.

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

Частые вопросы

Можно ли изменить GUID уже записанного элемента?

Штатными средствами — нет. Идентификатор фиксируется в момент первой записи и хранится во всех ссылающихся таблицах. Если нужен другой GUID, создают новый элемент с требуемым идентификатором и переносят на него данные и ссылки.

Чем GUID отличается от кода элемента справочника?

Код — это пользовательский реквизит, который может повторяться между базами и даже внутри одной базы при отключённой проверке уникальности. GUID генерируется платформой и гарантированно уникален; именно он используется для внутренних ссылок.

Что вернёт ПолучитьСсылку, если элемента с таким GUID нет?

Метод вернёт корректную ссылку с указанным идентификатором, но объекта за ней не будет. Проверка через ПолучитьОбъект() даст Неопределено — такая ссылка называется битой, если она осталась в данных без реального объекта.

Можно ли сгенерировать новый GUID программно, не создавая элемент?

Да, конструктор Новый УникальныйИдентификатор() без параметров создаёт случайный идентификатор. Его можно сохранить в переменной и затем использовать через ПолучитьСсылку и УстановитьСсылкуНового.

Сохраняется ли GUID при выгрузке и загрузке через типовые обмены?

В механизмах конвертации данных и планах обмена сопоставление по GUID — стандартное поведение: при загрузке в базу-приёмник элемент либо находится по идентификатору, либо создаётся с сохранением GUID, если это предусмотрено правилами обмена.

Итог

Что важно запомнить

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