Как в скрипте карточки редактирования получить значение поля

Работаю в BPM. Создал раздел, назовем New, и все к нему(NewEditPage и т.д.). В нем помимо унаследованных важна колонка Account - справочник Контрагентов (а в карточке редактирования поле EditAccount). А в контрагенте создал колонку NewFlag, которая должна определять есть ли контрагент в разделе New. (Задача максимум)Так вот хотелось бы, чтобы при добавлении записи в New, в которой указан контрагент, в контрагенте менялся NewFlag на true, при удалении на false, а при изменении NewFlag "старого" контрагента менялся на false, "нового" на true.(Задача минимум) Для начала работы хотелось бы узнать как получить в скрипте значение поля в карточке редактирование, т.е. отклонение к предыдущей задаче это ID контрагента, выбранного в поле EditAccount.

Нравится

9 комментариев

С помощь техподдержки задача минимум решена функцией Page.AccountEdit.Value.ToString()
Если есть предложения по задаче максимум, прошу.

Правильнее будет получать значение из Page.DataSource.ActiveRow.GetTypedColumnValue("AccountId"). Если Вы унаследовались от базовой страницы редактирования.
Мне не нравится идея хранить признак использования контрагента где-то в самом контрагенте. Лучше было бы в том месте, где вы хотите этот флаг использовать, определять фигурирует ли этот контрагент где-то. Например, если Вам нужно в какой-то момент отобразить контрагентов, у которых NewFlag = false, то можно просто наложить фильтр not exists на таблицу New.

"Раловец Ольга" написал: Например, если Вам нужно в какой-то момент отобразить контрагентов, у которых NewFlag = false

Что-то типа того. Мне нужно, чтобы в поле AccountEdit я мог выбрать тех контрагентов, которых нет в New.

"Раловец Ольга" написал:то можно просто наложить фильтр not exists на таблицу New.

А можно узнать поподробнее про то, как создавать фильтры? можете ли вы привести пример(желательно по моей ситуации)?

Вот пример, как получить контрагентов, которые не указаны в таблице New c помощью EntitySchemQuery:

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Account");
esq.PrimaryQueryColumn.IsAlwaysSelect = true;
esq.AddAllColumns();
var filterGroup = new EntitySchemaQueryFilterCollection(esq, LogicalOperationStrict.And);
filterGroup.IsNot = true;
filterGroup.Add(esq.CreateFilter(FilterComparisonType.Equal, "[New:Account].Account.Id", esq.CreateSchemaColumnExpression("Id")));
esq.Filters.Add(filterGroup);
var accounts = esq.GetEntityCollection(UserConnection); 

Решение с фильтром действительно лучше, сразу пропадает разветвление на добавить, удалить и изменить.
Но как его привязать к полю AccountEdit? Это делается в карточке редактирования, процессе Init?

Здравствуйте, Александр.

Уточните, пожалуйста, что Вы имеете ввиду под "привязкой" фильтра к полю? Вы хотите чтобы в окне выбора значений для этого поля, показывались лишь те контрагенты, которые отсутствуют в разделе New?

Да, именно так.

Совсем забыл. Компилятор ругается на esq.AddAllColumns();

'Terrasoft.Core.Entities.EntitySchemaQuery' does not contain a definition for 'AddAllColumns' and no extension method 'AddAllColumns' accepting a first argument of type 'Terrasoft.Core.Entities.EntitySchemaQuery' could be found (are you missing a using directive or an assembly reference?)

Добавлять все по одной или может достаточно Id?

Метод называется AddAllSchemaColumns, но Вам из этого всего для поля нужен только фильтр. Я точно не помню, но пример можно посмотреть в странице контакта/контрагента, как в зависимости от выбранной страны фильтруются города. Событие контрола, в котором нужно накладывать фильтр называется PrepareLookupFilters или как-то похоже. Обработчики этих событий могут быть зарегистрированы где-то на Init или PageLoad. Все, что нужно сделать, это по аналогии с представленным примером, передать необходимые фильтры в виде Dictionary.

Показать все комментарии