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

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

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

Как работает уникальный идентификатор (GUID) в 1С, как получить, задать и проверить его при обмене данными, интеграции и разработке. Примеры кода и типичные ошибки.

Уникальный идентификатор в 1С — это 36-символьное значение формата GUID (например, 8a3f2c1e-5b7d-4e9a-b2c3-1d4e5f6a7b8c), которое платформа присваивает каждому объекту базы: элементу справочника, документу, записи регистра. Именно по нему, а не по коду или наименованию, система однозначно различает объекты.

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

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

Как посмотреть уникальный идентификатор существующего объекта

Прежде чем устанавливать идентификатор, часто нужно узнать GUID уже существующего объекта — например, чтобы передать его во внешнюю систему. Самый простой способ без программирования — открыть объект и посмотреть адресную строку браузера при работе через веб-клиент: ссылка содержит идентификатор в виде ref=...

В тонком клиенте GUID виден при копировании ссылки на объект: меню «Ещё» → «Вывести список» не подходит, а вот команда «Получить ссылку» (в типовых конфигурациях на БСП) покажет навигационную ссылку вида e1cib/data/Справочник.Номенклатура?ref=8a3f2c1e5b7d4e9ab2c31d4e5f6a7b8c. Последняя часть — это идентификатор без дефисов.

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

Идентификатор = СсылкаНаОбъект.УникальныйИдентификатор();

СтрокаGUID = Строка(Идентификатор); // "8a3f2c1e-5b7d-..."

Обратный вариант — получить ссылку по известному GUID:

Ид = Новый УникальныйИдентификатор("8a3f2c1e-5b7d-4e9a-b2c3-1d4e5f6a7b8c");

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

Как установить GUID новому объекту программно

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

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

СтрокаGUID = "8a3f2c1e-5b7d-4e9a-b2c3-1d4e5f6a7b8c";

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

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

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

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

НовыйОбъект.Наименование = "Тестовая позиция";

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

// Проверка

Сообщить(Строка(НовыйОбъект.Ссылка.УникальныйИдентификатор()));

Тот же подход работает для документов (Документы.РеализацияТоваровУслуг.СоздатьДокумент()) и планов видов характеристик. Для записей регистров сведений понятие ссылки отсутствует — там GUID не устанавливается.

Защита от дублирования

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

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

// Объекта нет — можно создавать с этим GUID

Иначе

// Объект уже существует — обновляем его, а не создаём новый

КонецЕсли;

Установка идентификатора при обмене и синхронизации

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

При загрузке из файлов (XML, JSON, CSV) типовая схема такая: внешняя система выгружает объект вместе с его GUID, загрузка в 1С ищет объект по этому GUID, а если не находит — создаёт новый и принудительно назначает переданный идентификатор. Так обеспечивается идемпотентность: повторная загрузка того же файла не создаст дублей.

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

Генерация нового GUID в коде

Если нужно просто получить новый уникальный идентификатор (например, для передачи во внешнюю систему как ключ будущего объекта), используется конструктор без параметров:

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

СтрокаДляВнешнейСистемы = Строка(НовыйИд);

Сгенерированный таким образом GUID можно сохранить в реквизите объекта (например, строковом поле «ИдентификаторВнешнейСистемы») и позже использовать для установки ссылки при создании связанных объектов.

Способы работы с GUID

Автоматическое присвоение

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

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

Программная установка заданного GUID новому объекту. Нужна при интеграциях и загрузках; работает только до первой записи.

Хранение GUID в реквизите

Идентификатор внешней системы хранится строкой в отдельном реквизите. Проще и безопаснее, но требует поиска по реквизиту вместо прямого доступа по ссылке.

Типичные ошибки и ограничения

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

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

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

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

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

GUID записанного объекта
Норма

Строка(Ссылка.УникальныйИдентификатор()) совпадает с заданным значением

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

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

Отсутствие дублей
Норма

Поиск по GUID возвращает ровно один объект

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

Найдено несколько объектов или объект не находится по ссылке

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

Документы и регистры корректно открывают связанный объект

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

В полях ссылок отображается «Объект не найден»

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

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

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

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

Можно ли изменить уникальный идентификатор уже записанного объекта?

Штатными средствами — нет. Идентификатор фиксируется при первой записи и используется всеми ссылками на объект. Обходной путь — создать новый объект с нужным GUID, перенести в него данные и заменить ссылки через поиск и замену значений, после чего удалить старый объект.

Как получить GUID из навигационной ссылки вида e1cib/data/...?ref=...

Значение после ref= — это идентификатор в специальном внутреннем формате (без дефисов, с перестановкой байтов). Напрямую в конструктор УникальныйИдентификатор его передавать нельзя. Проще получить ссылку через значение в базе и вызвать УникальныйИдентификатор(), либо использовать функцию преобразования формата, которую легко найти в типовых механизмах интеграции.

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

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

Что произойдёт, если установить GUID, который уже занят другим объектом?

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

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

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

Итог

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

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