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

15.03.22

Разработка - Универсальные функции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

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

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

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

 

Требования

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

Установка

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

 

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

Вступайте в нашу телеграмм-группу Инфостарт

Обработчики адаптация подписки переопределяемый

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    5663    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    10339    DeerCven    15    

64

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    61789    dimanich70    86    

176

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8446    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    77628    atdonya    31    

75

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    10831    ke.92@mail.ru    18    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Cmapnep 20 16.03.22 09:46 Сейчас в теме
В методе ОбщийМодульОбъекта() используется поиск по метаданным
Для каждой открываемой формы это лишняя нагрузка
Метод лучше вынести в отдельный модуль с повторным использованием
2. Bazil 560 17.03.22 14:21 Сейчас в теме
(1) Да, пожалуй, так лучше.
Для отправки сообщения требуется регистрация/авторизация