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