Как изменить уникальные идентификаторы (GUID) метаданных и объектов данных в 1С:Предприятии?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике администрирования и разработки на платформе 1С:Предприятие 8 возникают специфические задачи, требующие кардинального вмешательства в структуру базы данных. Одной из таких сложных задач является полная смена уникальных идентификаторов (GUID / UUID). Причины для этого могут быть разными: от необходимости «развести» распределенные базы, которые были созданы некорректным копированием, до обхода жестких привязок сторонних систем лицензирования к конкретным GUID метаданных.

Прежде чем переходить к практическим вариантам решения, давайте четко разделим эти идентификаторы на два принципиально разных типа, так как на практике их часто путают:

  1. Внутренние идентификаторы объектов метаданных в конфигураторе — это уникальные GUID, которые платформа присваивает самим классам объектов (например, конкретному справочнику Справочник.Номенклатура или документу Документ.РеализацияТоваровУслуг).
  2. Уникальные идентификаторы конкретных объектов данных (ссылок) — это GUID/UUID конкретных записей в таблицах базы данных (например, ссылка на конкретный товар «Карандаш» или на документ продажи №10 от 01.01.2024).

Ниже мы подробно разберем, как решать обе эти задачи с сохранением работоспособности информационной базы и самих данных.

---

Часть 1. Смена и исправление идентификаторов метаданных (в Конфигураторе)

Если нам необходимо изменить внутренние GUID самих объектов метаданных, обычное изменение имени или структуры в Конфигураторе не поможет — платформа сохраняет старый идентификатор. Рассмотрим основные рабочие сценарии изменения GUID метаданных.

Метод 1. Сравнение и объединение конфигураций (классический способ)

Этот способ упоминается на форумах как самый простой, но он требует аккуратности, так как напрямую связан с потерей ссылочной целостности данных, если выполнять его в лоб.

Разберем алгоритм по шагам:

  1. Выгружаем конфигурацию исходной базы в файл (.cf) через меню Конфигурация -> Сохранить конфигурацию в файл....
  2. Создаем абсолютно новую, пустую информационную базу 1С.
  3. Открываем новую базу в Конфигураторе и выполняем не загрузку конфигурации, а именно сравнение и объединение: меню Конфигурация -> Сравнить, объединить с конфигурацией из файла..., указав наш сохраненный файл .cf.
  4. При объединении платформа создаст новые объекты метаданных. При этом их структура и программный код будут идентичны исходным, но все внутренние GUID метаданных сгенерируются заново.
  5. Сохраняем и обновляем конфигурацию новой базы (клавиша F7).

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

Метод 2. Выгрузка конфигурации в файлы XML (штатный современный механизм)

В современной платформе 1С:Предприятие 8.3 доступен мощный механизм выгрузки всей структуры конфигурации в текстовые файлы XML/JSON. Это позволяет нам точечно изменить GUID метаданных с помощью автозамены.

Выполним следующие действия:

  1. В Конфигураторе исходной базы выбираем пункт меню Конфигурация -> Выгрузить конфигурацию в файлы... и указываем пустую папку на диске.
  2. Платформа сформирует иерархическую структуру файлов, где каждый справочник, документ, реквизит или форма будут представлены в виде отдельных XML-файлов. Все их GUID будут прописаны в этих файлах в явном текстовом виде.
  3. Используя сторонний текстовый редактор (например, VS Code или Notepad++) или написав скрипт на языке Python, выполняем замену старых GUID метаданных на новые во всех файлах выгрузки.
  4. В новой пустой базе открываем Конфигуратор и выбираем Конфигурация -> Загрузить конфигурацию из файлов..., указав путь к нашей измененной папке.

Этот способ незаменим, когда требуется изменить идентификаторы только у некоторых объектов метаданных, не затрагивая остальные.

Метод 3. Использование среды разработки EDT (Enterprise Development Tools)

Если вы ведете разработку в современной среде 1С:EDT, задача упрощается. Проект в EDT изначально хранится в виде файлов на диске. Вы можете использовать встроенные инструменты рефакторинга, глобального поиска и автозамены для выравнивания и изменения GUID метаданных. После изменений проект легко импортируется обратно в информационную базу 1С.

Внимание: Особенности баз на БСП (Библиотека стандартных подсистем)

Если ваша конфигурация построена на БСП (а это практически все типовые конфигурации 1С: Бухгалтерия, ERP, УТ, ЗУП), то после изменения GUID метаданных вы обязательно столкнетесь с ошибками прав доступа, ролей или работы интерфейса. БСП кэширует структуру метаданных в специальном справочнике Идентификаторы объектов метаданных.

Чтобы восстановить работоспособность системы после изменения GUID метаданных, необходимо запустить обновление этого справочника. Для этого запустите сеанс 1С:Предприятие из командной строки с параметром:

1cv8.exe ENTERPRISE /F "ПутьКБазе" /C ЗапуститьОбновлениеИнформационнойБазы

Или воспользуйтесь типовой административной обработкой «Обновление справочника Идентификаторы объектов метаданных» в пользовательском режиме.

---

Часть 2. Изменение GUID конкретных объектов данных (в информационной базе)

Теперь рассмотрим ситуацию, когда конфигурация остается неизменной, но нам нужно изменить уникальные идентификаторы (ссылки) конкретных элементов данных (контрагентов, номенклатуры, документов) непосредственно в самой информационной базе.

Метод 1. Обработка XML-выгрузки (универсальный, но ресурсоемкий способ)

Этот метод основан на использовании стандартной обработки «Выгрузка и загрузка данных XML» (поставляется на ИТС под именем UploadToXML).

Алгоритм решения выглядит следующим образом:

  1. Выгружаем все необходимые данные из исходной базы в XML-файл с помощью обработки «Выгрузка и загрузка данных XML». Получаем большой текстовый файл.
  2. Пишем обработку на 1С (или используем скрипт на любом другом языке программирования), которая считывает этот файл и выполняет следующие действия:
    • Находит все уникальные UUID (строки определенного формата, например, 550e8400-e29b-41d4-a716-446655440000).
    • Составляет таблицу соответствия: «Старый UUID» — «Новый UUID» (генерируем новый UUID для каждого уникального старого значения).
    • Выполняет контекстную замену всех старых UUID на новые по всему файлу XML. Очень важно заменить GUID не только в объявлении самого объекта, но и во всех ссылках на него (в реквизитах других документов, движениях регистров и т.д.).
  3. Загружаем полученный модифицированный XML-файл в новую пустую базу с помощью той же обработки «Выгрузка и загрузка данных XML». Для последующего контроля результатов и автоматического поиска расхождений в проводках после миграции можно запустить программу для автоматической сверки проводок между базами 1С.

Плюсы: Полная независимость от СУБД, переносятся абсолютно все связи.

Минусы: Обработка больших файлов XML (объемом в несколько гигабайт) потребует колоссального объема оперативной памяти и времени.

Метод 2. Использование конфигурации «Конвертация данных 2.0»

Если нам нужно перенести данные с генерацией новых GUID более цивилизованным способом, лучшим инструментом будет «1С:Конвертация данных 2.0». Для этой задачи можно использовать обработку для автоматического отключения поиска по GUID у объектов конвертации.

Разберем, как настроить правила обмена:

  1. Создаем правила обмена между исходной и новой базами (поскольку конфигурации одинаковые, структура метаданных полностью совпадет).
  2. В правилах конвертации объектов (ПКО) для каждого справочника и документа снимаем флаг «Искать объект по уникальному идентификатору». Для точечной миграции элементов без использования Конвертации данных сопоставление по реквизитам вместо ссылок можно выполнить с помощью обработки переноса данных между похожими конфигурациями 1С, которая позволяет настраивать произвольные поля поиска.
  3. Вместо этого настраиваем поиск по ключевым полям (например, для номенклатуры — по реквизитам «Код» или «Артикул», для контрагентов — по «ИНН» и «КПП», для документов — по «Номер» и «Дата»).
  4. При выгрузке и последующей загрузке данных через обработку V8Exman.epf (Универсальный обмен данными в формате XML) платформа не будет использовать старые GUID. Если объект с такими ключевыми полями не найден в приемнике, платформа создаст новый объект с абсолютно новым, случайно сгенерированным GUID.

Метод 3. Программный метод с использованием УстановитьСсылкуНового()

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

Для этого используется метод УстановитьСсылкуНового(). Разберем пример кода для справочника:


Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    
    СтараяСсылка = Выборка.Ссылка;
    
    // Создаем новый уникальный идентификатор
    НовыйGUID = Новый УникальныйИдентификатор();
    НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(НовыйGUID);
    
    // Создаем дубликат объекта
    НовыйОбъект = Выборка.Скопировать();
    
    // Указываем платформе, что объект должен записаться с новой ссылкой
    НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
    НовыйОбъект.Записать();
    
    // Находим все упоминания старой ссылки в базе данных и заменяем их
    ТаблицаСсылок = НайтиПоСсылкам(Новый Массив(СтараяСсылка));
    Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл
        // Здесь пишем код замены старой ссылки на НоваяСсылка в найденных объектах
        // (реквизиты документов, записи регистров сведений и накопления)
    КонецЦикла;
    
    // Удаляем старый объект
    СтарыйОбъект = СтараяСсылка.ПолучитьОбъект();
    Если СтарыйОбъект <> Неопределено Тогда
        СтарыйОбъект.Удалить();
    КонецЕсли;
    
КонецЦикла;

Предупреждение: Этот метод требует написания сложного кода для обхода всех движений регистров и реквизитов, иначе в базе данных останутся «битые» ссылки (объекты с пометкой <Объект не найден>).

Метод 4. Прямая замена GUID на уровне СУБД (SQL)

Для клиент-серверных баз данных (MS SQL Server, PostgreSQL) существует возможность прямого обновления идентификаторов через SQL-запросы. Этот метод является самым быстрым, но и самым опасным.

В базах данных 1С ссылки хранятся в бинарном формате binary(16) (в полях с окончанием _IDRRef). Обратите внимание на важный технический нюанс: 1С хранит GUID в SQL-таблицах со смещением байтов (разница в порядке байтов — endianness). То есть строковый GUID из 1С не равен напрямую бинарному значению в SQL.

Для выполнения этой операции специалисты пишут транзакционные SQL-скрипты, которые:

  1. Отключают индексы и ограничения внешних ключей.
  2. Обновляют поле идентификатора (например, _IDRRef в таблице справочника номенклатуры _Reference15).
  3. Каскадно обновляют все поля во всех связанных таблицах базы данных (табличные части, движения регистров), где использовался этот идентификатор.
  4. После выполнения скрипта обязательно требуется полная очистка кэша сервера приложений 1С и кэша клиентов, иначе система продолжит обращаться к старым адресам в памяти.

Важно: Любая ошибка в SQL-скрипте гарантированно приведет к разрушению базы данных. Выполняйте такие операции исключительно на копиях базы и только при наличии опыта работы с СУБД на низком уровне!

---

Резюме и рекомендации

Подводя итог, можно дать следующие рекомендации по выбору инструмента:

← На главную