Поле множественного выбора из справочника в BPMonline 5.X

Сейчас мы создадим в BPMonline 5.X поле справочника со множественным выбором. В отличие от обычного справочника, в нём можно выбрать как одно, так и несколько значений. Технически это реализуется как скрытая деталь для связи «многие ко многим».

Так выглядит поле с выбранными вариантами на карточке:

рис. 1

А так — окно выбора вариантов. Сверху — возможные, снизу — выбранные:

рис. 2

Выбор вариантов осуществляется кнопками со стрелочками между верхним и нижним реестрами.

Для поддержки множественного выбора была разработана библиотека MultiSelectLookupUtilities.md, её нужно загрузить в конфигурацию и опубликовать.

Далее мы рассмотрим пример. На карточке контакта нужно разместить поле множественного выбора из справочника «Виды недвижимости» (FacilitySubtype).

Создаём на странице поле справочника FacilitySubtypesEdit с такими свойствами:

рис. 3

Обратите внимание на заполненные и пустые свойства, помеченные красным.

Затем создаём обработчики событий в бизнес-процессе карточки. Все эти обработчики после базовых:

На Init

Terrasoft.Configuration.MultiSelectLookupUtilities.MultiSelectLookupPrepare(Page.FacilitySubtypesEdit);
return true;

На PageLoadComplete

Terrasoft.Configuration.MultiSelectLookupUtilities.MultiSelectLookupLoad("FacilitySubtypeInContact", "FacilitySubtype", Page.FacilitySubtypesEdit, Page.DataSource.ActiveRowPrimaryColumnValue, "Contact", UserConnection);
return true;

На OKButtonClick

if (IsNew || IsCopy) {
      return true;
}
Terrasoft.Configuration.MultiSelectLookupUtilities.MultiSelectLookupSave("FacilitySubtypeInContact", "FacilitySubtype", Page.FacilitySubtypesEdit, Page.DataSource.ActiveRowPrimaryColumnValue, "Contact", UserConnection);
return true;

На DataSourceSaved

if (!IsNew && !IsCopy) {
      return true;
}

Terrasoft.Configuration.MultiSelectLookupUtilities.MultiSelectLookupSave("FacilitySubtypeInContact", "FacilitySubtype", Page.FacilitySubtypesEdit, Page.DataSource.ActiveRowPrimaryColumnValue, "Contact", UserConnection);
return true;

Для хранения результатов выбора в БД должна быть создана схема-объект вроде FacilitySubtypeInContact с двумя полями-справочниками. В нашем случае это Contact и FacilitySubtype. Оба поля с галкой «каскадная связь». Первый справочник — раздел, в который добавляется поле. Второй — справочник, из которого будут выбираться значения. Он должен быть уже создан.

рис. 4
рис. 5
рис. 6

Используя инструкцию, не забудьте заменить в вызовах функций параметры на свои: название объекта-развязки, объекта-справочника, объекта-раздела и поля ввода на карточке.

Нравится

Поделиться

43 комментария

Добрый день.
При попытке опубликовать ваше решение выдается следующая ошибка:

вот в этом месте :

 public static void MultiSelectLookupPrepare(LookupEdit multiLookupEdit)
        {
            if (multiLookupEdit == null)
            {
                return;
            }
            multiLookupEdit.PrepareLookupFilter += delegate(object sender, LookupEditEventArgs e)
            {
                e.ParametersValue.Add("openLookupSelectedValues", multiLookupEdit.SelectedValues); //ОШИБКА
            };
        }

Или данный функционал доступен только с версии 5.4 ?

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

Добрый день, а вы не могли бы прикрепить свой LookupGridPage ? Может можно его безболезненно встроить в систему?

Добрый день, а вы не могли бы прикрепить свой LookupGridPage ? Может можно его безболезненно встроить в систему?

Вы хотите перенести в 5.2 схемы из конфигурации 5.4?
Не уверен, что такое возможно без обновления ядра. Там используется свойство ParametersValue контрола «поле справочника», которое в 5.2 ещё не появилось.

Добрый день.
Может ктонибудь реализовал передачу выделенных значений в множественный справочник? Уже бьюсь неделю и ничего не выходит.

Илья, реализация данного функционала в том виде, в котором он здесь предоставлен потребует внесения изменений в ядро версии 5.2. Так как развитие версии 5.2 прекращено, данная доработка ядра произведена не будет.

Ясно. Реализовал собственными силами.

Если не сложно, можете поделиться решением?

в принципе забил много костылей.
Общая идея - открывать справочник через действие процесса, в действии формировать передавать список SelectedValues (которые передаются в дейтвии) в LookUpGrid
и в окне справочника на PageLoadComplete заполнять SelectedDataSource значениями полученными из действия.

Не совсем понял, окно справочника теперь у вас открывается не по стандартной кнопке с лупой?

теперь нет. Открываем своей собственной кнопкой

Тогда в общих чертах понятно. Спасибо!

Добрый день

Спасибо за статью, полезно.
Возник один вопрос: при открытии справочника для выбора неск. значений, предыдущие выбранные значения не отображаются (т.е. ранее сохраненные напр).
Можете подсказать "куда капать"?

"Илья Т." написал:Добрый день.
Может ктонибудь реализовал передачу выделенных значений в множественный справочник? Уже бьюсь неделю и ничего не выходит.

BPMOnline Версия 5.2.0.658


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

Антон, какая у вас версия бинарников?

5.4.0.2028

В таком случае должно работать нормально. У Ильи ошибка проявляется в 5.2.
За отображение ранее выбранных значений в справочнике отвечает функция MultiSelectLookupPrepare на событии Init. Она у вас вызывается?

"Зверев Александр" написал:

В таком случае должно работать нормально. У Ильи ошибка проявляется в 5.2.
За отображение ранее выбранных значений в справочнике отвечает функция MultiSelectLookupPrepare на событии Init. Она у вас вызывается?


Да она вызывается.
Но при открытии справочника по лупе, значение не отображается в выделенных.

Антон, предоставьте, пожалуйста, код процесса, отображенного на Вашем скриншоте.

"Андрей Каспаревич" написал:

Антон, предоставьте, пожалуйста, код процесса, отображенного на Вашем скриншоте.

С уважением,
Каспаревич Андрей
Эксперт 3-й линии поддержки


Terrasoft.Configuration.MultiSelectLookupUtilities.MultiSelectLookupPrepare(Page.ArgumentEdit);

и дальше старая логика...

Антон, для предоставления решения потребуется бэкап Вашей БД, либо выгруженные метаданные используемых схем.
Просьба обратиться в тех. поддержку с данным вопросом и предоставить бэкап, либо метаданные.
Спасибо!

У меня версия 5.4. хочу в INIT процесса страницы редактиврования Инцидента включить : Terrasoft.Configuration.MultiSelectLookupUtilities.MultiSelectLookupPrepare(Page.AdresatiEdit);

при этом при опубликовании у меня возникает ошибка, MultiSelectLookupUtilities в конфигурации не найдена. Ранее здесь писали, что в версии 5.4 эта библиотека должна уже быть. Как мне ее загрузить ?

Как приложение к этой теме.

Версия BPM 5.4.0.2407

Сделала все как описано, но при выборе нескольких значений в поле на странице и в таблицу ничего не пишется (окно выбора у меня выглядит как во вложении lookupgridpage.png).
Если выбирать двойным щелчком в верхнем реестре, то в поле выбора и в базу сохраняется одна запись. Но даже в этом случае при повторном открытии страницы выбора в реестре выбранных записей пусто (lookupGridPage2.png)

Здравствуйте, Лариса!
Опишите, пожалуйста, пошагово, что Вы сделали. Тогда можно будет понять, в чем ошибка.

"Андрей Каспаревич" написал:

Опишите, пожалуйста, пошагово, что Вы сделали. Тогда можно будет понять, в чем ошибка.


Андрей, сделала все в точности как описано в теме. Напишите, какие дополнительные сведения нужны для решения.

Лариса, проблема решилась импортом страницы выбора из справочника из более поздней сборки.

Здравствуйте.
Добавила множественное поле на карточке, сделала все вышеописанные шаги.
В итоге: при повторном сохранении карточки выходит ошибка, что поле не заполнено(хотя оно заполнено и выбранные значения перечислены через ; ). Кликаю на это поле, ничего не меняю, сохраняю карточку, карточка сохраняется, ошибки уже нет. Как устранить такое поведение? Знаю, что при разработке проекта, разработчики с таким сталкивались тоже и как-то исправляли.

Антонина, возможно раньше это поле на карточке было обычным полем единичного выбора и в объекте осталось такое же поле, причём обязательное? А на карточке случайно не забыли очистить связь контрола с полем объекта (надо как на рис. 2)?

Да, это поле ранее было единичным и оно есть в объекте, но в поле обязательность заполнения стоит значение нет. На карточке тоже стоит так, как указана на представленном скрине.

Возможно, осталась старая логика включения обязательности этого поля на карточке по какому-то условию.

у кого не работает, обратите внимание, что в статье опечатка, в имени события пропущена буква "p".
PageLoadComlete -> PageLoadComplete
и прикладываю очень полезный файл по описанию событий.

Есть опыт создания поля множественного выбора в версии 7.4, кому интересно - пишите
(исправлены ошибки в MultiSelectLookupUtilities + нужно заместить LookupGridPage)

"Anonymous" написал:

у кого не работает, обратите внимание, что в статье опечатка, в имени события пропущена буква "p".
PageLoadComlete -> PageLoadComplete


Спасибо тебе, Анонимус. Исправил.

Проблема аналогична описанной в комментарии #23 - не передаются выбранные позиции в/из реестра выбранных записей.

Версия 5.4.0.2339

Как можно получить исправленную страницу выбора из справочника (решение проблемы в соответствии с комментарием #28) ?

Если речь о LookupGridPage, прилагаю версию от 5.4.1.1035 с датой изменения 2.03.2013.

На всякий случай сохраните в файл старую версию из системы.

Попытка использовать LookupGripPage из комментария #37 неудачна - в версии отсутствует параметр TreeGridDblClickDisabled и при компиляции зависимые объекты дают ошибки (8 штук)

Нужна более поздняя по времени версия, в которой уже есть данная функциональность

А у Вас какая дата её изменения?

Ещё раз уточните, проблема как в #23 или в #25?

Проблема как в #25 - нет передачи значений в LookupGridPage и обратно

Дата изменения (по колонке "Метаданные изменены") - 10.03.2014, верчсия бинарников - от 19.02.2014

Размер файла MD (по сравнению с присланным в #37) - больше на 45 кБайт (примерно на 120 строк)

А окно тоже выглядит, как в #25 на скриншоте, или как в статье?

Окно как в #25 (в нижней части кнопки "Выбрать" и "Убрать из выбранного", а не стрелки)
Версия системы близкая к указанной в #25

5.4.0.2465 от 05.12.2013:

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