logo

Динамические формы задач БП: Сценарий при изменении элемента блока

Кроме факта изменения одного из элементов блока, может понадобиться работать и с конкретными полями внутри элемента. Для таких сценариев существует несколько отличий от остальных сценариев динамических форм.

При создании сценария для элемента блока появляется дополнительный объект item:

public virtual void Calculate (Context context, P_RabotaSBlokamiVScenarii_Nomenclature item, EleWise.ELMA.Model.Views.FormViewBuilder<P_RabotaSBlokamiVScenarii_Nomenclature> form)

Этот объект предназначен для работы с полями редактируемого элемента. Дело в том, что для общего контекста процесса изменения, происходящие на форме редактирования элемента ещё не сохранены, если обратиться к блоку через объект context – данные будут неактуальными.

Внимание!
Важно иметь в виду, что операции с самим элементом или его полями должны выполняться через объект item. Нарушение этого правила может привести к неожиданным ошибкам.

Также особенности сценариев на элементе блока не позволяют выполнять эти сценарии при редактировании элементов в табличном представлении.

Рассмотрим пример с двумя сценариями.

Данный код выполняется при редактировании блока (аналогично с предыдущим примером). Сценарий подсчитывает количество записей блока.

public virtual void CalculateCount (Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
        {
            context.Count = context.Nomenclature.Count;
         }

Следующий сценарий выполняется на форме редактирования элемента блока.

В рамках сценария решаются две задачи:

  1. Получение информации из справочника Курс валюты.
  2. Вычисление цены и запись её в поле Цена в рублях элемента блока Номенклатура.

Следует отметить, что для такого использования фильтра необходимо в объекте Курс валюты установить флажок Генерировать фильтр и выбрать поле Валюта. Для этого в разделе Объекты необходимо открыть карточку объекта Курс валюты и на вкладке Дополнительные установить флажок Генерировать фильтр, а в карточке свойства Валюта на вкладке Дополнительно – флажок Участвует в поиске (фильтре). После публикации изменений потребуется перезапуск сервера.

Пример сценария:

public virtual void Calculate (Context context, P_RabotaSBlokamiVScenarii_Nomenclature item, EleWise.ELMA.Model.Views.FormViewBuilder<P_RabotaSBlokamiVScenarii_Nomenclature> form)
        {
            var manager = EntityManager<ExchangeCurrencyRate>.Instance;
            var filter = InterfaceActivator.Create<ExchangeCurrencyRateFilter> ();
            filter.CurrencyEstimated = item.Currency;
            var result = manager.Find (filter, new FetchOptions (0, 1)).FirstOrDefault ();
            item.PriceRubles = result.ExchangeRate * item.Sum;
        }
Внимание!
При работе с элементами блока (item-ы) НЕ НУЖНО вызывать метод item.Save(), так как это может привести к нарушению целостности базы данных.

Результат работы сценария: