Для типовых решений большинство использует практику доработки поведения объектов с помощью подписок на события и доработки поведения форм с помощью переопределяемых модулей БСП. На этом не буду заострять внимание, положим, что вы так и реализуете доработки. Про переопределение в конфигурациях на БСП можно почитать, например, здесь.
Суть подхода в том, чтобы для каждого объекта или формы вынести все доработанные обработчики в отдельные общие модули, для каждого объекта/формы свой модуль.
Имя модуля конструируется по определенному шаблону, так чтобы по имени объекта или формы можно было программно получить модуль. Это позволит не привязываться к конкретным именам и типам в коде и все обработчики вызывать единообразно.
Для форм предлагается шаблон - ПрефиксКонфигурации_ТипМетаданных_ИмяМетаданных_Форма_ИмяФормы,
Например, для формы "Справочник.Номенклатура.Форма.ФормаЭлемента", имя модуля получится "мк_Справочник_Номенклатура_Форма_ФормаЭлемента".
Для объектов шаблон имени модуля - ПрефиксКонфигурации_ТипМетаданных_ИмяМетаданных
И тогда для справочника "Номенклатура", имя модуля будет "мк_Справочник_Номенклатура".
Вызов самих обработчиков событий объектов будет выполнятся через соответствующий обработчик подписки на событие, напимер для справочников это общий модуль мк_СобытияСправочников. Вызов обработчиков событий форм будет вызываться через соответствующие методы общего модуля мк_СобытияФорм, в этот модуль вызовы будут приходить из модуля МодификацияКонфигурацииПереопределяемый.
Схематично вызов для формы будет выглядеть так:
Ниже примеры кода для события справочника ПередЗаписью.
Общий обработчик объекта в модуле мк_СобытияСправочников:
Процедура ПередЗаписью(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Определение общего модуля объекта.
Модуль = ОбщийМодульОбъекта(Источник);
// Параметры обработчиков.
ПараметрыОбработчиков = ПараметрыОбработчиковОбъекта(Модуль);
Если ПараметрыОбработчиков.ПередЗаписью Тогда
Модуль.ПередЗаписью(Источник, Отказ);
КонецЕсли;
КонецПроцедуры
Метод определение общего модуля:
Функция ОбщийМодульОбъекта(Источник)
ТипИсточника = ТипЗнч(Источник);
ИмяОбъекта = Метаданные.НайтиПоТипу(ТипИсточника).ПолноеИмя();
Префикс = мк_ОбщегоНазначения.ПрефиксИмен();
ИмяОбъекта = СтрЗаменить(ИмяОбъекта, ".", "_");
ИмяМодуля = СтрШаблон("%1%2", Префикс, ИмяОбъекта);
Модуль = ОбщийМодуль(ИмяМодуля);
Возврат Модуль;
КонецФункции
Метод определение параметров обработчиков объекта, который определит конкретные обработчики в модуле объекта:
Функция ПараметрыОбработчиковОбъекта(Модуль)
ПараметрыОбработчиков = ПараметрыОбработчиковПоУмолчанию();
Если Модуль = Неопределено Тогда
Возврат ПараметрыОбработчиков;
КонецЕсли;
Модуль.ОпределитьПараметрыОбработчиков(ПараметрыОбработчиков);
Возврат ПараметрыОбработчиков;
КонецФункции
// Инициализирует набор параметров, задающих флаги выполнения обработчиков.
//
// Возвращаемое значение:
// Структура - Обработчики, переопределенные для объекта.
//
Функция ПараметрыОбработчиковПоУмолчанию()
ПараметрыОбработчиков = Новый Структура;
ПараметрыОбработчиков.Вставить("ПередЗаписью", Ложь);
ПараметрыОбработчиков.Вставить("ПриЗаписи", Ложь);
ПараметрыОбработчиков.Вставить("ПередУдалением", Ложь);
ПараметрыОбработчиков.Вставить("ОбработкаЗаполнения", Ложь);
ПараметрыОбработчиков.Вставить("ОбработкаПроверкиЗаполнения", Ложь);
ПараметрыОбработчиков.Вставить("ОбработкаПолученияПредставления", Ложь);
ПараметрыОбработчиков.Вставить("ОбработкаПолученияФормы", Ложь);
Возврат ПараметрыОбработчиков;
КонецФункции
Пример модуля модуля для справочника Номенклатура - мк_Справочник_Номенклатура
// Инициализирует набор параметров, задающих флаги выполнения обработчиков.
//
// Параметры:
// ПараметрыОбработчиков - Структура - Параметры обработчиков.
//
Процедура ОпределитьПараметрыОбработчиков(ПараметрыОбработчиков) Экспорт
ПараметрыОбработчиков.Вставить("ПередЗаписью", Истина);
КонецПроцедуры
// Процедура - обработчик подписки на событие "ПередЗаписью".
// См. "СправочникОбъект.ПередЗаписью" в синтакс-помощнике.
//
// Параметры:
// Источник - СправочникОбъект - Источник события.
// Отказ - Булево - Флаг отмены.
//
Процедура ПередЗаписью(Источник, Отказ) Экспорт
ЗаполнитьИдентификатовAD(Источник);
КонецПроцедуры
Какие преимущества дает такой подход:
- Простота подключения новых объектов и новых обработчиков.
- Код получается более лучше структурирован. Все доработки объекта/формы собраны в одном модуле, проще ориентироваться в коде.
- Уменьшение конфликтов при совместной разработке.
Требования
- Платформа 8.3.10 и выше.
- Библиотека стандартных подсистем 2.4 и выше
Установка
Установите расширение или скопируйте объекты себе в конфигурацию.
Представленный подход реализован в виде расширения, исходники https://github.com/Bazil1c/events-handlers-1c