Каталог решений - Структурирование доработок обработчиков событий объектов и форм

Структурирование доработок обработчиков событий объектов и форм

Структурирование доработок обработчиков событий объектов и форм

В наличии

В статье описан подход структурирования доработок обработчиков объектов и форм.

Категория:

Описание

Для типовых решений большинство использует практику доработки поведения объектов с помощью подписок на события и доработки поведения форм с помощью переопределяемых модулей БСП. На этом не буду заострять внимание, положим, что вы так и реализуете доработки. Про переопределение в конфигурациях на БСП можно почитать, например, здесь.

Суть подхода в том, чтобы для каждого объекта или формы вынести все доработанные  обработчики в отдельные общие модули, для каждого объекта/формы свой модуль.
Имя модуля конструируется по определенному шаблону, так чтобы по имени объекта или формы можно было программно получить модуль. Это позволит не привязываться к конкретным именам и типам в коде и все обработчики вызывать единообразно.

Для форм предлагается шаблон — ПрефиксКонфигурации_ТипМетаданных_ИмяМетаданных_Форма_ИмяФормы,

Например, для формы "Справочник.Номенклатура.Форма.ФормаЭлемента", имя модуля получится "мк_Справочник_Номенклатура_Форма_ФормаЭлемента".

Для объектов шаблон имени модуля — ПрефиксКонфигурации_ТипМетаданных_ИмяМетаданных

И тогда для справочника "Номенклатура", имя модуля будет "мк_Справочник_Номенклатура".

Вызов самих обработчиков событий объектов будет выполнятся через соответствующий обработчик подписки на событие, напимер для справочников это общий модуль мк_СобытияСправочников. Вызов обработчиков событий форм будет вызываться через соответствующие методы общего модуля  мк_СобытияФорм, в этот модуль вызовы будут приходить из модуля МодификацияКонфигурацииПереопределяемый.

Схематично вызов для формы будет выглядеть так:

Ниже примеры кода для события справочника ПередЗаписью.

Общий обработчик объекта в модуле мк_СобытияСправочников: 

Процедура ПередЗаписью(Источник, Отказ) Экспорт

    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // Определение общего модуля объекта.
    Модуль = ОбщийМодульОбъекта(Источник);

    // Параметры обработчиков.
    ПараметрыОбработчиков = ПараметрыОбработчиковОбъекта(Модуль);

    Если ПараметрыОбработчиков.ПередЗаписью Тогда
        Модуль.ПередЗаписью(Источник, Отказ);   
    КонецЕсли;  

КонецПроцедуры

Метод определение общего модуля:

Функция ОбщийМодульОбъекта(Источник)
	
	ТипИсточника = ТипЗнч(Источник);
	
	ИмяОбъекта = Метаданные.НайтиПоТипу(ТипИсточника).ПолноеИмя();
	Префикс = мк_ОбщегоНазначения.ПрефиксИмен();
	ИмяОбъекта = СтрЗаменить(ИмяОбъекта, ".", "_");
	ИмяМодуля = СтрШаблон("%1%2", Префикс, ИмяОбъекта);
	
	Модуль = ОбщийМодуль(ИмяМодуля);
	
	Возврат Модуль;

КонецФункции 

Метод определение параметров обработчиков объекта, который определит конкретные обработчики в модуле объекта:

Функция ПараметрыОбработчиковОбъекта(Модуль)

	ПараметрыОбработчиков = ПараметрыОбработчиковПоУмолчанию();
	
	Если Модуль = Неопределено Тогда
		Возврат ПараметрыОбработчиков;
	КонецЕсли;	
		
	Модуль.ОпределитьПараметрыОбработчиков(ПараметрыОбработчиков);
	
	Возврат ПараметрыОбработчиков; 

КонецФункции

// Инициализирует набор параметров, задающих флаги выполнения обработчиков.
//
// Возвращаемое значение:
//   Структура   - Обработчики, переопределенные для объекта.
//
Функция ПараметрыОбработчиковПоУмолчанию()
	
	ПараметрыОбработчиков = Новый Структура;
	
	ПараметрыОбработчиков.Вставить("ПередЗаписью", Ложь);
	ПараметрыОбработчиков.Вставить("ПриЗаписи", Ложь);
	
	ПараметрыОбработчиков.Вставить("ПередУдалением", Ложь);
	
	ПараметрыОбработчиков.Вставить("ОбработкаЗаполнения", Ложь);
	ПараметрыОбработчиков.Вставить("ОбработкаПроверкиЗаполнения", Ложь);
	
	ПараметрыОбработчиков.Вставить("ОбработкаПолученияПредставления", Ложь);
	ПараметрыОбработчиков.Вставить("ОбработкаПолученияФормы", Ложь);

	Возврат ПараметрыОбработчиков;

КонецФункции

 

Пример модуля модуля для справочника Номенклатура —  мк_Справочник_Номенклатура

// Инициализирует набор параметров, задающих флаги выполнения обработчиков.
//
// Параметры:
//  ПараметрыОбработчиков	 - Структура - Параметры обработчиков.
//
Процедура ОпределитьПараметрыОбработчиков(ПараметрыОбработчиков) Экспорт

	ПараметрыОбработчиков.Вставить("ПередЗаписью", Истина);

КонецПроцедуры

// Процедура - обработчик подписки на событие "ПередЗаписью".
//	См. "СправочникОбъект.ПередЗаписью" в синтакс-помощнике.
//
// Параметры:
//  Источник  - СправочникОбъект - Источник события.
//  Отказ  - Булево - Флаг отмены.
//
Процедура ПередЗаписью(Источник, Отказ) Экспорт
	
	ЗаполнитьИдентификатовAD(Источник);

КонецПроцедуры

 

Какие преимущества дает такой подход:

— Простота подключения новых объектов и новых обработчиков.

— Код получается более лучше структурирован. Все доработки объекта/формы собраны в одном модуле, проще ориентироваться в коде.

— Уменьшение конфликтов при совместной разработке.

 

Требования

  • Платформа 8.3.10 и выше.
  • Библиотека стандартных подсистем 2.4 и выше

Установка

    Установите расширение или скопируйте объекты себе в конфигурацию.

     

    Представленный подход реализован в виде расширения, исходники https://github.com/Bazil1c/events-handlers-1c

    has been added to your cart:
    Оформление заказа