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

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

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

Анализ стратегии: что переносить, а что оставить?

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

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

Если же вы все же решили выполнить полный перенос, разберем, как сделать это программно.

Использование механизмов БСП для миграции данных

Для конфигураций на базе БСП (включая ERP) наиболее «цивилизованным» способом является использование подсистемы обновления конфигурации. Вместо написания разовой обработки, которую нужно запускать вручную, мы можем интегрировать код миграции прямо в расширение. Рассмотрим, как зарегистрировать обработчик обновления внутри расширения.

В модуле объекта расширения или в специальном общем модуле необходимо перехватить событие ПриДобавленииОбработчиковОбновления. Это позволит системе автоматически запустить ваш код при первом запуске после установки расширения.


Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
    НовыйОбработчик = Обработчики.Добавить();
    НовыйОбработчик.Версия = "1.0.0.1"; // Версия вашего расширения
    НовыйОбработчик.Процедура = "МойПрефикс_МиграцияДанных.ВыполнитьПереносВРасширение";
    НовыйОбработчик.РежимВыполнения = "Отложенно"; // Или "Монопольно"
    НовыйОбработчик.Комментарий = НСтр("ru = 'Перенос данных из основной конфигурации в расширение'");
КонецПроцедуры

Обеспечение целостности в закрытых периодах

Один из главных вопросов: не «поедут» ли данные в закрытых периодах при программной записи? Если вы просто будете использовать метод Записать(), система может инициировать стандартные проверки, расчеты итогов или даже вызвать ошибку доступа. Чтобы этого избежать, при записи данных в новые объекты расширения крайне важно использовать свойство ОбменДанными.Загрузка.

Проанализируем пример кода для переноса записей регистра сведений:


Процедура ВыполнитьПереносВРасширение() Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ * ИЗ РегистрСведений.Удалить_МойРегистр";
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        МенеджерЗаписи = РегистрыСведений.МойРегистрВРасширении.СоздатьМенеджерЗаписи();
        ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка);
        
        // Важнейшая настройка для сохранения закрытых периодов
        МенеджерЗаписи.ОбменДанными.Загрузка = Истина;
        
        Попытка
            МенеджерЗаписи.Записать();
        Исключение
            ЗаписьЖурналаРегистрации("ПереносДанных", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

Использование ОбменДанными.Загрузка = Истина отключает большинство проверок в модулях наборов записей и позволяет записывать данные без изменения состояния документов-регистраторов, что критически важно для ERP.

Проблема идентификаторов (GUID) при переносе ссылочных типов

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

Разберем, как с этим работать:

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

Алгоритм безопасного удаления старых объектов

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

  1. Переименование: Добавьте префикс Удалить... ко всем старым объектам и реквизитам в основной конфигурации.
  2. Миграция: Запустите обработку переноса данных в новые объекты расширения.
  3. Верификация: Выполните сверку итогов. Для регистров накопления сравните остатки и обороты, для регистров сведений — количество записей и контрольные суммы по ключевым полям.
  4. Тестовый период: Пройдите как минимум один цикл закрытия месяца на копии базы, используя только новые объекты из расширения.
  5. Окончательное удаление: Только убедившись, что всё работает корректно и данные в безопасности, удаляйте старые объекты из основной конфигурации при следующем обновлении.

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

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

← На главную