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

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

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

Почему данные не «подхватываются» автоматически?

Разберем техническую сторону вопроса. Когда мы добавляем реквизит в расширение, 1С не использует существующее поле в таблице базы данных. Вместо этого платформа создает отдельную таблицу (физически в SQL это выглядит как таблица с суффиксом расширения), которая связана с основной таблицей документа по его внутреннему идентификатору (UUID). Именно поэтому, если вы просто удалите реквизит из основной конфигурации и создадите идентичный в расширении, система увидит пустое поле. Старая колонка в SQL-таблице будет уничтожена вместе со всеми данными при выполнении реструктуризации.

Шаг 1. Анализ зависимостей

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

  1. Прямые обращения к реквизиту в программных модулях (модули объекта, менеджера, формы).
  2. Использование в запросах.
  3. Вывод реквизита в формы списков и журналы (динамические списки).
  4. Использование в правилах обмена или интеграциях.

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

Шаг 2. Подготовка метаданных (Безопасный алгоритм)

Чтобы не потерять данные за прошлые периоды (например, с 2014 года), применим методику «мягкого» переноса. Рассмотрим последовательность действий:

  1. Переименование: В основной конфигурации переименовываем наш реквизит, например, из КонтрольБухгалтера в Удалить_КонтрольБухгалтера. Это позволит нам сохранить данные при обновлении базы, но при этом освободит «красивое» имя для расширения.
  2. Создание в расширении: Добавляем документ в расширение и создаем в нем реквизит с исходным именем КонтрольБухгалтера.
  3. Применение изменений: Выполняем сохранение и обновление конфигурации базы данных (F7). На этом этапе в базе данных будут существовать одновременно две колонки: старая (с данными) и новая (пустая).

Шаг 3. Программный перенос данных

Теперь нам необходимо написать обработку, которая скопирует значения из старого реквизита в новый. Проанализируем пример кода, который позволяет сделать это максимально быстро и безопасно. Главным инструментом здесь выступает свойство ОбменДанными.Загрузка = Истина.

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


ВидыОбъектовДляИзменения = Новый Массив;
ВидыОбъектовДляИзменения.Добавить("Документ.ТребованиеНакладная");

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

Выясним причину использования ОбменДанными.Загрузка = Истина. Этот флаг сообщает системе, что объект записывается в режиме интеграции. В типовых конфигурациях (БП, ERP, УТ) это отключает:

Шаг 4. Финализация

После того как мы убедились, что данные успешно перенесены (можно проверить простым запросом или через консоль запросов), выполняем завершающие действия:

  1. Удаляем реквизит Удалить_КонтрольБухгалтера из основной конфигурации.
  2. Исправляем все ссылки на этот реквизит в коде основной конфигурации, заменяя их на вызовы через расширение (или перенося соответствующие процедуры в само расширение).
  3. Обновляем конфигурацию базы данных.

Альтернативный вариант: Дополнительные сведения

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

Преимущества этого подхода:

В этом случае в расширении мы будем только считывать значение из регистра сведений ДополнительныеСведения при открытии формы и устанавливать свойство ТолькоПросмотр для всей формы.

Важные замечания по правам доступа

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

  1. Создать новую роль в расширении.
  2. Установить права на Чтение и Просмотр (а также Изменение и Редактирование, если нужно) для данного реквизита.
  3. Назначить эту роль пользователям через профили групп доступа.

Таким образом, мы разобрали полный цикл безопасного переноса данных. Главное правило — никогда не удаляйте реквизит до того, как его копия в расширении будет наполнена данными и проверена в работе.

← На главную