Выполнение расчетов и отработка зависимых свойств

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

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

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

  1. Присваивание значений другим свойствам сущности, что вызывает запуск их обработчиков событий ПослеИзменения.
Чтобы избежать такой цепочки действий можно использовать 2-й способ
  1. Вызов общего метода расчета. В этом случае, в общем методе расчета инкасулируется установка всех зависимых свойств.

При сложных взаимосвязях между свойствами сущности рекомендуется использовать «Вызов общего метода расчета»

далее описывается его использование

В событий <имясвойства>ПослеИзменения используется вызов:

(сущность.ПеременныеМодуля as ОбщиеМетодыМодуля).(сущность, имяСвойства, староеЗначение, новоеЗначение, типОперации = 0, пользовательскиеДанные = null)

или

(сущность.ПеременныеМодуля as ОбщиеМетодыМодуля).ОбщийМетодРасчета(сущность, описаниеСвойств, типОперации = 0, пользовательскиеДанные = null);

,где
IEnumerable<ОписаниеСвойства> описаниеСвойств — список предустановленных свойств для выполнения расчетов;
типОперации и пользовательскиеДанные — факультативные параметры для передачи в общий метод расчета

Общий метод расчета находится в классе

public partial class <#типсущности>ОбщиеДанныеМодуля : ОбщиеМетодыМодуля,  <#тип>ПеременныеМодуля
{
      protected override void ОбщийМетодРасчета( IХранимыйЭлемент элемент,    	
         int типОперации = 0,object пользовательскиеДанные = null)
        {
             var сущность =  элемент as <#тип>;
             var описаниеСвойств = сущность.УстановленныеСвойства;
        }
}

,где
<#типсущности> - тип элемента;
<#тип> - тип интерфейса элемента;
элемент - текущая сущность;
описаниеСвойств – описание ранее установленных свойств, от которых необходимо выполнить зависимости;
типОперации – факультативный тип операции;
пользовательскиеДанные – факультативные данные пользователя

В теле общего метода, на основе ранее установленных свойств из переменной описаниеСвойств, выполняется установка зависимых свойств.

Для проверки, что свойство установлено (Изменено) или не установлено (Не Изменено) ранее, используется синтаксис:

описаниеСвойств.Наличие(() => сущность.<имясвойсва>) или
описаниеСвойств.Отсутствие(() => сущность.<имясвойсва>)

Например:

- для проверки, что свойство  РасчетныйСчетКонтрагента установлено (Изменено):
описаниеСвойств.Наличие(() => сущность.РасчетныйСчетКонтрагента);
- для проверки, что свойство Контрагент не установлено (НЕ Изменено):
описаниеСвойств.Отсутствие(() => сущность.Контрагент);

Можно проверить установлены или нет все свойства из списка:

Например:

описаниеСвойств.Наличие(() => сущность.РасчетныйСчетКонтрагента, () => сущность.Договор); или
описаниеСвойств.Отсутствие(() => сущность.РасчетныйСчетКонтрагента, () => сущность.Договор);

или установку (не установку), хотя бы одного из нескольких свойств:

Например:

описаниеСвойств.НаличиеНекоторых(() => сущность.РасчетныйСчетКонтрагента, () => сущность.Договор); или
описаниеСвойств.ОтсутствиеНекоторых(() => сущность.РасчетныйСчетКонтрагента, () => сущность.Договор); 

Если значение свойства не установлено, а значение свойства, влияющего на него присвоено, выполняется определение значения зависимого свойства

Пример из общего метода расчета в шаблоне IШаблонСКонтрагентом:

 // установка контрагента на основе расчетного счета
 if (// нет предустановленного свойства Контрагент
     описаниеСвойств.Отсутствие(() => сущность.Контрагент)
     &&
     // есть предустановленное свойства РасчетныйСчетКонтрагента
     описаниеСвойств.Наличие(() => сущность.РасчетныйСчетКонтрагента) && сущность.РасчетныйСчетКонтрагента != null)
    {
       if (сущность.КонтрагентИД == null || (сущность.РасчетныйСчетКонтрагента.КонтрагентИД != null && !сущность.КонтрагентИД.Equals(сущность.РасчетныйСчетКонтрагента.КонтрагентИД)))
       {
         // контрагент не заполнен или не соответствует контрагенту расчетного счета
         // присвается новый Контрагент из контрагента расчетного счета
         сущность.Контрагент = сущность.РасчетныйСчетКонтрагента.Контрагент;
       }
    }

Смотрите также

Образцы кода и элементов Конфигурации