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