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