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

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

Как установить GUID объекта в 1С

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

GUID (глобальный уникальный идентификатор) в 1С — это 36-символьная строка вида «8b3f4a2e-…», которая однозначно определяет объект базы: элемент справочника, документ, узел плана обмена. По умолчанию платформа генерирует GUID автоматически при записи объекта, но при обмене данными, переносе из другой базы или синхронизации с внешними системами часто требуется задать конкретный идентификатор вручную.

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

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

Что такое GUID в 1С и когда его нужно задавать вручную

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

Ручная установка GUID нужна в ограниченном числе сценариев:

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

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

Установка GUID новому объекту через УстановитьСсылкуНового

Стандартный приём: создать объект методом СоздатьЭлемент() (или СоздатьДокумент() для документов), сформировать ссылку с нужным GUID и привязать её к объекту до записи.

НовыйGUID = Новый УникальныйИдентификатор("8b3f4a2e-1c5d-4e6f-9a0b-2c3d4e5f6a7b");

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

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

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

НовыйЭлемент.Наименование = "Тестовая позиция";

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

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

Для документов логика аналогичная, но дополнительно потребуется заполнить обязательные реквизиты (дату, организацию и т.п.), иначе проверка заполнения не пропустит запись.

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

Проверка: не занят ли GUID другим объектом

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

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

Запрос = Новый Запрос;

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

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

Если Не Запрос.Выполнить().Пустой() Тогда

ВызватьИсключение "Объект с таким GUID уже существует";

КонецЕсли;

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

Как «поменять» GUID уже записанного объекта

Штатного метода изменить GUID существующей ссылки нет. Практический обходной путь — пересоздание объекта:

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

Операция трудоёмкая и рискованная: если пропустить хотя бы один документ со старой ссылкой, в нём останется «битая» ссылка. Поэтому для массовых замен используют типовую обработку поиска и замены дублей либо пишут отдельную процедуру с полным контролем ссылок.

Установка GUID при обмене данными

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

Если вы пишете собственную выгрузку (например, в XML или JSON), сохраняйте идентификатор в явном виде:

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

// при загрузке:

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

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

При загрузке сначала ищите объект по GUID: если найден — обновляйте его, если нет — создавайте новый с установкой ссылки. Такой подход исключает дубли при повторной загрузке одного и того же пакета данных.

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

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

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

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

Получение идентификатора существующего объекта:

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

Поиск объекта по известному GUID, когда тип объекта известен:

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

Новый УникальныйИдентификатор("8b3f4a2e-1c5d-4e6f-9a0b-2c3d4e5f6a7b"));

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

Сообщить("Объект не найден");

КонецЕсли;

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

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

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

Совпадение GUID после записи
Норма

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

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

GUID отличается — значит УстановитьСсылкуНового не сработал или объект был уже записан

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

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

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

Ошибка уникальности при записи или несколько объектов с одним идентификатором

Целостность ссылок после замены
Норма

НайтиПоСсылкам() по старой ссылке возвращает пустой результат

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

В документах остались ссылки на удалённый объект

Типичные ошибки при работе с GUID

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

Вторая группа ошибок — неверный формат строки идентификатора. Конструктор Новый УникальныйИдентификатор(Строка) требует строгий формат с дефисами; лишние пробелы, фигурные скобки или неверный регистр символов приводят к ошибке преобразования. Перед созданием идентификатора строку стоит очистить через СокрЛП().

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

Типичные ошибки
01
Вызов УстановитьСсылкуНового у записанного объекта — исключение и потеря данных формы
02
Отсутствие проверки занятости GUID — ошибка уникальности при записи
03
Передача строки GUID с фигурными скобками из внешней системы — ошибка преобразования в УникальныйИдентификатор
04
Замена GUID без поиска ссылок — битые ссылки в документах и регистрах
05
Ручная правка таблиц СУБД вместо объектной модели — разрушение ссылочной целостности базы

Ограничения и безопасные границы

Установка GUID — инструмент разработчика, а не пользователя. Все манипуляции выполняйте в копии базы, а в рабочей базе — только после резервного копирования. Для файловых баз достаточно копии файла 1Cv8.1CD, для клиент-серверных — выгрузки в dt или средствами СУБД.

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

Итог

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

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

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

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

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

Почему УстановитьСсылкуНового выдаёт ошибку?

Чаще всего метод вызывается у объекта, у которого ссылка уже установлена: либо объект был записан ранее, либо получен через ПолучитьОбъект(). Метод работает только для новых объектов, созданных через СоздатьЭлемент() или СоздатьДокумент(), и только до первой записи.

Как узнать GUID элемента справочника без программирования?

В пользовательском режиме GUID не отображается напрямую. Проще всего открыть элемент в режиме тонкого клиента и посмотреть идентификатор в строке адреса браузера (для веб-клиента) либо использовать любую универсальную обработку, показывающую уникальный идентификатор ссылки.

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

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

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

Да. При обмене между базами 1С через планы обмена объекты создаются в приёмнике с тем же идентификатором, что в источнике. Именно по GUID механизм сопоставления понимает, что это тот же самый объект, и не создаёт дубли.

Можно ли задать GUID предопределённому элементу?

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