Разработка и Конфигурация · 14 мин
Уникальный идентификатор 1С: как формируется и где используется
Как формируется уникальный идентификатор в 1С: структура GUID, генерация UUID, получение ссылки по идентификатору, обмен данными и типичные ошибки.
Каждый объект в базе 1С — справочник, документ, план счетов — имеет внутренний уникальный идентификатор, который не виден пользователю напрямую, но именно на нём держится связность всей информационной базы. Этот идентификатор представляет собой значение типа «УникальныйИдентификатор» (UUID, он же GUID) и присваивается объекту один раз — в момент создания — и не меняется на протяжении всей жизни объекта, даже если тот переносится между базами.
Понимание того, как формируется идентификатор, критично в трёх практических сценариях: обмен данными между базами (например, между УТ и БП), поиск «битых ссылок» и восстановление удалённых объектов, а также интеграция с внешними системами, где 1С передаёт свои объекты по API. Ошибки в работе с идентификаторами приводят к дублям справочников, потере связей документов с товарами и невозможности сопоставить данные из разных систем.
Ниже разобрано, как устроен идентификатор изнутри, какими способами он генерируется, как получить его и использовать в коде, а также какие ограничения и типичные ошибки встречаются на практике.
Что представляет собой уникальный идентификатор в 1С
В терминах платформы уникальный идентификатор — это значение типа УникальныйИдентификатор, реализующее общепринятый стандарт UUID (Universally Unique Identifier), в западной литературе чаще называемый GUID. Это 128-битное число, которое в текстовом виде записывается как 32 шестнадцатеричные цифры, сгруппированные дефисами в формате 8-4-4-4-12, например: 8b3b2c1a-5f4e-4d3c-9a8b-1c2d3e4f5a6b.
Идентификатор не следует путать с кодом справочника или номером документа. Код и номер — это «человеческие» реквизиты, которые могут повторяться в разных базах, меняться при перенумерации и вообще не обязаны быть уникальными за пределами своего периода или подсистемы. Уникальный идентификатор, напротив, глобально уникален: вероятность совпадения двух независимо сгенерированных значений настолько мала, что ею пренебрегают даже при масштабах в миллиарды объектов.
Физически идентификатор хранится в поле ссылки объекта. Когда вы в коде обращаетесь к переменной типа «СправочникСсылка.Номенклатура», внутри неё, помимо признака типа, лежит именно этот GUID. Поэтому ссылка — это не «указатель в памяти», а устойчивый адрес объекта, который можно сохранить в текстовом виде и через год найти по нему тот же элемент.
Как платформа формирует идентификатор при создании объекта
Идентификатор присваивается объекту автоматически в момент создания новой ссылки — ещё до записи объекта в базу. Когда выполняется код НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент(), у объекта уже есть заполненное свойство Ссылка с готовым идентификатором. Это важная особенность: программист может заранее узнать GUID будущего объекта и использовать его, например, для заполнения связанных таблиц.
Алгоритм генерации соответствует одной из версий стандарта UUID и опирается на сочетание случайных и временных компонентов, что исключает необходимость согласования с каким-либо центральным сервером. Именно поэтому две независимые базы 1С — например, центральный узел и периферийная база магазина — могут создавать объекты параллельно без риска коллизий. При последующем обмене данными объекты из разных узлов не «перекроют» друг друга.
Есть и второй путь появления идентификатора — явное назначение через метод УстановитьСсылкуНового(). Он используется в обменах данными, когда нужно, чтобы объект в приёмнике получил тот же GUID, что и в источнике. Платформа не генерирует новое значение, а принимает переданное, и именно этот механизм обеспечивает сквозную идентичность объектов в распределённых системах.
Структура GUID и его текстовое представление
Текстовая запись идентификатора состоит из пяти групп шестнадцатеричных цифр, разделённых дефисами: 8-4-4-4-12. Регистр букв значения не имеет — ABCDEF и abcdef с точки зрения сравнения эквивалентны, хотя платформа обычно выводит строчные символы. Пробелы, фигурные скобки и другие обрамления, встречающиеся в других системах (например, в COM-технологиях Windows GUID пишут в фигурных скобках), при переносе в 1С нужно удалять.
Практическое следствие структуры: идентификатор легко проверить «глазами». Если в файле обмена или журнале интеграции вы видите строку, где нарушен шаблон 8-4-4-4-12 или присутствуют символы за пределами 0-9 и a-f, — это не GUID, и попытка сконструировать из него ссылку завершится ошибкой. Такая быстрая визуальная проверка экономит время при разборе проблем обмена.
Внутри базы данных идентификатор хранится не как строка из 36 символов, а в компактном бинарном виде. Поэтому сравнение ссылок и поиск по ссылке в запросах выполняются быстро — это сравнение коротких бинарных значений, а не строк. При выгрузке в текстовые форматы (XML, JSON) платформа сама приводит значение к каноническому строковому виду.
Как получить идентификатор объекта и найти объект по GUID
Получить идентификатор существующего объекта в коде просто: у ссылки вызывается метод УникальныйИдентификатор(). Типовой фрагмент выглядит так: ИД = ТоварСсылка.УникальныйИдентификатор(); СтрокаИД = Строка(ИД);. Результат можно сохранить в текстовом поле, передать во внешнюю систему или записать в журнал для последующего поиска.
Обратная операция — восстановление ссылки из строки — выполняется в два шага: сначала из строки конструируется значение типа «УникальныйИдентификатор» через Новый УникальныйИдентификатор(СтрокаИД), затем у менеджера соответствующего вида объектов вызывается ПолучитьСсылку(ИД). Важно понимать: ПолучитьСсылку возвращает ссылку всегда, даже если объекта с таким GUID в базе нет. Проверка существования делается отдельно — например, запросом или проверкой Ссылка.ПолучитьОбъект() на Неопределено.
- 1Скопируйте строку идентификатора и убедитесь, что она соответствует шаблону 8-4-4-4-12 без лишних символов и фигурных скобок.
- 2В коде создайте значение: ИД = Новый УникальныйИдентификатор(СтрокаИД).
- 3Получите ссылку через менеджер нужного вида, например Справочники.Номенклатура.ПолучитьСсылку(ИД).
- 4Проверьте существование объекта запросом или через ПолучитьОбъект() — ссылка сама по себе не доказывает, что объект есть в базе.
- 5Если объект не найден, проверьте, не перепутан ли вид объекта: один и тот же GUID может использоваться при поиске в разных справочниках при ошибках обмена.
Для разовых задач удобны внешние обработки «поиск объекта по GUID», которые перебирают метаданные и проверяют ссылку по всем видам справочников и документов. Это полезно, когда известен идентификатор из сообщения об ошибке, но неизвестно, объект какого типа за ним стоит.
Роль идентификатора в обмене данными и интеграциях
В типовых механизмах обмена (планы обмена, EnterpriseData, универсальный формат) сопоставление объектов между базами ведётся именно по уникальному идентификатору. Когда объект выгружается из источника, в сообщение попадает его GUID; при загрузке приёмник сначала ищет объект с таким же идентификатором, и только если не находит — применяет дополнительные правила поиска по реквизитам (код, наименование, ИНН для контрагентов).
Если объект в приёмнике создаётся заново, механизм обмена вызывает УстановитьСсылкуНового() с идентификатором из сообщения, и объект «наследует» GUID источника. Благодаря этому при повторных выгрузках связи не разрушаются: документ в приёмнике продолжает ссылаться на тот же товар, что и документ в источнике, потому что идентификаторы совпадают.
При интеграции с внешними системами GUID 1С часто используется как первичный ключ на стороне внешней системы: интернет-магазин хранит идентификаторы товаров из 1С и присылает заказы с этими же идентификаторами. Это надёжнее, чем сопоставление по кодам или артикулам, которые могут меняться. Ограничение подхода — при переезде на новую базу 1С «с нуля» все идентификаторы изменятся, и таблицы соответствий во внешних системах придётся перестраивать.
При настройке нового обмена между базами полезно сразу проверить несколько ключевых справочников: выгрузить один элемент, убедиться, что в приёмнике он получил тот же GUID, и зафиксировать это как контрольный пример. Если идентификаторы разошлись — в правилах конвертации отключена передача ссылки или срабатывает поиск по реквизитам раньше, чем поиск по GUID.
УстановитьСсылкуНового: ручное назначение идентификатора
Метод УстановитьСсылкуНового(Ссылка) позволяет назначить новому объекту произвольный идентификатор до его записи. Сценарий использования строго определён: вы создаёте объект, заранее зная, какой GUID он должен получить, — чаще всего это загрузка данных из другой базы или из файла обмена. После вызова метода объект записывается уже с заданной ссылкой.
Главный риск метода — коллизия: если в базе уже существует объект того же вида с таким идентификатором, запись завершится ошибкой нарушения уникальности. Поэтому перед назначением следует проверить, свободен ли идентификатор, через ПолучитьСсылку и проверку существования. Второй риск — логический: если по ошибке назначить новому объекту GUID другого, ещё живого объекта из источника, при обмене данные начнут «слипаться» и перезаписывать друг друга.
Также метод не работает для уже записанных объектов — изменить идентификатор существующего элемента нельзя в принципе. Если требуется «пересадить» объект на другой GUID, единственный путь — создать новый объект с нужной ссылкой, перенести в него данные и заменить ссылки во всех связанных объектах, что является трудоёмкой операцией, требующей поиска ссылок по всей конфигурации.
Типичные проблемы: битые ссылки, дубли и рассинхронизация
«Битая ссылка» — ситуация, когда в реквизите хранится идентификатор объекта, которого в базе уже нет (удалён физически или потерян при обмене). В интерфейсе это выглядит как запись вида «<Объект не найден> (8b3b2c1a-...)». Идентификатор в скобках — тот самый GUID, и по нему можно попытаться найти объект в архивной копии или базе-источнике и восстановить через УстановитьСсылкуНового.
Дубли при обмене возникают, когда сопоставление по GUID не сработало: например, базы создавались независимо, и один и тот же контрагент существует в обеих с разными идентификаторами. Первый обмен создаёт вторую копию. Лечится это первичным сопоставлением объектов (ручным или по правилам поиска) с последующей фиксацией соответствия в регистрах сопоставления, а не правкой идентификаторов.
Как проверить результат
GUID объекта в приёмнике совпадает с GUID в источнике
Идентификаторы различаются — сопоставление шло по реквизитам, риск дублей
Запрос по ссылке возвращает объект, реквизиты читаются
Объект не найден — ссылка «битая» или перепутан вид объекта
Формат 8-4-4-4-12, только цифры и буквы a-f, без скобок
Лишние символы или нарушен шаблон — конструктор выдаст ошибку
Ограничения и границы безопасной работы
Работа с идентификаторами на уровне чтения — получить GUID, вывести его, передать во внешнюю систему — полностью безопасна и не требует резервных копий. Операциями повышенного риска являются только запись с явным назначением ссылки и массовые замены ссылок в базе: их следует выполнять на копии, в монопольном режиме и с проверкой контрольных примеров после завершения.
Ещё одно ограничение касается внешних ключей: уникальность GUID гарантируется только как вероятностная характеристика алгоритма. В пределах одной базы платформа дополнительно контролирует уникальность ссылки, но при ручном назначении идентификаторов ответственность за осмысленность значений лежит на разработчике. Не следует генерировать идентификаторы «вручную» по собственным схемам (например, зашивать в них код филиала) — это усложняет сопровождение и не даёт выигрыша против штатной генерации.
Что важно запомнить
Уникальный идентификатор 1С — это стандартный 128-битный GUID, который платформа присваивает объекту при создании и который не меняется никогда. Он лежит в основе ссылок, обменов и интеграций. Чтение идентификатора безопасно, а ручное назначение через УстановитьСсылкуНового допустимо только при загрузке данных и после проверки на копии базы.
Частые вопросы
Можно ли изменить уникальный идентификатор существующего объекта?
Нет. Идентификатор присваивается при создании ссылки и остаётся неизменным до физического удаления объекта. Если нужен объект с другим GUID, создаётся новый объект с требуемой ссылкой, данные переносятся, а все ссылки в базе заменяются на новый объект штатными механизмами поиска и замены ссылок.
Чем GUID отличается от кода справочника и номера документа?
Код и номер — прикладные реквизиты, предназначенные для пользователя: они могут повторяться в разных базах, меняться перенумерацией и не несут гарантий глобальной уникальности. GUID — внутренний технический адрес объекта, уникальный глобально и неизменный. Для связей между объектами и обменов используется именно GUID.
Что означает запись «<Объект не найден>» с набором символов в скобках?
Это «битая ссылка»: в реквизите хранится идентификатор объекта, которого уже нет в базе. Строка в скобках — GUID удалённого объекта. По нему можно найти объект в резервной копии или базе-источнике и восстановить с тем же идентификатором через УстановитьСсылкуНового, либо очистить ссылку, если объект больше не нужен.
Будут ли совпадать идентификаторы при выгрузке и загрузке через типовой обмен?
Да, если обмен настроен корректно: механизмы конвертации передают GUID объекта в сообщении, а приёмник создаёт новый объект с этим же идентификатором. Если идентификаторы разошлись, значит сработал поиск по реквизитам или объект был создан в приёмнике раньше независимо — тогда требуется настройка правил сопоставления.
Можно ли использовать GUID 1С как ключ во внешней системе?
Да, это распространённая и надёжная практика: внешняя система хранит GUID как первичный ключ и передаёт его обратно при обращениях к 1С. Учитывайте два момента: храните идентификатор в нормализованном виде (единый регистр, без скобок) и помните, что при переходе на новую базу 1С без переноса ссылок все идентификаторы изменятся.
Почему ПолучитьСсылку не выдаёт ошибку для несуществующего объекта?
Метод ПолучитьСсылку лишь конструирует значение ссылки из идентификатора и не обращается к данным. Существование объекта нужно проверять отдельно: запросом к таблице или попыткой получить объект через ПолучитьОбъект() с проверкой результата на Неопределено. Это стандартный приём защиты от «битых» ссылок в коде интеграций.