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

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

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

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

Уникальный идентификатор (GUID, он же UUID) в 1С — это 36-символьная строка вида «a1b2c3d4-e5f6-7890-abcd-ef1234567890», которая однозначно определяет объект базы данных: элемент справочника, документ, запись регистра. Идентификатор присваивается объекту автоматически при создании и не меняется в течение всего жизни объекта, поэтому именно GUID используют для обмена данными между базами, интеграции с внешними системами и построения ссылок вида «e1cib/data/...».

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

Ниже разобраны рабочие приёмы на встроенном языке 1С с примерами кода, проверкой результата и разбором ошибок, которые чаще всего приводят к «битым» ссылкам и дублям при обмене.

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

Каждый ссылочный объект 1С (справочник, документ, план счетов и т.д.) имеет внутренний идентификатор, который платформа генерирует при первой записи объекта в базу. Физически это 16-байтовое значение, хранящееся в поле ссылки таблицы базы данных. Пользователь видит его в текстовом представлении — через дефисы, в формате 8-4-4-4-12 шестнадцатеричных символов.

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

Посмотреть GUID объекта без программирования можно через инструменты разработчика: в командной панели формы объекта выбрать «Ещё → Вывести список» либо использовать стандартную обработку, показывающую свойства ссылки. В режиме предприятия GUID также виден в адресной строке браузера при работе через веб-клиент в навигационной ссылке объекта.

Как получить GUID существующего объекта

Базовый приём — вызов метода УникальныйИдентификатор() у ссылки. Он возвращает значение типа «УникальныйИдентификатор», которое для записи в строковый реквизит, файл или передачи во внешнюю систему нужно преобразовать в строку.

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

GUIDСтрокой = Строка(GUIDОбъекта);

// Результат: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"

Для обмена через XML и веб-сервисы вместо Строка() корректнее использовать функции XMLСтрока() и XMLЗначение(). Они работают с каноническим представлением типов и не зависят от региональных настроек, что снижает риск рассинхронизации при интеграции между разными информационными базами.

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

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

Как записать GUID в реквизит объекта

Если GUID нужно хранить как данные (например, идентификатор объекта во внешней системе), создайте в справочнике или документе строковый реквизит длиной 36 символов — этого достаточно для текстового представления. Большая длина не нужна, переменная длина строки допустима.

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

НовыйЭлемент.Наименование = "ООО Пример";

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

НовыйЭлемент.Записать();

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

Запись GUID объекта в его собственный реквизит
  1. 1
    Создайте объект и заполните обязательные реквизиты
  2. 2
    Вызовите Записать() — объект получает постоянную ссылку
  3. 3
    Получите GUID: Объект.Ссылка.УникальныйИдентификатор()
  4. 4
    Присвойте Строка(GUID) нужному реквизиту объекта
  5. 5
    Вызовите Записать() повторно и проверьте значение реквизита в форме

Как создать новый GUID и задать его объекту при записи

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

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

Сообщить(Строка(НовыйGUID));

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

GUIDИзСтроки = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");

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

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

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

НовыйЭлемент.Наименование = "Товар из обмена";

НовыйЭлемент.Записать();

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

Как найти или восстановить объект по GUID

Обратная задача — по строке идентификатора получить ссылку на объект. Для этого строка преобразуется в тип УникальныйИдентификатор, а затем передаётся в ПолучитьСсылку(). Если объект с таким GUID существует, метод вернёт рабочую ссылку; если нет — ссылка будет «битой», и обращение к её реквизитам вернёт ошибку или пустые значения в зависимости от контекста.

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

Ссылка = Справочники.Контрагенты.ПолучитьСсылку(GUID);

Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Ссылка");

Запрос.УстановитьПараметр("Ссылка", Ссылка);

Существует = Не Запрос.Выполнить().Пустой();

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

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

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

GUID записан в строковый реквизит
Норма

36 символов с дефисами, формат 8-4-4-4-12

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

Пустая строка, обрезанное значение или текст вида «УникальныйИдентификатор»

Ссылка по GUID из обмена
Норма

Запрос по ссылке возвращает объект, реквизиты доступны

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

Запрос пуст, при обращении к реквизитам — ошибка «Объект не найден»

Новый объект с заданным GUID
Норма

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

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

GUID отличается — значит, УстановитьСсылкуНового не вызван

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

Первая группа ошибок связана с преобразованием типов. Конструктор Новый УникальныйИдентификатор(Строка) выбрасывает исключение, если строка не соответствует формату GUID — лишние пробелы, фигурные скобки из представлений других систем или неверный регистр не всегда, но часто становятся причиной падения обмена. Перед созданием значения строку стоит очистить от скобок «{}» и пробелов.

Вторая группа — попытка изменить GUID уже записанного объекта. Это невозможно штатными средствами: идентификатор неизменен. Если требуется «пересадить» объект на другой GUID, единственный корректный путь — создать новый объект с нужной ссылкой, перенести данные и ссылки на него, а старый объект удалить. Прямые манипуляции с таблицами СУБД в обход платформы нарушают лицензионные условия и почти гарантированно приводят к нарушению целостности базы.

Третья группа — хранение GUID в реквизитах неподходящего типа. Строка неограниченной длины не индексируется и тормозит поиск; строка короче 36 символов обрезает значение. Оптимально — Строка(36) с фиксированной длиной и, при частом поиске по этому полю, индексирование реквизита.

Типичные ошибки
01
Забыли УстановитьСсылкуНового() — объект записался с новым случайным GUID, обмен создал дубль
02
Сохранили GUID через СокрЛП(Объект.Ссылка) вместо УникальныйИдентификатор() — в реквизите оказалось представление вида «Товар 123», а не идентификатор
03
Не проверили существование объекта после ПолучитьСсылку() — дальше по коду ошибка «Объект не найден»
04
Строка с GUID из внешней системы содержит фигурные скобки — конструктор выбросил исключение и прервал загрузку
05
Реквизит под GUID объявлен длиной 32 символа — значение обрезано, сопоставление не работает

Выбор способа в зависимости от задачи

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

Маршрут решения

Как выбрать действие

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

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

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

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

Можно ли посмотреть GUID объекта без программирования?

Да. В форме объекта через «Ещё» доступна навигационная ссылка, содержащая идентификатор, а в веб-клиенте GUID виден прямо в адресной строке. Также существуют типовые и внешние обработки, показывающие свойства ссылки, включая GUID, одним нажатием.

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

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

Почему ПолучитьСсылку() вернула ссылку, а объекта в базе нет?

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

Можно ли использовать GUID как ключ в регистре сведений?

Да, распространённый приём — регистр сведений «Соответствия объектов», где одно измерение — ссылка на объект 1С, а второе — строковое поле с GUID внешней системы. Для строкового измерения задайте фиксированную длину 36, чтобы поиск и индексация работали корректно.

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

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

Что делать, если строка GUID пришла в фигурных скобках или верхнем регистре?

Уберите скобки функциями СтрЗаменить() и приведите строку к нижнему регистру через НРег() перед передачей в конструктор. Регистр символов на значение не влияет, но единообразие упрощает сравнение строк при отладке обменов.