При сопровождении доработанных баз данных нередко возникает задача вернуть основную конфигурацию на полную поддержку поставщика, чтобы последующие обновления проходили безболезненно и в автоматическом режиме. Для этого все пользовательские доработки выносят в механизм расширений. Однако разработчики часто сталкиваются с ошибками: удаление исходного объекта ломает расширение, заимствованные формы тянут за собой половину метаданных, а методы модулей не срабатывают так, как ожидалось. Разберем по шагам правильную методологию обратного переноса доработок в расширение конфигурации.
Проанализируем главную причину ошибки «Объект не обнаружен в конфигурации», которая возникает при попытке вынести новый отчет или обработку в расширение с последующим удалением прототипа из основной конфигурации. Механизм заимствования привязывает объект расширения к уникальному внутреннему идентификатору (UUID) объекта основной базы. Если разработчик использует команду «Добавить в расширение», а затем удаляет прототип из основной конфигурации, связь разрывается и платформа выдает критическую ошибку применимости.
Для переноса полностью новых объектов метаданных (отчетов, обработок, общих модулей, ролей) необходимо создавать собственные объекты расширения, а не заимствовать их. Разберем правильный порядок переноса:
.erf или .epf).Если требуется изменить поведение существующего типового документа или справочника, логика работы строится исключительно на заимствовании. Выясним причину, почему при заимствовании формы модули объекта и формы в расширении оказываются пустыми. Платформа 1С использует механизм наложения: пустой модуль в расширении означает, что код выполняется полностью из базовой конфигурации. Заимствовать необходимо чистый, неизмененный объект конфигурации поставщика, а все свои доработки описывать в расширении специальными перехватчиками событий.
Рассмотрим подробнее механизм аннотаций для процедур и функций управляемых форм и модулей:
&Перед: вызывается перед выполнением типовой процедуры конфигурации.&После: вызывается после отработки базового алгоритма. Например, если нам нужно выполнить дополнительную проверку или вывести служебное сообщение при создании формы на сервере:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Наш доработанный алгоритм
СообщитьПользователю("Форма инициализирована с доработками расширения.");
КонецПроцедуры
&Вместо: полностью замещает типовой метод. Ее следует использовать с особой осторожностью, поскольку при обновлении типовой конфигурации критические изменения от поставщика не попадут в исполняемый код. Если необходимо сохранить типовую логику, используем оператор ПродолжитьВызов():
&Вместо("РассчитатьСкидку")
Функция Расш1_РассчитатьСкидку(СуммаДокумента)
// Модифицируем входной параметр
СкорректированнаяСумма = СуммаДокумента * 0.95;
// Вызываем оригинальный метод типовой конфигурации
Результат = ПродолжитьВызов(СкорректированнаяСумма);
Возврат Результат;
КонецФункции
&ИзменениеИКонтроль: позволяет модифицировать только определенную часть типовой процедуры через теги #Вставить и #Удалить. Главное преимущество этого метода заключается в автоматическом контроле: если поставщик при обновлении перепишет исходную процедуру, расширение выдаст предупреждение о несовместимости, предотвратив скрытую логическую ошибку в учете.При заимствовании типовой формы платформа автоматически подтягивает в расширение все метаданные, типы которых присутствуют в реквизитах формы (справочники контрагентов, договоров, номенклатуры, перечисления, общие картинки). Если оставить дерево расширения перегруженным, при каждом обновлении конфигурации повышается риск конфликта метаданных. Разберем по шагам, как корректно очистить расширение от лишних объектов:
Объект.Контрагент), его и связанный с ним справочник удалять нельзя, иначе поле потеряет составной тип и станет строковым.Если в доработанной конфигурации у типового справочника или документа была создана полностью новая нестандартная форма (например, форма дополнительного подбора), ее перенос нельзя выполнить простым заимствованием. Чтобы форма стала собственной формой расширения, выполним следующую цепочку действий:
Выясним причину, почему некоторые свойства объектов (например, флаг Использовать стандартные команды) не получается произвольно изменить в расширении. В платформе 1С разработчик не может вручную назначить произвольное системное свойство модифицируемым. Состав доступных для модификации свойств жестко предопределен платформой:
При выносе большого объема функционала частой ошибкой становится создание одного монолитного расширения на всю базу данных. Посмотрим, почему такой подход неэффективен: малейшее переименование типового реквизита поставщиком в одном документе приведет к блокировке и отказу в работе всего расширения целиком. Рекомендуется придерживаться следующих правил архитектуры:
.cfe через меню «Конфигурация — Расширения конфигурации — Сохранить конфигурацию в файл». При загрузке в однотипную рабочую базу важно помнить, что системные флаги «Безопасный режим» и «Защита от опасных действий» не сохраняются в файле и настраиваются администратором при подключении.