Изменятся ли идентификаторы (GUID) объектов базы данных при загрузке идентичной конфигурации из файла?

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

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

В таких ситуациях возникает соблазн решить проблему радикально — использовать операцию «Загрузить конфигурацию из файла» (загрузка файла .cf). Однако здесь кроется серьезный страх любого разработчика: не «слетят» ли при этой операции уникальные идентификаторы (GUID) уже существующих в базе объектов? Не приведет ли это к катастрофическому задвоению элементов справочников или документов при последующем обмене данными через обработку ВыгрузкаЗагрузкаДанныхXML? Рассмотрим эти вопросы подробно и разберем глубинные механизмы работы платформы «1С:Предприятие».

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

---

Три типа уникальных идентификаторов (GUID/UUID) в платформе 1С

В среде 1С термин «идентификатор» или «ГУИД» может относиться к совершенно разным сущностям. Выясним разницу между ними:

  1. Идентификаторы объектов метаданных (Metadata UUID) — это внутренние GUID, которые платформа присваивает самим классам объектов в дереве конфигурации. Свой уникальный UUID имеет справочник Справочник.Номенклатура, документ Документ.РеализацияТоваровУслуг, любой их реквизит, табличная часть или даже общий модуль. Эти идентификаторы жестко определяют физическую структуру таблиц базы данных в СУБД (например, имена таблиц вида _Reference15 или полей _Fld123 привязываются именно к этим UUID).
  2. Идентификаторы ссылочных данных (Ref UUID / GUID ссылки) — это уникальные GUID конкретных записей в таблицах базы данных (например, конкретной папки «Товары», контрагента «ООО Ромашка» или конкретной накладной). Именно эти идентификаторы используются при поиске объектов во время обмена данными через специализированные XML-обработки.
  3. Идентификаторы предопределенных элементов — это GUID, которые связывают конкретный элемент данных в базе с описанием предопределенного элемента в конфигураторе.

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

---

Прямой ответ на вопрос автора: изменятся ли GUID объектов базы данных?

Если база-приемник была изначально получена путем копирования базы-источника (файловым копированием, разворачиванием бэкапа СУБД или через выгрузку/загрузку файла .dt), то нет, GUID существующих объектов базы данных (Ref UUID) при загрузке конфигурации из файла не изменятся. На них эта операция никак не влияет.

Стандартная обработка ВыгрузкаЗагрузкаДанныхXML работает исключительно с Ref UUID (идентификаторами ссылочных данных). Метаданные (структура таблиц) ее напрямую не интересуют. Если в обеих базах физические элементы данных имеют одинаковые GUID, то при повторной загрузке никакого задвоения объектов не произойдет — платформа просто перезапишет существующие объекты актуальными данными.

Однако здесь кроется критически важный нюанс, который необходимо проанализировать, чтобы избежать полной потери данных.

---

Смертельная опасность операции «Загрузить конфигурацию из файла»

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

Посмотрим на пример из практики автора темы. Он вручную создал общий модуль в Базе 2, а затем вручную создал точно такой же общий модуль в Базе 1. Поскольку объекты создавались вручную в разных базах, платформа присвоила им разные Metadata UUID, несмотря на идентичные имена и программный код. Поскольку это был общий модуль (который не хранит данные в таблицах СУБД), последующая загрузка .cf-файла прошла успешно и безболезненно. Платформа просто заменила один модуль на другой.

Но что произошло бы, если бы разработчик вручную создал в двух базах справочник или документ?

Если бы UUID метаданных разошлись у объектов, хранящих информацию (например, у справочника Номенклатура), сценарий развивался бы следующим образом:

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

Поэтому использовать операцию «Загрузить конфигурацию из файла» можно только в том случае, если вы абсолютно уверены, что UUID всех объектов метаданных, хранящих данные, в обеих базах идентичны. Если есть сомнения, безопаснее использовать режим «Сравнить и объединить с конфигурацией из файла».

---

Почему сравнение конфигураций идет так медленно?

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

После того как конфигурация была полностью загружена из файла .cf, UUID метаданных синхронизировались. Именно поэтому при повторном запуске сравнение стало отрабатывать за 5 секунд вместо прежних 6 минут.

---

Как получить GUID ссылки программно

Для понимания того, как платформа работает со ссылочными данными, полезно уметь программно извлекать и анализировать уникальные идентификаторы объектов. Напишем небольшой пример кода, демонстрирующий получение GUID ссылки:


// Пример получения Уникального Идентификатора (Ref UUID) конкретного элемента
СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", "00-000123");

Если Не СсылкаНаОбъект.Пустая() Тогда
    // Получаем объект типа УникальныйИдентификатор
    УникальныйИдДанных = СсылкаНаОбъект.УникальныйИдентификатор();
    
    // Выводим строковое представление GUID в формате XML (36 символов)
    Сообщить("Уникальный идентификатор ссылки (Ref UUID): " + Строка(УникальныйИдДанных));
КонецЕсли;

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

---

Как профессионально выравнивать UUID метаданных без потери данных

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

Способ 1. Выгрузка конфигурации в XML-файлы (рекомендуемый современный метод)

Начиная с платформы 8.3, разработчикам доступен мощный инструмент выгрузки конфигурации в текстовые файлы. Разберем этот процесс по шагам:

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

Способ 2. Метод временного переименования объектов

Если объем данных небольшой, можно воспользоваться классическим приемом обхода ограничений платформы:

  1. В Базе 2 переименуйте проблемный объект метаданных (например, справочник Контрагенты переименуйте в Удалить_Контрагенты).
  2. Через операцию «Сравнить и объединить» перенесите справочник Контрагенты с правильным UUID из эталонной конфигурации Базы 1. Примените изменения. У вас в базе образуется две таблицы: старая с данными (под префиксом Удалить_) и новая пустая (с верным UUID).
  3. Напишите простую обработку, которая перенесет данные из старой таблицы в новую. Критически важно при записи новых элементов принудительно устанавливать старый GUID ссылки, чтобы не нарушить связи в документах и регистрах:
    
    НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
    // Устанавливаем тот же самый GUID ссылки, который был в старой таблице
    НовыйЭлемент.УстановитьСсылкуНового(Справочники.Контрагенты.ПолучитьСсылку(СтарыйGUID));
    ЗаполнитьЗначенияСвойств(НовыйЭлемент, СтарыйОбъект);
    НовыйЭлемент.Записать();
    
  4. После успешного переноса данных удалите объект с префиксом Удалить_ из конфигурации.

Способ 3. Полное резервное копирование данных через XML

Этот метод подходит для небольших и средних по размеру баз данных:

  1. С помощью обработки ВыгрузкаЗагрузкаДанныхXML полностью выгрузите все данные проблемных объектов из Базы 2 во внешний файл.
  2. Выполните операцию «Загрузить конфигурацию из файла», согласившись с тем, что данные проблемных справочников/документов будут потеряны при реструктуризации.
  3. Загрузите сохраненные данные обратно из XML-файла. Поскольку обработка сохраняет оригинальные Ref GUID ссылок, все связи, проводки и движения документов в информационной базе автоматически восстановятся.

Таким образом, мы выяснили, что сама по себе загрузка идентичной конфигурации из файла безопасна для GUID объектов данных, если структуры метаданных изначально были синхронизированы. В противном случае всегда используйте описанные выше профессиональные методики обхода рассинхронизации UUID метаданных.

← На главную