Использование действия "открытие окна" для выбора контрагента с определенным типом.
Здравствуйте!
Интересует есть-ли возможность для действия "Открытие окна" настроенного вот так:
добавить фильтрацию по полую "Тип"?
Если да, то как это можно сделать?
Нравится
Здравствуйте, Геннадий.
Проверьте, существует ли у Вас в сервисе sq_Account фильтр по типу (AccountTypeID). В случае если такого нету - добавьте параметр AccountTypeID типа уникальный идентификатор, а также фильтр сравнения, где tbl_Account.AccountTypeID = :AccountTypeID
Далее, на событии OnBeforeExecute, получите нужный Вам датасет и примените фильтр:
ApplyDatasetFilter(Dataset, 'AccountTypeID', AccountTypeID, true);
где вместо AccountTypeID (без кавычек) подставить значение нужного Вам типа.
Спасибо, Дмитрий!
Дело в том, что я не совсем понимаю как получить доступ к датасету загружаемого реестра открываемой из действия, чтобы включить фильтр. Метод обработчика принимает только ActionItem, а как по нему получить датасет карточки я не знаю)
function Action1OnBeforeExecute(ActionItem) { //TODO }
Не подскажете как получить ссылку на объект датасета? Еще не понятно в каком состоянии во время выполнения обработчика OnBeforeExecute находится датасет загружаемого реестра.
Добрый день, Геннадий!
Можно реализовать иначе.
Откройте в вашем бизнес-процессе Ваше действие "Открытие окна" и на вкладке "дополнительно" установите следующие значения:
Далее зайдите в скрипт scr_SelectData и в функции InitializeDataset(Window)
добавьте следующие строки:
function InitializeDataset(Window) {
var SelectDataDatasetUSI = GetAttribute(Window, 'DatasetUSI');
var CustomerID = GetAttribute(Window, 'CustomerID');
if (!IsEmptyStr(SelectDataDatasetUSI)) {
SelectData.Dataset = Services.GetNewItemByUSI(SelectDataDatasetUSI);
if (GetAttribute(Self, 'fromWorkflow')) {
ApplyDatasetFilter(SelectData.Dataset, 'AccountTypeID', 'Значение фильтра', true);
}
if (!IsEmptyStr(CustomerID)) {
ApplyDatasetFilter(SelectData.Dataset, 'CustomerID', CustomerID, true);
};
} else {
SelectData.Dataset = GetAttribute(Window, 'Dataset');
}
if (!GetAttribute(Window, 'CanNotModify')) {
if (IsEmptyValue(SelectData.Dataset.Attributes('EditWindowUSI'))) {
SelectData.EditWindowUSI =
GetEditWindowUSIByDatasetUSIDef(SelectData.Dataset.USI);
} else {
SelectData.EditWindowUSI =
SelectData.Dataset.Attributes('EditWindowUSI');
}
} else {
SelectData.EditWindowUSI = null;
}
SelectData.IsDBDataset = (SelectData.Dataset.ServiceTypeCode == 'DBDataset');
}
еще как и писал Дмитрий, если у Вас нет фильтра и параметра "AccountTypeID" в sq_Account, то его необходимо добавить
Здравствуйте, Геннадий.
Так как для выбора контрагента используется стандартное окно выбора wnd_SelectData, в DatasetLink которого автоматически добавляется нужный датасет, фильтрацию его нужно производить на событии OnPrepare.
Как дополнительный вариант, рекомендую создать свое окно унаследованное от wnd_SelectData, далее на закладке не визуальные для компонента dlData указать датасет ds_Accounts. И в обработчике события OnPrepare для созданного окна, отфильтровать датасет:
var Dataset = Window.ComponentsByName('dlData').Dataset; ApplyDatasetFilter(Dataset, 'AccountTypeID', AccountTypeID, true);
Также, изменить в диаграмме открывать то окно, которые Вы создали.
Спасибо, Георгий!
Только я бы очень не хотел менять коробочные сервисы, т.к. если в сервисе scr_SelectData произойдут какие-либо изменения мне придется мержить его со своей версией сервиса (причем каждый раз когда будут происходить изменения). Кроме этого в моем понимании фильтрация данных в окошке wnd_SelectData - это типовая задача, которую придется решать не только для поля Тип раздела Контрагенты.
Мне бы очень хотелось, чтобы Дмитрий объяснил мне как получить доступ к датасету окошка используя обработчики событий действий на диаграмме.
Геннадий, получить экземпляр обьекта Dataset на событии OnBeforeExecute(ActionItem) не получится.
Необходимо либо создавать свое окно, унаследованное от wnd_SelectData, либо использовать вариант предложенный Георгием. (этот вариант не повлияет на работу остального функционала).