Как правильно перенести объекты и данные из основной конфигурации в расширение 1С?

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

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

В чем заключается главная техническая сложность?

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

Способ 1: Использование универсальной обработки «Выгрузка и загрузка данных XML»

Этот метод считается одним из самых простых и эффективных для разового переноса. Основное преимущество обработки заключается в том, что она ориентируется на имена объектов метаданных. Рассмотрим пошаговый алгоритм работы:

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

Способ 2: Программный перенос с сохранением GUID

Если объектов много или структура сложная, мы можем написать небольшую обработку. Главное правило: чтобы ссылки в документах не «побились», новый объект в расширении должен иметь точно такой же УникальныйИдентификатор, как и старый. Разберем пример кода для переноса данных справочника:


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

Использование метода УстановитьСсылкуНового() является критически важным. Именно он гарантирует, что во всех существующих документах, регистрах и других объектах, где использовалась ссылка на этот справочник, она останется рабочей.

Способ 3: Использование «Конвертации данных 2.1»

Для переноса сложных структур, таких как регистры сведений или документы с движениями, лучше всего подходит «Конвертация данных». Проанализируем преимущества этого подхода:

Особенности переноса регистров и движений

Перенос регистров — самая трудоемкая часть процесса. Если мы переносим документ-регистратор в расширение, нам необходимо обеспечить корректность его движений. Рассмотрим ситуацию: если регистр остается в основной конфигурации, а документ уходит в расширение, необходимо проверить, разрешено ли в расширении изменять этот регистр. Если же и регистр переносится в расширение, данные в нем придется восстанавливать отдельно. Процедура Записать() для набора записей с установленным свойством ОбменДанными.Загрузка = Истина поможет перенести данные без лишних проверок и пересчетов итогов.

Работа с предопределенными данными

Выясним причину возможных проблем с предопределенными элементами. При переносе в расширение они могут потерять связь с метаданными. Рекомендуется следующий порядок: после загрузки данных XML или программного переноса, необходимо зайти в конфигуратор расширения и убедиться, что имена предопределенных элементов совпадают. В некоторых случаях может потребоваться использование метода УстановитьПредопределенныйУзел() (для планов обмена) или ручная привязка имен через обработку, если ссылки «отвязались» от своих имен в метаданных.

Рекомендованный план действий (чек-лист)

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

  1. Подготовка: Создайте идентичную структуру объектов в расширении.
  2. Префиксы: Переименуйте объекты в основной базе, добавив префикс Удалить_.
  3. Реструктуризация: Обновите базу в режиме конфигуратора. Это создаст новые таблицы SQL.
  4. Миграция: Выполните перенос данных выбранным способом (XML, КД или обработка).
  5. Верификация: Запустите тестирование и исправление информационной базы, проверьте логическую целостность.
  6. Контрольный период: Не удаляйте объекты с префиксом Удалить_ сразу. Оставьте их на несколько недель, чтобы убедиться, что все отчеты и обработки работают корректно с новыми объектами из расширения.

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

← На главную