Разработка и Конфигурация · 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Сформируйте значение УникальныйИдентификатор из строки или сгенерируйте новый
- 2Получите ссылку через МенеджерОбъекта.ПолучитьСсылку(GUID)
- 3Проверьте, что объект с такой ссылкой ещё не существует (ПолучитьОбъект() вернёт Неопределено)
- 4Создайте объект методом СоздатьЭлемент() или СоздатьДокумент()
- 5Вызовите УстановитьСсылкуНового(Ссылка)
- 6Заполните реквизиты и вызовите Записать()
- 7Проверьте результат: Объект.Ссылка.УникальныйИдентификатор() должен совпасть с заданным
Проверка: не занят ли GUID другим объектом
Перед установкой ссылки обязательно проверьте, свободен ли идентификатор. Если объект с таким GUID уже существует, запись нового объекта завершится ошибкой нарушения уникальности.
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(НовыйGUID);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", НоваяСсылка);
Если Не Запрос.Выполнить().Пустой() Тогда
ВызватьИсключение "Объект с таким GUID уже существует";
КонецЕсли;
Альтернативный быстрый способ — попытаться получить объект через НоваяСсылка.ПолучитьОбъект(). Если возвращается Неопределено, идентификатор свободен. Учтите, что этот приём работает только когда тип ссылки известен заранее.
Как «поменять» GUID уже записанного объекта
Штатного метода изменить GUID существующей ссылки нет. Практический обходной путь — пересоздание объекта:
- Создать новый объект с нужным GUID через
УстановитьСсылкуНовогои скопировать в него все реквизиты, табличные части и движения старого объекта. - Найти все ссылки на старый объект (через
НайтиПоСсылкам()) и заменить их на новую ссылку. - Пометить старый объект на удаление и выполнить удаление помеченных.
Операция трудоёмкая и рискованная: если пропустить хотя бы один документ со старой ссылкой, в нём останется «битая» ссылка. Поэтому для массовых замен используют типовую обработку поиска и замены дублей либо пишут отдельную процедуру с полным контролем ссылок.
Установка GUID при обмене данными
В планах обмена и при конвертации данных GUID передаётся вместе с объектом автоматически: при загрузке в базу-приёмник объект создаётся с той же ссылкой, что и в источнике. За это отвечает механизм регистрации и сопоставления объектов.
Если вы пишете собственную выгрузку (например, в XML или JSON), сохраняйте идентификатор в явном виде:
СтрокаGUID = XMLСтрока(Ссылка.УникальныйИдентификатор());
// при загрузке:
НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(НовыйGUID);
При загрузке сначала ищите объект по GUID: если найден — обновляйте его, если нет — создавайте новый с установкой ссылки. Такой подход исключает дубли при повторной загрузке одного и того же пакета данных.
Как выбрать действие
Обратные задачи: получить GUID ссылки и найти объект по GUID
Получение идентификатора существующего объекта:
GUIDСтрокой = Строка(ЭлементСправочника.Ссылка.УникальныйИдентификатор());
Поиск объекта по известному GUID, когда тип объекта известен:
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(
Новый УникальныйИдентификатор("8b3f4a2e-1c5d-4e6f-9a0b-2c3d4e5f6a7b"));
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект не найден");
КонецЕсли;
Если тип объекта заранее неизвестен, придётся перебирать менеджеры нужных видов объектов или хранить тип вместе с GUID в интеграционном сообщении — это стандартная практика при обмене.
Как проверить результат
Объект.Ссылка.УникальныйИдентификатор() равен заданному значению
GUID отличается — значит УстановитьСсылкуНового не сработал или объект был уже записан
Запрос по ссылке возвращает ровно одну строку
Ошибка уникальности при записи или несколько объектов с одним идентификатором
НайтиПоСсылкам() по старой ссылке возвращает пустой результат
В документах остались ссылки на удалённый объект
Типичные ошибки при работе с GUID
Самая частая ошибка — вызов УстановитьСсылкуНового после записи объекта или у объекта, полученного через ПолучитьОбъект(). В обоих случаях платформа выдаёт исключение, потому что ссылка уже зафиксирована.
Вторая группа ошибок — неверный формат строки идентификатора. Конструктор Новый УникальныйИдентификатор(Строка) требует строгий формат с дефисами; лишние пробелы, фигурные скобки или неверный регистр символов приводят к ошибке преобразования. Перед созданием идентификатора строку стоит очистить через СокрЛП().
Третья типичная проблема — конфликт при параллельной загрузке: два потока создают объект с одним GUID одновременно. В многопоточных сценариях оборачивайте создание в транзакцию с проверкой существования и обрабатывайте исключение повторным чтением уже созданного объекта.
Ограничения и безопасные границы
Установка GUID — инструмент разработчика, а не пользователя. Все манипуляции выполняйте в копии базы, а в рабочей базе — только после резервного копирования. Для файловых баз достаточно копии файла 1Cv8.1CD, для клиент-серверных — выгрузки в dt или средствами СУБД.
Учтите ограничение на уникальность: один GUID может принадлежать только одному объекту одного типа. Также помните, что предопределённые элементы имеют служебные идентификаторы, и менять их категорически не рекомендуется — это ломает обращения к ним из кода конфигурации.
Что важно запомнить
Новому объекту GUID задаётся через УстановитьСсылкуНового до записи, существующему — только через пересоздание с заменой ссылок. Всегда проверяйте занятость идентификатора, работайте в копии базы и никогда не правьте ссылки напрямую в таблицах СУБД.
Частые вопросы
Можно ли изменить GUID объекта без его пересоздания?
Штатными средствами платформы — нет. Ссылка является частью первичного ключа, поэтому единственный корректный путь — создать новый объект с нужным GUID, перенести данные и ссылки, а старый удалить. Прямое редактирование таблиц СУБД не поддерживается и разрушает целостность данных.
Почему УстановитьСсылкуНового выдаёт ошибку?
Чаще всего метод вызывается у объекта, у которого ссылка уже установлена: либо объект был записан ранее, либо получен через ПолучитьОбъект(). Метод работает только для новых объектов, созданных через СоздатьЭлемент() или СоздатьДокумент(), и только до первой записи.
Как узнать GUID элемента справочника без программирования?
В пользовательском режиме GUID не отображается напрямую. Проще всего открыть элемент в режиме тонкого клиента и посмотреть идентификатор в строке адреса браузера (для веб-клиента) либо использовать любую универсальную обработку, показывающую уникальный идентификатор ссылки.
Что произойдёт, если загрузить два объекта с одинаковым GUID?
Платформа не позволит записать второй объект: при записи возникнет ошибка нарушения уникальности индекса. Поэтому при загрузке данных всегда сначала ищите объект по GUID и обновляйте найденный, а не создавайте новый безусловно.
Сохраняется ли GUID при обмене через типовые планы обмена?
Да. При обмене между базами 1С через планы обмена объекты создаются в приёмнике с тем же идентификатором, что в источнике. Именно по GUID механизм сопоставления понимает, что это тот же самый объект, и не создаёт дубли.
Можно ли задать GUID предопределённому элементу?
Технически предопределённые элементы создаются платформой при обновлении конфигурации, и их идентификаторы формируются автоматически. Вмешиваться в них не следует: код конфигурации обращается к предопределённым элементам по имени, и подмена GUID может привести к рассинхронизации данных и ошибкам при обновлении.