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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Почему возникает проблема разных идентификаторов при одинаковых именах

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

Внутренние идентификаторы сохраняются неизменными только в случаях, когда объекты переносятся путем объединения с файлом .cf или при штатном получении из хранилища конфигурации. Во всех остальных случаях (включая копирование через буфер обмена Ctrl+C / Ctrl+V) генерируется новый GUID.

Разница в алгоритмах сопоставления платформы 1С

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

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

Как же узнать эти внутренние идентификаторы? Штатно в интерфейсе Конфигуратора их не видно. Однако программно их можно получить, например, через функцию БСП ОбщегоНазначения.ИдентификаторОбъектаМетаданных(), которая возвращает ссылку с идентификатором.

Способ 1. Ручное сопоставление в окне объединения

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

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

Способ 2. Правка идентификаторов через выгрузку в XML (хак на уровне исходников)

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

  1. Выгрузите вашу текущую (проблемную) конфигурацию в файлы XML. Для этого используйте команду конфигуратора Выгрузить конфигурацию в файлы.
  2. Сделайте то же самое с эталонной конфигурацией .cf, выгрузив её в отдельную папку.
  3. Откройте папку с файлами проблемной конфигурации. Найдите XML-файлы тех справочников или документов, которые конфликтуют.
  4. Откройте эти файлы в любом текстовом редакторе (например, Notepad++). Вы увидите тег uuid, в котором записан внутренний идентификатор.
  5. Аккуратно замените старые идентификаторы на те, что используются в файлах эталонной конфигурации.
  6. Соберите конфигурацию обратно из файлов командой Загрузить конфигурацию из файлов.

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

Способ 3. Перенос данных (через Конвертацию данных)

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

В такой ситуации правильнее всего создать чистую (пустую) базу данных из эталонного .cf файла (например, отраслевой УТ, на которую вы планируете переход). Затем, используя правила обмена (созданные, например, в конфигурации Конвертация данных 2.1), перенесите все исторические справочники, остатки и документы из старой базы в новую. При обмене через правила система сопоставит объекты по заданным вами ключевым полям (коду, наименованию, артикулу) и корректно запишет их в новую структуру метаданных с правильными GUID.

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

← На главную