Разработка и Конфигурация · 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 объекта в его собственный реквизит до первой записи бессмысленно — до момента записи ссылка ещё не зафиксирована в базе.
- 1Создайте объект и заполните обязательные реквизиты
- 2Вызовите Записать() — объект получает постоянную ссылку
- 3Получите GUID: Объект.Ссылка.УникальныйИдентификатор()
- 4Присвойте Строка(GUID) нужному реквизиту объекта
- 5Вызовите Записать() повторно и проверьте значение реквизита в форме
Как создать новый GUID и задать его объекту при записи
Сгенерировать новый идентификатор без привязки к объекту можно конструктором без параметров. Такой GUID используют, например, как ключ связи между записями разных систем или как токен операции.
НовыйGUID = Новый УникальныйИдентификатор();
Сообщить(Строка(НовыйGUID));
Более сложный и востребованный сценарий — создать объект с заранее известным GUID. Это стандартный приём синхронизации: внешняя система передаёт идентификатор, и в 1С нужно создать элемент именно с ним, чтобы дальнейшие обмены сопоставлялись один к одному. Для этого используется метод ПолучитьСсылку() менеджера объекта и метод УстановитьСсылкуНового().
GUIDИзСтроки = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(GUIDИзСтроки);
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);
НовыйЭлемент.Наименование = "Товар из обмена";
НовыйЭлемент.Записать();
Если пропустить УстановитьСсылкуНового(), платформа при записи сгенерирует собственный GUID, и сопоставление с внешней системой потеряется. Это одна из самых частых причин появления дублей при обменах: объект вроде бы загружен, но идентификатор у него другой.
Как найти или восстановить объект по GUID
Обратная задача — по строке идентификатора получить ссылку на объект. Для этого строка преобразуется в тип УникальныйИдентификатор, а затем передаётся в ПолучитьСсылку(). Если объект с таким GUID существует, метод вернёт рабочую ссылку; если нет — ссылка будет «битой», и обращение к её реквизитам вернёт ошибку или пустые значения в зависимости от контекста.
GUID = Новый УникальныйИдентификатор(СтрокаGUID);
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(GUID);
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Существует = Не Запрос.Выполнить().Пустой();
Проверка существования через запрос обязательна перед использованием ссылки: ПолучитьСсылку() сам по себе не сообщает, есть ли объект в базе. Альтернативный быстрый способ — получить объект через ПолучитьОбъект() и проверить результат на Неопределено, но при отсутствии объекта этот вызов дороже по ресурсам.
Как проверить результат
36 символов с дефисами, формат 8-4-4-4-12
Пустая строка, обрезанное значение или текст вида «УникальныйИдентификатор»
Запрос по ссылке возвращает объект, реквизиты доступны
Запрос пуст, при обращении к реквизитам — ошибка «Объект не найден»
Ссылка.УникальныйИдентификатор() совпадает с переданным извне
GUID отличается — значит, УстановитьСсылкуНового не вызван
Типичные ошибки и ограничения
Первая группа ошибок связана с преобразованием типов. Конструктор Новый УникальныйИдентификатор(Строка) выбрасывает исключение, если строка не соответствует формату GUID — лишние пробелы, фигурные скобки из представлений других систем или неверный регистр не всегда, но часто становятся причиной падения обмена. Перед созданием значения строку стоит очистить от скобок «{}» и пробелов.
Вторая группа — попытка изменить GUID уже записанного объекта. Это невозможно штатными средствами: идентификатор неизменен. Если требуется «пересадить» объект на другой GUID, единственный корректный путь — создать новый объект с нужной ссылкой, перенести данные и ссылки на него, а старый объект удалить. Прямые манипуляции с таблицами СУБД в обход платформы нарушают лицензионные условия и почти гарантированно приводят к нарушению целостности базы.
Третья группа — хранение GUID в реквизитах неподходящего типа. Строка неограниченной длины не индексируется и тормозит поиск; строка короче 36 символов обрезает значение. Оптимально — Строка(36) с фиксированной длиной и, при частом поиске по этому полю, индексирование реквизита.
Выбор способа в зависимости от задачи
Когда нужно просто передать идентификатор наружу (в API, файл, печатную форму) — достаточно УникальныйИдентификатор() и XMLСтрока(). Когда нужно хранить соответствие с внешней системой — строковый реквизит 36 символов с индексом. Когда загружаете объекты извне и обязаны сохранить их идентификаторы — ПолучитьСсылку() плюс УстановитьСсылкуНового() с обязательной проверкой на существование.
Как выбрать действие
Что важно запомнить
GUID объекта читается через Ссылка.УникальныйИдентификатор(), записывается в строковый вид через Строка() или XMLСтрока(), задаётся новому объекту связкой ПолучитьСсылку() + УстановитьСсылкуНового(). Идентификатор существующего объекта изменить нельзя, а перед использованием ссылки по GUID всегда проверяйте, что объект реально существует в базе.
Частые вопросы
Можно ли посмотреть GUID объекта без программирования?
Да. В форме объекта через «Ещё» доступна навигационная ссылка, содержащая идентификатор, а в веб-клиенте GUID виден прямо в адресной строке. Также существуют типовые и внешние обработки, показывающие свойства ссылки, включая GUID, одним нажатием.
Чем GUID отличается от кода и номера документа?
Код и номер — прикладные реквизиты: их можно редактировать, они могут повторяться между разными базами и даже обнуляться при перенумерации. GUID назначается платформой один раз, не меняется и уникален глобально, поэтому для интеграций используют именно его.
Почему ПолучитьСсылку() вернула ссылку, а объекта в базе нет?
Метод ПолучитьСсылку() только конструирует значение ссылки из GUID и не обращается к данным. Существование объекта нужно проверять отдельно — запросом по ссылке или через ПолучитьОбъект() с проверкой на Неопределено.
Можно ли использовать GUID как ключ в регистре сведений?
Да, распространённый приём — регистр сведений «Соответствия объектов», где одно измерение — ссылка на объект 1С, а второе — строковое поле с GUID внешней системы. Для строкового измерения задайте фиксированную длину 36, чтобы поиск и индексация работали корректно.
Совпадает ли GUID объекта после выгрузки и загрузки через XML?
При штатных механизмах обмена (конвертация данных, универсальный формат) ссылки переносятся с сохранением GUID — именно поэтому объекты сопоставляются между базами. Если же объект создаётся заново произвольным кодом без УстановитьСсылкуНового(), идентификатор будет новым.
Что делать, если строка GUID пришла в фигурных скобках или верхнем регистре?
Уберите скобки функциями СтрЗаменить() и приведите строку к нижнему регистру через НРег() перед передачей в конструктор. Регистр символов на значение не влияет, но единообразие упрощает сравнение строк при отладке обменов.