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