Как перенести справочники и реквизиты из одного расширения в другое без потери данных?

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

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

Проблема внутренних идентификаторов (UUID)

Прежде чем переходить к действиям, выясним причину, по которой обычное копирование объектов (Ctrl+C / Ctrl+V) не позволяет перенести данные. У каждого объекта метаданных в 1С (справочника, документа, реквизита) есть скрытый от пользователя уникальный идентификатор (UUID). Именно по нему платформа сопоставляет объект в конфигурации с таблицей или колонкой в базе данных SQL.

Когда мы создаем дубликат объекта в новом расширении, ему присваивается новый UUID. С точки зрения системы — это совершенно другой объект, даже если его имя полностью совпадает со старым. Поэтому при удалении старого расширения таблицы в БД уничтожаются, а новые остаются пустыми. При попытке же объединить два расширения, где объекты создавались копированием, часто возникает ошибка: "Обнаружено пересечение внутренних идентификаторов". В таких ситуациях может потребоваться ручное сравнение и замена GUID (UUID) объектов в XML-выгрузках конфигураций. Это происходит потому, что платформа видит конфликт структур, претендующих на одно и то же пространство имен или данных.

Метод 1: Архитектурно правильный подход (перенос в основную конфигурацию)

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

Проанализируем преимущества этого метода:

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

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

Метод 2: Синхронизация через выгрузку в XML-файлы ("Напильник")

Если добавление объектов в основную конфигурацию по каким-то причинам невозможно или нежелательно, воспользуемся методом ручной синхронизации идентификаторов. Нам нужно заставить новое расширение "думать", что его объекты — это те же самые объекты из старого расширения.

Разберем процесс по шагам:

  1. Выгрузим оба расширения в файлы через меню Конфигурация — Выгрузить конфигурацию в файлы. Для более удобной работы с файлами cfe можно использовать распаковщик конфигураций В8АнПак.
  2. Откроем папку выгрузки первого (исходного) расширения. Нам нужно найти XML-файл интересующего нас объекта (например, Catalogs/СвойСправочник.xml).
  3. Внутри XML-структуры найдем строку с идентификатором uuid. Скопируем это значение.
  4. Откроем папку выгрузки второго (целевого) расширения и найдем там аналогичный файл. Заменим его uuid на скопированный.
  5. Важно также проверить файл Configuration.xml в корне выгрузки, где регистрируются все объекты расширения. Идентификаторы там должны совпадать с идентификаторами в файлах объектов.
  6. Загрузим измененное расширение обратно через Конфигурация — Загрузить конфигурацию из файлов.

После такой манипуляции платформа признает объекты идентичными, и данные "подцепятся" автоматически, так как SQL-имя таблицы завязано на UUID.

Метод 3: Использование универсальной обработки выгрузки и загрузки данных

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

  1. В целевом расширении создадим структуру объектов (справочники, реквизиты) идентичную исходному расширению (можно простым копипастом).
  2. Запустим обработку в режиме выгрузки. Выберем объекты из старого расширения.
  3. В режиме загрузки в этой же базе укажем файл выгрузки. Внимание: так как UUID объектов различаются, обычная загрузка может создать дубли или выдать ошибку. В настройках обработки необходимо включить опцию "Использовать поля поиска для сопоставления объектов" (например, искать по Коду или Наименованию для справочников).
  4. После успешной проверки загруженных данных старое расширение можно удалять.

Пример кода для программного переноса данных между реквизитами (если вы решили создать новые реквизиты программно):


Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    Объект = Выборка.ПолучитьОбъект();
    // Предположим, переносим данные из СтарыйРеквизит в НовыйРеквизит
    Объект.НовыйРеквизит = Объект.СтарыйРеквизит;
    Объект.ОбменДанными.Загрузка = Истина;
    Объект.Записать();
КонецЦикла;

Метод 4: Работа в среде разработки EDT (Enterprise Development Tools)

Проанализируем возможности современной среды разработки `EDT` (Enterprise Development Tools). В отличие от классического конфигуратора, рефакторинг и перенос объектов между расширениями в EDT реализован гораздо нагляднее:

Подведение итогов и рекомендации

Выясним, какой метод лучше выбрать в зависимости от ситуации:

  1. Если база крупная (ERP, КА) и данные критически важны — Метод 1 (Основная конфигурация). Это сэкономит массу времени в будущем.
  2. Если нужно быстро объединить два небольших расширения "здесь и сейчас" — Метод 2 (Правка файлов).
  3. Если вы опасаетесь лезть во внутреннюю структуру XML — Метод 3 (Выгрузка/загрузка данных).

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

← На главную