Skip to content

Commit

Permalink
Added reverse assignment (#88)
Browse files Browse the repository at this point in the history
Доработана установка параметров процедуры после выполнения подписок на события
  • Loading branch information
denisushakov authored Aug 5, 2024
1 parent 62d2383 commit 7805fb0
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 24 deletions.
52 changes: 40 additions & 12 deletions docs/ПодпискиНаСобытия.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,49 @@
# Подсистема "Подписки на события"

Подписки на события применяются для реализации дополнительной постобработки или проверок, которые активируются после определённых событий в типовых объектах или модулях менеджера.
В случае отстутствия типовой подписки, используется подсистема **"Подписки на события"**. Если нужно внести изменения в типовую логику работы подписки, используется заимствование методов в расширении с аннотацией &ИзменениеИКонтроль.
В случае отсутствия типовой подписки используется подсистема **"Подписки на события"**. Если нужно внести изменения в типовую логику работы подписки, используется заимствование методов в расширении с аннотацией &ИзменениеИКонтроль.

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

**Важно!**
- В одноимённых обработчиках событий необходимо после выполнения метода конфигурации делать обратное присвоение параметров из массива "ПараметрыМетода", так как они могут быть изменены в выполняемом методе.
- В обработчиках, указанных в подписках на события, реализован возврат параметра **Отказ** согласно концепции фирмы 1С. При необходимости ускорить работу и избежать выполнения кода при условии **Отказ = Истина**, добавьте проверку этого условия в место проверки **ОбменДанными.Загрузка**.
**Пример:**
```1C (BSL)
Процедура ПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.ОбменДанными.Загрузка Или Отказ Тогда
Возврат;
КонецЕсли;
КонецПроцедуры
```

Общая структура подписок на события:
- Для каждого класса **общий модуль** (пример: "пбп_ДокументыОбработчики")
- В каждом общем модуле распологаются процедуры-обработчики класса (пример: "пбп_ДокументыОбработкаПроведения", "пбп_СправочникиПриЗаписи")
- В области **СлужебныйПрограммныйИнтерфейс** добавляются одноименные процедуры (пример: "СписаниеБезналичныхДенежныхСредствПриЗаписи")
- В общем модуле **пбп_ОбщегоНазначенияПовтИсп** добавить в соответствие тип объекта и вызываемую процедуру в одноименной функции **(Указывать только имя процедуры!)**
**Пример обратного присвоения:**
```1C (BSL)
Процедура ПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// ...
ПараметрыМетода = Новый Массив;
ПараметрыМетода.Добавить(Источник);
ПараметрыМетода.Добавить(Отказ);
пбп_ОбщегоНазначенияСервер.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);
Источник = ПараметрыМетода[0];
Отказ = ПараметрыМетода[1];
// ...
КонецПроцедуры
```

Порядок действий при работе с подсистемой:
- Необходимо проверить, существует ли общая подписка на нужный тип объекта и событие. Например: **пбп_ДокументыОбработкаПроведения**, **пбп_СправочникиПриЗаписи** и так далее.
Недопускается смешение типов объектов и событий в одной подписке. Если подписки не существует, нужно её добавить, а так же общий модуль с аналогичным названием (напр. **пбп_ДокументыОбработчики** - и подписка, и общий модуль).
**Порядок действий при работе с подсистемой:**
- Необходимо проверить, существует ли общая подписка на нужный тип объекта и событие. Например: **ОбработкаПроведения**, **ПриЗаписи** и так далее.
**Важно!** Не допускается смешение типов объектов и событий в одной подписке. Если подписка не существует, нужно её создать, а так же добавить общий модуль с аналогичным названием (напр. **пбп_ДокументыПриЗаписи** - подписка, **пбп_ДокументыОбработкаСобытий** - общий модуль).
Добавить их в подсистему **пбп_ПодпискиНаСобытия**.
- Если создана новая подписка и модуль, то в модуле создается обработчик для подписки и выбрать его в подписке. У каждого события свой набор параметров.
- Структура общего модуля обработчиков:
- В области **СлужебныйПрограммныйИнтерфейс** располагать обработчики объектов, в ней располагаются подобласти по обработчикам. Допустимо добавлению произвольных областей внутри **СлужебныйПрограммныйИнтерфейс**, для группировки по подсистемам.
- В области **СлужебныйПрограммныйИнтерфейс** располагаются обработчики объектов. Внутри этой области могут быть подобласти по обработчикам. Допустимо добавлению произвольных областей внутри **СлужебныйПрограммныйИнтерфейс** для группировки по подсистемам.
```1C (BSL)
#Область ПрограммныйИнтерфейс
Expand Down Expand Up @@ -50,7 +78,7 @@
#КонецОбласти
```

**Пример обработчика общего модуля "пбп_ДокументыОбработчики":**
**Пример обработчика общего модуля "пбп_ДокументыОбработкаСобытий":**
```1C (BSL)
Процедура ПриЗаписи(Источник, Отказ) Экспорт
Expand All @@ -77,7 +105,7 @@
КонецПроцедуры
```

- В общем модуле **пбп_ОбщегоНазначенияПовтИсп** найти функцию с названием объекта и события и добавить в соответствие тип объекта и вызываемую процедуру **(Указывать только имя процедуры!)**. Если функции для данного набора нет, создать её, перед возвратом добавить вызов заранее созданной процедуры:
- В общем модуле **пбп_ОбщегоНазначенияПовтИсп** найдите функцию с названием объекта и события, и добавить в соответствие тип объекта и вызываемую процедуру **(Указывать только имя процедуры!)**. Если функции для данного набора нет, создать её, перед возвратом добавить вызов заранее созданной процедуры:

**Пример вызова процедуры для заполнения соответствия:**
```1C (BSL)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@

пбп_ОбщегоНазначенияСервер.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);

Источник = ПараметрыМетода[0];

Исключение
ВызватьИсключение СтрШаблон("%1%2Имя метода: %3", ОписаниеОшибки(), Символы.ПС, ИмяМетода);
КонецПопытки;
Expand Down Expand Up @@ -79,6 +81,9 @@
ПараметрыМетода.Добавить(ТекстЗаполнения);
ПараметрыМетода.Добавить(СтандартнаяОбработка);

Источник = ПараметрыМетода[0];
СтандартнаяОбработка = ПараметрыМетода[3];

пбп_ОбщегоНазначенияСервер.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);

Исключение
Expand All @@ -99,7 +104,7 @@
//
Процедура ПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

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

Expand All @@ -115,6 +120,11 @@

пбп_ОбщегоНазначенияСервер.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);

Источник = ПараметрыМетода[0];
Если ПараметрыМетода[1] Тогда
Отказ = Истина;
КонецЕсли;

Исключение
ВызватьИсключение СтрШаблон("%1%2Имя метода: %3", ОписаниеОшибки(), Символы.ПС, ИмяМетода);
КонецПопытки;
Expand All @@ -131,7 +141,7 @@
//
Процедура ПриЗаписи(Источник, Отказ) Экспорт

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

Expand All @@ -146,6 +156,10 @@

пбп_ОбщегоНазначенияСервер.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);

Если ПараметрыМетода[1] Тогда
Отказ = Истина;
КонецЕсли;

Исключение
ВызватьИсключение СтрШаблон("%1%2Имя метода: %3", ОписаниеОшибки(), Символы.ПС, ИмяМетода);
КонецПопытки;
Expand All @@ -154,7 +168,8 @@
КонецПроцедуры

// Возникает при проведении документа.
// Основное назначение процедуры-обработчика данного события - генерация движений по документу. Выполняется в транзакции записи.
// Основное назначение процедуры-обработчика данного события - генерация движений по документу.
// Выполняется в транзакции записи.
//
// Параметры:
// Источник - ДокументОбъект - Объект, обрабатываемый подпиской на события.
Expand All @@ -163,7 +178,7 @@
//
Процедура ОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт

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

Expand All @@ -179,6 +194,10 @@

пбп_ОбщегоНазначенияСервер.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);

Если ПараметрыМетода[1] Тогда
Отказ = Истина;
КонецЕсли;

Исключение
ВызватьИсключение СтрШаблон("%1%2Имя метода: %3", ОписаниеОшибки(), Символы.ПС, ИмяМетода);
КонецПопытки;
Expand All @@ -187,7 +206,8 @@
КонецПроцедуры

// Возникает при записи документа.
// Основное назначение процедуры-обработчика данного события - проверка правильности заполнения значений реквизитов объекта.
// Основное назначение процедуры-обработчика данного события -
// проверка правильности заполнения значений реквизитов объекта.
//
// Параметры:
// Источник - ДокументОбъект - Объект, обрабатываемый подпиской на события.
Expand All @@ -196,7 +216,7 @@
//
Процедура ОбработкаПроверкиЗаполнения(Источник, Отказ, ПроверяемыеРеквизиты) Экспорт

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

Expand All @@ -212,6 +232,11 @@

пбп_ОбщегоНазначенияСервер.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);

Если ПараметрыМетода[1] Тогда
Отказ = Истина;
КонецЕсли;
ПроверяемыеРеквизиты = ПараметрыМетода[2];

Исключение
ВызватьИсключение СтрШаблон("%1%2Имя метода: %3", ОписаниеОшибки(), Символы.ПС, ИмяМетода);
КонецПопытки;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
Процедура ПриДобавленииПодсистемы(Описание) Экспорт

Описание.Имя = "ПроектнаяБиблиотекаПодсистем";
Описание.Версия = "1.0.0.2";
Описание.Версия = "1.0.1.2";

// Требуется библиотека стандартных подсистем.
Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы");
Expand Down
Loading

0 comments on commit 7805fb0

Please sign in to comment.