Рано или поздно многие разработчики сталкиваются с ситуацией, когда механизм расширений начинает «капризничать». Это может быть связано с критическим ростом объема доработок, конфликтами при коллективной разработке или специфическими багами платформы (особенно часто это проявлялось на версиях 8.3.12). Когда принято решение «избавиться» от расширения и вернуть код в основную конфигурацию, важно сделать это структурно, чтобы не потерять данные пользователей и не нарушить целостность базы данных. В этой статье мы подробно разберем методику «свертывания» расширения.
Перед тем как приступать к активным действиям, проанализируем текущую ситуацию. Основная сложность заключается в том, что 1С не предоставляет штатной кнопки «Объединить расширение с основной конфигурацией». Нам придется действовать комбинированным методом: ручной перенос метаданных, программный перенос данных и использование механизмов сравнения/объединения.
Важное предостережение: Расширения хранят данные своих реквизитов в отдельных таблицах базы данных (в SQL они имеют префиксы). Если вы просто удалите расширение, все данные, накопленные в его полях, будут безвозвратно удалены. Поэтому первым шагом мы должны создать структуру в основной конфигурации, а вторым — перелить в нее данные.
Рассмотрим процесс переноса объектов. Если в расширении созданы новые справочники, документы или реквизиты у типовых объектов, нам необходимо повторить эту структуру в основной конфигурации.
.cf. Затем создадим пустую базу, загрузим в нее этот .cf как основную конфигурацию. Теперь из нашей рабочей базы мы можем запустить «Сравнение и объединение» с этой новой базой. Это позволит нам отметить галочками нужные объекты и перенести их структуру, не перебивая всё «ручками» с нуля.Выясним, как не потерять данные. Пока расширение еще подключено, а в основной конфигурации уже созданы аналогичные реквизиты (но с другими именами, например, ИмяРеквизита_Осн), нам нужно написать обработку, которая скопирует значения.
Пример логики для переноса данных в справочнике:
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектОсн = Выборка.ПолучитьОбъект();
// Предположим, 'ДопКонтакт' - реквизит расширения, а 'ДопКонтакт_Новый' - основной конфигурации
ОбъектОсн.ДопКонтакт_Новый = ОбъектОсн.ДопКонтакт;
ОбъектОсн.ОбменДанными.Загрузка = Истина;
ОбъектОсн.Записать();
КонецЦикла;
Только после того, как мы убедились, что данные успешно перенесены в новые поля основной конфигурации, можно планировать удаление расширения.
Проанализируем методы перехвата событий в расширении. Если вы использовали аннотации &Вместо, &Перед или &После, при переносе в основную конфигурацию рекомендуется изменить подход:
ПередЗаписью, создайте в основной конфигурации ПодпискаНаСобытие, вынесите логику в общий модуль. Это упростит будущие обновления от вендора.МодификацияКонфигурацииПереопределяемый. Это позволит программно добавлять кнопки и элементы управления при создании формы на сервере.Рассмотрим пример реализации через подписку на событие, чтобы не править модуль объекта напрямую:
// В общем модуле (серверном)
Процедура ПриЗаписиОбъектаДляПереноса(Источник, Отказ) Экспорт
// Источник - это наш документ или справочник
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Ваша логика, которая раньше была в расширении
КонецПроцедуры
Посмотрим на ситуацию, описанную в Сообщении 12. Иногда при удалении реквизитов расширения система выдает ошибку уникальности индексов или ошибку SDBL: Некорректное использование LOCAL/GLOBAL в SET GENERATION.
Разберем алгоритм решения, если система «спотыкается» при реструктуризации:
8.3.12.1616, крайне рекомендуется обновиться. В ранних релизах 12-й ветки механизмы очистки таблиц расширений работали нестабильно.Не забудем про важный нюанс: права доступа. Объекты в расширении могли иметь свои роли или быть добавлены в заимствованные. При переносе объектов в основную конфигурацию они автоматически не попадут в типовые роли (например, «Пользователь»).
Нам необходимо:
Отказ от расширения — трудоемкий процесс, требующий внимательности к данным. Мы проанализировали основные риски и выяснили, что ключ к успеху лежит в последовательности: структура -> перенос данных -> перенос кода -> очистка расширения.
Старайтесь минимизировать использование прямой правки модулей объектов в пользу подписок на события. Это позволит вам сохранить конфигурацию максимально близкой к типовой, что существенно облегчит жизнь при следующем обновлении на новые релизы ERP или Бухгалтерии.