Оптимизация расчетов Реквизитов
После установки значения любого свойства сущности, если нет запрета отработки зависимостей, вызывается обработчик события <имясвойства>ПослеИзменения.
В обработчике ПослеИзменения может быть использовано 2 альтернативы:
- Присваивание значений другим свойствам сущности, что в свою очередь вызывает их обработчики событий ПослеИзменения.
- Вызов общего метода расчета. В этом случае, в общем методе расчета производится установка всех зависимых свойств.
Поскольку помимо ручного (поочередного) ввода реквизитов сущности существуют режимы массового добавления и группового изменения сущностей, то необходимо принимать меры от многократного пересчета взаимных зависимостей реквизитов друг от друга. Для этого используются 2 способа:
1) Запрет отработки зависимостей. В этом случае все реквизиты, измененные при установленном свойстве сущность.ЗапретитьОтработкуЗависимостей не вызовут их методов ПослеИзменения.
заказ.ЗапретитьОтработкуЗависимостей = true; заказ.ФилиалИД = item.ФилиалИД; // без отработки событий После Изменения заказ.СтолЗаказовИД = item.СтолЗаказовИД; // без отработки событий После Изменения заказ.ЗапретитьОтработкуЗависимостей = false;
2) Временное откладывание (накопление) изменений реквизитов и последующее одноразовое выполнение накопленных изменений.
Включение режима накопления производится вызовом метода сущность.ОтложитьСобытияПослеИзменения(),
а выполнение отложенных событий - ХранимыйЭлемент.ВыполнитьОтложенныеСобытияПослеИзменения(сущность, Core.Enumerations.КогдаВыполнятьОбщийМетод.ПослеВсехСобытий)
В списке отложенных Событий (ПослеИзменения реквизитов) могут встретиться вызов как Общего так и Индивидуального метода. Индивидуальные методы выполняются в порядке присвоения Реквизитам значения (разработчик может управлять этой последовательностью), а вызов Общего метода управляется параметром Core.Enumerations.КогдаВыполнятьОбщийМетод, который может иметь 3 значения: 1) Каждый Раз 2) Первый Вызов - первый раз, когда встретился 3) После Всех Событий - один раз после всех индивидуальных Реквизитов.
Пример использования Отложенного выполнения событий:
var списокЗаказов = new List<УПДПродажи>(); var заказ = ХранимыйЭлемент.Создать<УПДПродажи>(); списокЗаказов.Add(заказ); заказ.ОтложитьСобытияПослеИзменения(); заказ.ПризнакТТН = false; // отложить событие После Изменения заказ.КонтрагентПодразделение = item.Грузополучатель; // отложить событие заказ.ЗапретитьОтработкуЗависимостей = true; заказ.ФилиалИД = item.ФилиалИД; // без отработки событий После Изменения заказ.СтолЗаказовИД = item.СтолЗаказовИД; // без отработки событий После Изменения заказ.ЗапретитьОтработкуЗависимостей = false; заказ.НомерПоставки = item.НомерПоставки; // отложить событие После Изменения ХранимыйЭлемент.ВыполнитьОтложенныеСобытияПослеИзменения(списокЗаказов,Core.Enumerations.КогдаВыполнятьОбщийМетод.ПослеВсехСобытий);