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