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

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

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

Постановка задачи и анализ рисков

Представим ситуацию: в типовой конфигурации «Управление торговлей 11.4» были добавлены собственные реквизиты в справочник Номенклатура и документ РеализацияТоваровУслуг. Наша задача — перенести эти данные в расширение, чтобы основная конфигурация полностью соответствовала релизу поставщика. Основной риск заключается в механизме реструктуризации базы данных. В СУБД (MS SQL Server или PostgreSQL) данные основной конфигурации и данные расширения хранятся в разных физических колонках, а иногда и в разных таблицах. Простое «перемещение» объекта в дереве метаданных невозможно.

Метод 1: Программный перенос через временные реквизиты в расширении

Этот метод считается наиболее надежным и рекомендуемым в сообществе 1С-разработчиков. Разберем его по шагам:

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

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Ссылка,
    |   Номенклатура.СрокГарантии КАК СтароеЗначение
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.СрокГарантии <> 0"; // Условие зависит от типа данных

Выборка = Запрос.Выполнить().Выбрать();

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

Метод 2: Использование типовых механизмов БСП (Дополнительные реквизиты)

Если вы хотите максимально «облегчить» конфигурацию и избежать проблем с будущими обновлениями, проанализируем ситуацию: действительно ли нам нужны реквизиты в самом объекте? Современные конфигурации на базе БСП (Библиотеки стандартных подсистем) предлагают механизм Дополнительных реквизитов и сведений.

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

Процесс переноса в этом случае потребует создания программного кода, который создаст записи в табличных частях объектов, основываясь на значениях ваших удаляемых реквизитов. Это более сложный путь с точки зрения написания запросов и отчетов (потребуются соединения с таблицами характеристик), но он самый «чистый» с точки зрения поддержки.

Технические нюансы: Режим совместимости и СУБД

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

Проанализируем критические моменты, упомянутые опытными разработчиками:

Метод 3: Сериализация в JSON или XML (Внешнее хранилище)

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

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

Пример структуры выгрузки:


// Пример структуры в JSON
[
    {"Ref": "550e8400-e29b-41d4-a716-446655440000", "Value": "24 месяца"},
    {"Ref": "670e8400-e29b-11d4-a716-446655440001", "Value": "12 месяцев"}
]

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

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

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

Подводя итог, можно сказать, что наиболее сбалансированным решением является Метод №1 с временными именами. Он позволяет контролировать перенос данных внутри самой платформы 1С, сохраняя целостность ссылок и типов данных без привлечения внешних инструментов.

← На главную