Оптимизация расчетов Реквизитов

Материал из Fabius NET DEV
Перейти к: навигация, поиск

После установки значения любого свойства сущности, если нет запрета отработки зависимостей, вызывается обработчик события <имясвойства>ПослеИзменения.

В обработчике ПослеИзменения может быть использовано 2 альтернативы:

  1. Присваивание значений другим свойствам сущности, что в свою очередь вызывает их обработчики событий ПослеИзменения.
  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.КогдаВыполнятьОбщийМетод.ПослеВсехСобытий);