Как присвоить объекту нужный GUID в 1С 8.3 и не сломать базу
Содержание
Напрямую изменить GUID у уже существующего объекта в 1С нельзя: уникальный идентификатор элемента справочника или документа доступен только для чтения. Но задать новому объекту заранее известный GUID вполне реально — через код с методом УстановитьСсылкуНового или через выгрузку и загрузку данных в формате XML, которая сохраняет идентификаторы при переносе.
Если же цель — свести два разных GUID к одному (например, когда один и тот же контрагент заведён в базе дважды), меняют не идентификатор, а объект: один оставляют, ссылки с дубля переносят на него штатной обработкой. Ниже — когда какой способ подходит, чем рискует смена GUID и как потом проверить, что ничего не отвалилось.
Что такое GUID и почему его просто так не переписать
GUID (он же UUID, уникальный идентификатор) — это внутренний ключ объекта. У каждой ссылки на элемент справочника, документ, план счетов
и прочие объекты ссылочного типа есть свой 16-байтовый идентификатор вида f8b4e2a1-3c7d-4e2f-9a1b-0c5d6e7f8091. Платформа хранит его в поле _IDRRef таблицы объекта и использует как первичный ключ: все связи между документами, движения по регистрам, значения реквизитов-ссылок указывают именно на него, а не на код или наименование.
Получить идентификатор из кода можно так:
ИД = Элемент.Ссылка.УникальныйИдентификатор();
Сообщить(Строка(ИД)); // f8b4e2a1-3c7d-4e2f-9a1b-0c5d6e7f8091
Метод УникальныйИдентификатор() возвращает значение, но присвоить ему новое нельзя — свойства для записи у ссылки нет. Причина не в прихоти разработчиков платформы: идентификатор — это и есть личность объекта в базе. Поменять его «на месте» означало бы одновременно переписать ссылки во всех таблицах, где объект упомянут, иначе связи порвутся.
Код и наименование меняются свободно и на GUID не влияют. Если задача звучит как «поменять код номенклатуры» — это не про идентификатор, а про реквизит Код, он правится прямо в карточке.
Как задать новому объекту нужный GUID через код
Единственный штатный способ записать объект с заранее выбранным GUID — присвоить ссылку ещё не записанному объекту методом УстановитьСсылкуНового. Работает только для нового объекта и только если такого идентификатора в базе ещё нет.
// Готовим ссылку с нужным идентификатором
НужныйИД = Новый УникальныйИдентификатор("f8b4e2a1-3c7d-4e2f-9a1b-0c5d6e7f8091");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(НужныйИД);
// Создаём элемент и закрепляем за ним эту ссылку ДО записи
Элемент = Справочники.Номенклатура.СоздатьЭлемент();
Элемент.УстановитьСсылкуНового(Ссылка);
Элемент.Наименование = "Бумага А4";
Элемент.Записать();
Метод ПолучитьСсылку отдаёт ссылку с указанным идентификатором, даже если объекта с таким GUID пока нет — это просто «обёртка». УстановитьСсылкуНового закрепляет её за создаваемым объектом, и после Записать() элемент получает именно этот GUID.
Платформа следит за уникальностью: два объекта с одинаковым идентификатором в базе существовать не могут. Если попытаться записать новый объект с GUID, который уже занят, запись завершится ошибкой. Поэтому «переселить» идентификатор можно только на тот объект, который в базе ещё не создан.
С документами способ тот же, но вместо СоздатьЭлемент используется СоздатьДокумент, а после записи документ, как правило, нужно заново провести, чтобы восстановить движения по регистрам:
НужныйИД = Новый УникальныйИдентификатор("...");
Ссылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(НужныйИД);
Док = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
Док.УстановитьСсылкуНового(Ссылка);
// перенос реквизитов шапки
ЗаполнитьЗначенияСвойств(Док, СтарыйДокумент);
Док.Записать(Новый СтруктураДополнительныхСвойствЗаписи, РежимЗаписиДокумента.Проведение);
Чтобы перенести реквизиты из старого объекта, удобно использовать ЗаполнитьЗначенияСвойств(Новый, Старый) — она копирует совпадающие по имени реквизиты. Табличные части переносят отдельно, например Новый.Товары.Загрузить(Старый.Товары.Выгрузить()).
Порядок действий, когда нужно «сменить» идентификатор у существующего объекта:
- Создайте новый объект и задайте ему целевой GUID описанным способом.
- Скопируйте в него все реквизиты и табличные части старого объекта.
- Перенесите на новый объект ссылки из всех документов и регистров (вручную это нереально — используйте обработку объединения, см. ниже).
- Пометьте на удаление старый объект и удалите его через
Операции → Удаление помеченных объектов.
Запись объекта с «чужим» GUID в рабочей базе без переноса ссылок оставит старые документы висеть на прежнем идентификаторе. Делайте такие операции на копии базы, а результат переносите обменом или выгрузкой.
Перенос объектов с сохранением идентификатора
Когда объекты нужно перенести из одной базы в другую и сохранить их GUID (чтобы связи и последующие обмены не сломались), применяют типовую обработку «Выгрузка и загрузка данных в формате XML». Она сериализует объект вместе с идентификатором: в базе-приёмнике элемент появляется с тем же GUID, что и в источнике.
Обработка внешняя, поставляется 1С и подходит для переноса между базами одной конфигурации (или совместимых по структуре). Общая логика:
- в базе-источнике выбираете типы и отбор объектов, получаете файл XML;
- в базе-приёмнике загружаете этот файл;
- объекты записываются с исходными идентификаторами, ссылки между ними восстанавливаются автоматически.
Это основной инструмент, когда задача — «чтобы в новой базе был объект с таким же GUID, как в старой». Для разовых точечных переносов он удобнее кода, потому что сам тянет связанные объекты по ссылкам.
Если конфигурации источника и приёмника различаются по структуре, прямая выгрузка XML не подойдёт — тут нужна «Конвертация данных» (КД) с правилами, где сопоставление объектов тоже можно вести по GUID.
Массовая правка: объединение дублей и инструменты
Чаще под «массовым изменением GUID» на самом деле понимают другое — свести несколько объектов-дублей к одному. Для этого в типовых конфигурациях есть обработка «Поиск и удаление дублей» (Администрирование → Обслуживание → Поиск и удаление дублей в БП 3.0; в других конфигурациях — раздел администрирования или сервиса).
Что она делает:
- Находит похожие элементы по заданным правилам (по наименованию, ИНН и т.п.).
- Позволяет выбрать один элемент как оригинал.
- Переносит все ссылки с дублей на оригинал — во всех документах и регистрах.
- Помечает дубли на удаление.
Идентификатор у оригинала при этом остаётся прежним. Для бизнес-задачи «чтобы везде был один контрагент» результат тот же, что и смена GUID, но без ручной правки ссылок и без риска для целостности.
Таблица — чем какой инструмент хорош:
| Инструмент | Когда применять | Что с GUID |
|---|---|---|
Код УстановитьСсылкуНового | Нужен объект с конкретным заранее известным GUID | Задаёт новый при создании |
| Выгрузка/загрузка XML | Перенос объектов между базами с сохранением связей | Сохраняет исходный |
| Поиск и удаление дублей | Два объекта свести в один | Оригинал не меняется, ссылки переносятся |
| Конвертация данных | Перенос между разными конфигурациями | Сопоставление по правилам/GUID |
А вот правка GUID напрямую в SQL-таблицах (_Reference<N>, поле _IDRRef) — то, чего делать не стоит. Идентификатор хранится в бинарном виде, его нужно было бы синхронно переписать во всех таблицах-ссылках, а любое расхождение превращает базу в неработоспособную. Такой способ не поддерживается, гарантий целостности нет, и при обращении в поддержку базу после ручных правок SQL чинить не возьмутся.
Чем опасно вмешательство в идентификатор
Главный риск — порванные ссылки. Если GUID объекта изменился, а документы ссылаются на старый, в них появятся «битые» ссылки: вместо контрагента или номенклатуры будет <Объект не найден> с указанием прежнего идентификатора.
Отдельная зона риска — обмены и синхронизация:
- 🔄 В распределённой базе (РИБ) объекты узлов сопоставляются именно по GUID. Если на одном узле заменить идентификатор, на остальных узлах появится дубль, а не обновлённый объект.
- 🔗 При синхронизации между базами (например, Бухгалтерия ↔ ЗУП) соответствие объектов тоже строится на идентификаторах. Смена GUID на одной стороне разорвёт пару, и объект приедет повторно.
- 📤 Внешние системы, интеграции и сохранённые отчёты, где зашит конкретный идентификатор, перестанут находить объект.
Пострадать могут и мелочи, которые легко упустить: сохранённые пользователями отборы и настройки списков по этому объекту, значения по умолчанию, элементы в реквизитах других справочников. После смены идентификатора они будут указывать в пустоту, пока их не перенастроят вручную.
Перед любой операцией, которая массово переписывает объекты или ссылки, сделайте резервную копию базы. Откатить такие изменения иначе практически нечем.
Когда GUID менять не нужно — и что сделать вместо этого
Во многих случаях задача решается без вмешательства в идентификатор. Разберём по ситуациям.
Код и Артикул — их и правьте в карточке, GUID оставьте как есть.Отдельно про бизнес-идентификаторы: если во внешней системе объект опознаётся по своему коду, не пытайтесь подогнать под него GUID. Добавьте реквизит под внешний идентификатор (или используйте регистр сведений для хранения соответствия) — это надёжнее и не ломает внутренние связи 1С.
Реальные сценарии, где смена GUID оправдана
Ситуаций, где действительно нужно управлять идентификатором, немного, но они встречаются:
- Слияние двух баз. Компании объединились, у каждой своя база. Чтобы один и тот же контрагент не задвоился после переноса, объекты заранее приводят к общим идентификаторам — переносом XML из одной базы и настройкой сопоставления.
- Настройка обмена между независимо созданными базами. Справочники заполнялись раздельно, GUID разные. Чтобы синхронизация связала объекты автоматически, а не плодила дубли, одну сторону выгружают в другую с сохранением идентификаторов.
- Восстановление «потерянного» объекта. Элемент удалили, а на него ссылались документы. Если известен его прежний GUID, можно создать объект заново с тем же идентификатором методом
УстановитьСсылкуНового— и старые ссылки снова станут рабочими.
Во всех трёх случаях меняют не идентификатор у живого объекта, а создают или переносят объект с нужным GUID на чистом участке — на копии или в базе-приёмнике.
Как проверить, что ничего не сломалось
После любой операции с идентификаторами проверьте целостность ссылок, пока изменения ещё можно откатить из копии.
Где смотреть связи конкретного объекта: в форме элемента или в списке по правой кнопке мыши есть команда Связанные документы (в части конфигураций — Перейти → Связанные документы). Она показывает, какие документы ссылаются на объект. Если после переноса там пусто, а раньше связи были, — ссылки ушли на старый идентификатор, нужно переносить.
Полную картину по всей базе даёт поиск ссылок на объект в режиме предприятия (в типовых — в той же обработке «Поиск и удаление дублей» или через команду удаления, которая перед удалением показывает все места использования). Старый объект не должен удаляться, пока на него что-то ссылается, — платформа сама это проверит и не даст удалить объект с «живыми» ссылками.
Для общей проверки базы используйте Конфигуратор → Администрирование → Тестирование и исправление с включённой проверкой логической целостности. Режим требует монопольного доступа к базе, поэтому запускайте его, когда в базе никто не работает
, — иначе сеансы пользователей будут прерваны.