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

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

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

Почему возникает необходимость переноса данных?

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

Метод 1: Классический программный перенос (через временные реквизиты)

Этот метод является самым безопасным и предсказуемым. Мы разберем по шагам алгоритм, который позволяет избежать конфликтов имен и гарантирует целостность ссылок.

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

Рассмотрим пример кода для обработки переноса данных в документе:


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

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

Метод 2: Использование SQL-запросов (для клиент-серверных версий)

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

Выясним структуру: при добавлении реквизитов в расширение 1С создает таблицу, связанную с основной таблицей по внутреннему идентификатору _IDRRef. Мы можем выполнить UPDATE, чтобы перелить данные из одной колонки в другую. Однако этот метод требует высочайшей квалификации администратора БД. После выполнения таких операций обязательно нужно запустить Тестирование и исправление в конфигураторе с включенной опцией «Пересчет итогов» и «Проверка логической целостности».

Метод 3: Перенос через XML (Универсальный обмен данными)

Для минимизации ручного кодинга проанализируем ситуацию с использованием обработки Универсальный обмен данными в формате XML. Этот способ хорош тем, что он автоматически обрабатывает ссылочные типы данных.

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

Особенности работы с формами

При переносе данных важно помнить о визуальной части. Часто разработчики заимствуют формы в расширение и «накидывают» туда элементы. Разберем, как поступить здесь:

Проанализируем ситуацию: Если форма в расширении содержит элементы, привязанные к удаляемым реквизитам расширения, после удаления реквизитов форма перестанет открываться (возникнет ошибка обращения к полю). Поэтому перед удалением объектов из расширения необходимо:

Рекомендации по безопасности процесса

Перенос данных из расширения — это процедура, связанная с риском безвозвратной потери информации. Выясним основные правила безопасности:

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

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

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

← На главную