Разработка и Конфигурация · 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Сформируйте объект УникальныйИдентификатор из строки: Новый УникальныйИдентификатор(СтрокаГУИД)
- 2Получите ссылку нужного типа: Справочники.Номенклатура.ПолучитьСсылку(ГУИД)
- 3Убедитесь, что элемента с таким GUID ещё нет в базе (проверка через ПолучитьОбъект)
- 4Создайте новый объект: Справочники.Номенклатура.СоздатьЭлемент()
- 5Вызовите НовыйОбъект.УстановитьСсылкуНового(Ссылка)
- 6Заполните реквизиты и запишите объект методом Записать()
- 7Проверьте, что Ссылка.УникальныйИдентификатор() совпадает с исходным GUID
Полный пример кода:
СтрокаГУИД = "b2c4d8e6-1a2b-4c3d-9e8f-7a6b5c4d3e2f";
ГУИД = Новый УникальныйИдентификатор(СтрокаГУИД);
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
// Проверка, что элемент с таким GUID ещё не существует
Если НоваяСсылка.ПолучитьОбъект() = Неопределено Тогда
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект.Наименование = "Загруженный элемент";
НовыйОбъект.Записать();
КонецЕсли;
Ключевой момент: УстановитьСсылкуНового() вызывается строго до записи объекта. После записи изменить идентификатор штатными средствами нельзя — ссылка уже зафиксирована во всех таблицах базы, где на неё ссылаются другие объекты.
Альтернативные способы и их ограничения
Не всегда требуется именно фиксация GUID. В зависимости от задачи подходят разные варианты.
Сравнение вариантов
Подходит для обычной работы и новых элементов; идентификатор создаётся платформой, никаких действий не требуется. Ограничение: GUID нельзя предугадать и сопоставить с внешней системой заранее.
Подходит для обменов и миграций, где нужно сохранить идентичность элемента между базами. Ограничение: работает только до первой записи объекта.
Подходит, когда менять GUID нельзя или нежелательно: внешний идентификатор хранится в отдельном реквизите или регистре сведений. Ограничение: требуется доработка конфигурации и механизмов поиска.
Если конфигурацию менять нельзя, а сопоставление с внешней системой нужно, распространённое решение — регистр сведений «Соответствия объектов», где хранится пара «ссылка — внешний идентификатор». Так работают многие типовые механизмы синхронизации.
Проверка результата и контрольные точки
После записи элемента с заданным GUID убедитесь, что идентификатор присвоен корректно и ссылки работают.
Как проверить результат
Ссылка.УникальныйИдентификатор() возвращает исходную строку GUID
Идентификатор отличается — УстановитьСсылкуНового не была вызвана до записи
Ссылка.ПолучитьОбъект() возвращает объект с заполненными реквизитами
ПолучитьОбъект() возвращает Неопределено — объект не записан, ссылка битая
Документы и регистры корректно открывают элемент по ссылке
В полях отображается «Объект не найден» — элемент удалён или не был записан
Дополнительно полезно проверить отсутствие дублей: выполните поиск по тому же GUID через ПолучитьСсылку() и убедитесь, что найден ровно один объект. Дубли с одинаковым GUID в одной базе невозможны на уровне платформы, но при некорректной загрузке могут появиться два элемента с одинаковым наименованием и разными GUID — это уже проблема логики обмена.
Типичные ошибки и риски
Самая опасная ситуация — коллизия идентификаторов при параллельной загрузке. Если два механизма обмена создают элементы с одинаковым GUID, второй фактически работает с объектом первого. Поэтому перед присвоением всегда проверяйте, свободен ли идентификатор.
Особенности для разных типов объектов
Описанный механизм одинаково работает для справочников, документов, планов видов характеристик, планов счетов и других ссылочных типов. Отличия только в методе создания объекта: СоздатьЭлемент() для справочников, СоздатьДокумент() для документов и так далее. Сама пара ПолучитьСсылку() + УстановитьСсылкуНового() неизменна.
Для предопределённых элементов справочников GUID также фиксируется платформой, но их дополнительно идентифицируют по имени предопределённого элемента — при обменах сопоставление часто идёт именно по имени, а не по GUID.
При отладке обменов удобно выводить GUID в сообщениях и журнале регистрации рядом с наименованием элемента: по наименованию элементы часто неотличимы, а по идентификатору проблемный объект находится мгновенно.
Частые вопросы
Можно ли изменить GUID уже записанного элемента?
Штатными средствами — нет. Идентификатор фиксируется в момент первой записи и хранится во всех ссылающихся таблицах. Если нужен другой GUID, создают новый элемент с требуемым идентификатором и переносят на него данные и ссылки.
Чем GUID отличается от кода элемента справочника?
Код — это пользовательский реквизит, который может повторяться между базами и даже внутри одной базы при отключённой проверке уникальности. GUID генерируется платформой и гарантированно уникален; именно он используется для внутренних ссылок.
Что вернёт ПолучитьСсылку, если элемента с таким GUID нет?
Метод вернёт корректную ссылку с указанным идентификатором, но объекта за ней не будет. Проверка через ПолучитьОбъект() даст Неопределено — такая ссылка называется битой, если она осталась в данных без реального объекта.
Можно ли сгенерировать новый GUID программно, не создавая элемент?
Да, конструктор Новый УникальныйИдентификатор() без параметров создаёт случайный идентификатор. Его можно сохранить в переменной и затем использовать через ПолучитьСсылку и УстановитьСсылкуНового.
Сохраняется ли GUID при выгрузке и загрузке через типовые обмены?
В механизмах конвертации данных и планах обмена сопоставление по GUID — стандартное поведение: при загрузке в базу-приёмник элемент либо находится по идентификатору, либо создаётся с сохранением GUID, если это предусмотрено правилами обмена.
Что важно запомнить
GUID присваивается платформой автоматически, а задать нужный идентификатор можно только до первой записи через УстановитьСсылкуНового(). Перед присвоением проверяйте, что GUID свободен, после записи — что идентификатор совпал и объект существует. Изменить GUID записанного элемента штатно нельзя.