Администрирование · 12 мин
Как заменить GUID у объекта в 1С
Как заменить GUID у элемента справочника или документа в 1С без потери ссылок: типовые обработки, код, проверка результата и типичные ошибки.
GUID (уникальный идентификатор) — внутренний «паспорт» объекта в базе 1С. По нему платформа связывает записи между собой, а системы обмена — сопоставляет элементы в разных базах. Обычно GUID менять не нужно, но бывают ситуации, когда это необходимо: после восстановления базы из копии «рассинхронизировались» ссылки, при переносе данных объект создался заново с новым идентификатором, а внешняя система хранит старый, или при свёртке и объединении баз появились дубли, которые нужно свести к одному идентификатору.
Замена GUID — операция на уровне внутренней структуры данных. Платформа 1С не предоставляет штатной кнопки «поменять GUID», поэтому задачу решают специальными обработками или программным кодом, который пересоздаёт объект с нужным идентификатором и переносит на него все ссылки. Ошибка здесь опасна: можно получить «битые» ссылки вида «Объект не найден» в документах, регистрах и отчётах.
Ниже разобрано, когда замена GUID действительно нужна, как подготовиться, как выполнить её обработкой и кодом, как проверить результат и какие ошибки встречаются чаще всего.
Когда замена GUID действительно нужна
Прежде чем что-то менять, убедитесь, что проблема именно в идентификаторе. Типичный признак — после обмена или восстановления базы внешняя система (другая база 1С, сайт, CRM) «не видит» объект, хотя он есть: при выгрузке создаётся дубль, а сопоставление по GUID не срабатывает. Вторая ситуация — в базе остались ссылки на удалённый объект, и вы точно знаете, каким GUID он обладал и какому существующему элементу соответствует.
Третий сценарий — объединение двух баз, где один и тот же контрагент или номенклатура существуют с разными GUID, а для корректной работы синхронизации их нужно свести к одному идентификатору. Во всех случаях логика одна: есть «правильный» GUID, который ждут другие системы или ссылки, и объект, которому этот GUID нужно присвоить.
Если же проблема в дублях элементов без привязки к внешним системам, замена GUID не обязательна — достаточно штатного поиска и удаления дублей с заменой ссылок. Менять идентификатор имеет смысл только тогда, когда конкретное значение GUID критично для обмена или восстановления связей.
Подготовка: копия, монопольный режим, исходные данные
Обязательный первый шаг — резервная копия базы. Для файлового режима достаточно скопировать файл 1Cv8.1CD при закрытых сеансах, для клиент-серверного — сделать выгрузку в dt или штатный бэкап СУБД. Замена GUID затрагивает ссылочную структуру, и откат без копии будет невозможен.
Второе условие — монопольный доступ. Попросите пользователей выйти, завершите фоновые задания и отключите регламентные операции обмена на время работы. Если во время переноса ссылок кто-то записывает документы, часть ссылок может остаться на старый объект или попасть в транзакцию с конфликтом.
Третье — зафиксируйте исходные данные: GUID, который нужно установить (его можно взять из внешней системы, из текста ошибки обмена или из ссылки вида «Объект не найден <...>»), и навигационную ссылку текущего объекта. Узнать GUID существующего элемента можно через его ссылку: в форме объекта скопируйте ссылку или используйте код Строка(Ссылка.УникальныйИдентификатор()).
Замена GUID с помощью обработки
Самый безопасный путь для администратора без навыков программирования — готовая внешняя обработка замены GUID. Такие обработки распространяются на профильных ресурсах для разработчиков 1С и работают по одному принципу: вы указываете объект-источник и целевой GUID, обработка создаёт объект с нужным идентификатором, переносит данные и либо перенаправляет ссылки, либо предлагает сделать это отдельным шагом.
Общий порядок работы с типовой обработкой выглядит так:
- 1Сделайте резервную копию и включите монопольный режим
- 2Откройте обработку через Файл → Открыть в режиме предприятия
- 3Выберите объект, которому нужно заменить GUID
- 4Укажите целевой GUID в поле нового идентификатора
- 5Запустите выполнение и дождитесь сообщения о результате
- 6Проверьте объект и связанные документы, затем проведите тестирование и исправление
Обратите внимание на формат ввода GUID: он должен строго соответствовать виду xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Если идентификатор скопирован из ссылки «Объект не найден», где GUID записан в перевёрнутом (обратном) порядке байтов, его нужно сначала преобразовать — многие обработки делают это автоматически, но проверьте результат.
После выполнения обработка обычно выводит отчёт: создан ли новый объект, сколько ссылок заменено, остался ли старый объект. Сохраните этот отчёт — он пригодится при проверке.
Замена GUID программным кодом
Если под рукой нет обработки или нужен контроль над каждым шагом, задачу решают кодом в конфигураторе (через обработку с кнопкой или консоль кода). Ключевой метод — УстановитьСсылкуНового(), который позволяет задать ссылку с нужным GUID до записи объекта.
// Старый объект, которому меняем GUID
СтараяСсылка = Справочники.Номенклатура.ПолучитьСсылку(
Новый УникальныйИдентификатор("старый-guid"));
// Создаём копию с новым GUID
НовыйОбъект = СтараяСсылка.Скопировать();
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(
Новый УникальныйИдентификатор("новый-guid"));
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект.Записать();
// Переносим все ссылки со старого на новый
МассивЗамен = Новый Массив;
МассивЗамен.Добавить(СтараяСсылка);
Найденные = НайтиПоСсылкам(МассивЗамен);
Для Каждого Строка Из Найденные Цикл
ОбъектДанных = Строка.Данные.ПолучитьОбъект();
// заменить ссылку в реквизите и записать
КонецЦикла;
// Удаляем старый объект
СтарыйОбъект = СтараяСсылка.ПолучитьОбъект();
СтарыйОбъект.Удалить();Несколько важных деталей. Во-первых, УстановитьСсылкуНового() нужно вызывать до записи объекта — после записи изменить ссылку нельзя. Во-вторых, копирование через Скопировать() переносит реквизиты и табличные части, но для документов стоит снимать проведение и переносить движения осознанно: часто проще записать новый документ непроведённым и провести его после замены ссылок.
В-третьих, для массовой замены ссылок удобнее использовать штатную процедуру из типовых конфигураций — в БСП есть функциональность замены ссылок (обработка «Поиск и удаление дублей» в режиме замены), которая корректно обходит все метаданные, включая регистры сведений и планы обмена. Самописный цикл через НайтиПоСсылкам() требует отдельной обработки регистров, где ссылка может быть измерением или ресурсом.
Перед массовой заменой ссылок полезно сначала выполнить НайтиПоСсылкам() и выгрузить результат в таблицу: так вы заранее увидите, в каких объектах и регистрах встречается старый GUID, и не пропустите регистры сведений с независимым режимом, где ссылка хранится в измерении.
Особые случаи: битые ссылки, дубли и планы обмена
Восстановление объекта по GUID из «битой» ссылки
Если в базе есть ссылки вида «Объект не найден», а вы знаете, какому элементу другой базы они соответствуют, задача обратная: создать объект с этим GUID. Метод тот же — ПолучитьСсылку(Новый УникальныйИдентификатор(guid)) плюс УстановитьСсылкуНового() на новом объекте. После записи все «битые» ссылки автоматически станут ссылаться на созданный элемент, потому что платформа идентифицирует объект именно по GUID.
Слияние дублей под одним GUID
Когда один и тот же контрагент существует в двух экземплярах с разными GUID, а внешняя система привязана к одному из них, сначала замените ссылки с «неправильного» дубля на «правильный» объект, удалите дубль, и только после этого, если нужно, меняйте GUID у оставшегося объекта. Менять GUID у обоих одновременно нельзя — идентификатор должен быть уникален в базе, попытка записать объект с уже существующим GUID завершится ошибкой.
Планы обмена и регистрация изменений
Если база участвует в обмене, помните: регистрация изменений в планах обмена привязана к ссылке. После замены GUID старая регистрация указывает на несуществующий объект, а новый объект не зарегистрирован к выгрузке. Зарегистрируйте новый объект в нужных узлах вручную (через «Зарегистрировать изменения» в плане обмена), иначе он не уйдёт в следующую выгрузку.
Как выбрать действие
Проверка результата
После замены убедитесь, что всё прошло корректно. Откройте объект и сверьте его GUID с целевым — например, через ссылку на объект или код Сообщить(Ссылка.УникальныйИдентификатор()). Затем откройте несколько документов и записей регистров, где раньше использовался старый объект: ссылки должны открывать новый элемент без сообщений «Объект не найден».
Следующий шаг — запустите «Тестирование и исправление» информационной базы в режиме проверки ссылочной целостности (без включения исправлений на первом проходе, чтобы увидеть список проблем). Завершите проверку тестовым обменом: выгрузите объект во внешнюю систему и убедитесь, что она сопоставила его со старой записью, а не создала дубль.
Как проверить результат
Совпадает с целевым идентификатором
Остался старый GUID или объект не открывается
Открываются, в поле отображается новый элемент
Надпись «Объект не найден» в полях ссылок
Ошибок ссылочной целостности нет
Найдены ссылки на несуществующие объекты
Объект сопоставляется, дубль не создаётся
При выгрузке появляется дубль или ошибка сопоставления
Типичные ошибки и ограничения
Есть и принципиальные ограничения. Нельзя поменять GUID «на месте» — только пересоздание объекта. Нельзя присвоить один GUID двум объектам. У предопределённых элементов замена GUID возможна, но требует аккуратности: привязка предопределённого имени идёт к элементу, и при пересоздании её нужно сохранить. Для документов дополнительно помните про нумерацию: новый объект получит номер при записи, и его стоит выставить вручную равным исходному.
Что важно запомнить
GUID не редактируется, а пересоздаётся: объект копируется с новым идентификатором, ссылки перенаправляются, старый удаляется. Работайте только после резервной копии, в монопольном режиме, с последующей проверкой ссылочной целостности и тестовым обменом.
Частые вопросы
Можно ли поменять GUID у объекта напрямую в SQL-базе?
Технически идентификатор хранится в таблицах СУБД, но править его напрямую запросами категорически не рекомендуется: GUID фигурирует во множестве таблиц, включая регистры и служебные структуры, и пропуск любой из них разрушит целостность. Кроме того, прямая правка данных в обход платформы нарушает условия поддержки. Используйте пересоздание объекта средствами встроенного языка.
Как узнать GUID объекта, если к базе есть только пользовательский доступ?
Откройте форму объекта и скопируйте ссылку через меню «Ещё → Получить ссылку» (в управляемых формах) — навигационная ссылка содержит GUID в конце. Либо выполните в консоли кода выражение Строка(Ссылка.УникальныйИдентификатор()) для нужного элемента.
Что делать, если GUID в ошибке обмена записан «задом наперёд»?
В ссылках «Объект не найден» и в некоторых сообщениях обмена идентификатор хранится в перевёрнутом порядке байтов. Его нужно преобразовать в стандартный вид перед использованием: переставить группы символов в обратном порядке по определённому правилу. Многие обработки восстановления ссылок делают это автоматически — ищите в них функцию «преобразовать GUID».
Пропадут ли движения документа при замене GUID?
Сами по себе движения хранятся в таблицах регистров с привязкой к ссылке регистратора. Если вы пересоздаёте документ с новым GUID, старые движения останутся привязанными к старой ссылке и станут «осиротевшими». Поэтому документы переносят с записью движений: либо копируют наборы записей программно, либо проводят новый документ заново после переноса ссылок.
Нужно ли менять GUID во всех базах, участвующих в обмене?
Нет. Достаточно привести GUID к единому значению там, где он отличается от эталонного. Обычно за эталон берут идентификатор из главной базы или из внешней системы, и замену выполняют только в тех узлах, где объект имеет другой GUID. После этого обмен начнёт сопоставлять объекты корректно.
Можно ли заменить GUID у предопределённого элемента справочника?
Можно, но с осторожностью: предопределённое имя привязано к элементу, и при пересоздании нужно убедиться, что привязка сохранилась (поле «ИмяПредопределенныхДанных»). После замены проверьте, что обращения к элементу через МенеджерСправочника.ИмяПредопределённого по-прежнему возвращают объект, а не пустую ссылку.