Выполнение расчетов и отработка зависимых свойств
После установки значения любого свойства сущности, если нет запрета отработки зависимостей, вызывается обработчик события <имясвойства>ПослеИзменения.
В обработчике ПослеИзменения может быть использовано 2 альтернативы:
- Присваивание значений другим свойствам сущности, что вызывает запуск их обработчиков событий ПослеИзменения.
Чтобы избежать такой цепочки действий можно использовать 2-й способ
- Вызов общего метода расчета. В этом случае, в общем методе расчета инкасулируется установка всех зависимых свойств.
При сложных взаимосвязях между свойствами сущности рекомендуется использовать «Вызов общего метода расчета»
далее описывается его использование
В событий <имясвойства>ПослеИзменения используется вызов:
(сущность.ПеременныеМодуля 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(сущность.РасчетныйСчетКонтрагента.КонтрагентИД))) { // контрагент не заполнен или не соответствует контрагенту расчетного счета // присвается новый Контрагент из контрагента расчетного счета сущность.Контрагент = сущность.РасчетныйСчетКонтрагента.Контрагент; } }