Как изменить все идентификаторы объектов (GUID) в конфигураторе 1С и сохранить данные?

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

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

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

Понимание разницы между GUID метаданных и GUID данных

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

  1. GUID метаданных: Уникальный идентификатор самого типа данных (например, справочника Контрагенты или документа РеализацияТоваровУслуг). Этот идентификатор определяет, как будет называться физическая таблица в базе данных SQL (например, _Reference45 или _Document82).
  2. GUID данных: Уникальный идентификатор конкретной записи внутри таблицы (например, конкретного контрагента «ООО Вектор»). Эти ссылки хранятся в полях таблиц СУБД и связывают документы со справочниками.

Наша цель — полностью переписать GUID метаданных (что повлечет за собой переименование всех таблиц в SQL), но при этом бережно перенести GUID самих данных, чтобы все внутренние ссылки в документах, регистрах и реквизитах остались рабочими.

Рассмотрим подробнее четыре основных метода решения этой задачи.

Метод 1: Детальный алгоритм через выгрузку конфигурации в XML-файлы

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

Выполним следующие шаги:

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

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

Метод 2: Перенос данных с помощью конфигурации «Конвертация данных 2.1» (КД)

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

Решением является использование мощного инструмента Конвертация данных 2.1. Разберем этот процесс по шагам:

  1. Выгрузите структуру метаданных исходной конфигурации (с помощью обработки MD83Exp.epf).
  2. Выгрузите структуру метаданных новой конфигурации (с измененными GUID).
  3. Загрузите обе структуры в базу «Конвертация данных 2.1» в качестве Источника и Приемника.
  4. Создайте новые правила обмена. Так как имена объектов метаданных (например, Справочник.Контрагенты, Документ.ПоступлениеТоваровУслуг) в обеих базах совпадают, воспользуйтесь автоматическим созданием правил обмена. Сопоставление будет выполнено по наименованию.
  5. Критически важная настройка: В правилах конвертации объектов (ПКО) для каждого переносимого объекта обязательно установите флаг «Искать объект приемника по внутреннему идентификатору объекта источника».

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

Метод 3: Перенос данных «на месте» (для больших баз)

Если ваша информационная база имеет внушительный объем (сотни гигабайт или терабайты), то выгрузка и загрузка через XML-файлы займет слишком много времени и потребует колоссальных аппаратных ресурсов. В такой ситуации применим альтернативный метод «временного переименования» непосредственно в рабочей базе данных.

Проанализируем этот сценарий:

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

Посмотрим на пример кода, который выполняет такой перенос для справочника:


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

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

Метод 4: Прямая подмена на уровне СУБД (для СУБД MS SQL или PostgreSQL)

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

Для оптимизации этого процесса специалисты прибегают к следующему алгоритму:

  1. Запускают обновление конфигурации в режиме «1С:Предприятие». Платформа создает новые пустые таблицы под новыми именами (например, вместо _Reference12 создается _Reference34).
  2. С помощью SQL-скриптов администратор переименовывает существующие таблицы со старыми именами, давая им имена новых таблиц, предварительно удалив новые пустые таблицы.
  3. Корректируется служебная таблица платформы DBSchema, хранящая бинарное описание соответствия объектов метаданных 1С и физических таблиц SQL.

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

Критически важный шаг: Очистка и обновление справочника БСП

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

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

Чтобы избежать этого, выполните следующие действия сразу после загрузки новой конфигурации с измененными GUID:

  1. Запустите информационную базу в режиме «1С:Предприятие» из командной строки с параметром:
    
    ИсполняемыйФайл1С.exe ENTERPRISE /F "ПутьКБазе" /C ЗапуститОбновлениеИнформационнойБазы
    
  2. Если запуск в обычном режиме невозможен из-за ошибок, воспользуйтесь специализированной внешней обработкой «Обновление вспомогательных данных» (входит в состав дистрибутива БСП).
  3. Программно инициируйте обновление справочника идентификаторов с помощью вызова метода БСП.

Рассмотрим пример кода для принудительного обновления идентификаторов метаданных БСП:


// Принудительное обновление справочника идентификаторов объектов метаданных
Попытка
    Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(Истина, Ложь);
    ЗаписьЖурналаРегистрации("ОбновлениеМетаданных", УровеньЖурналаРегистрации.Информация, , , "Справочник идентификаторов БСП успешно обновлен под новые GUID.");
Исключение
    ЗаписьЖурналаРегистрации("ОбновлениеМетаданных", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка обновления идентификаторов БСП: " + ОписаниеОшибки());
КонецПопытки;

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

Подводя итог, можно утверждать, что задача полной смены внутренних идентификаторов объектов в конфигураторе 1С с сохранением данных вполне решаема. Выбор конкретного метода зависит от объемов вашей базы данных и уровня вашей технической подготовки. Использование Конвертации данных гарантирует максимальную безопасность процесса, в то время как манипуляции с XML-файлами конфигурации позволяют провести глубокую деассоциацию структуры метаданных.

← На главную