DIRECTUM 4.9. Поля множественного выбора.

26 28

В арсенале прикладного разработчика весомое пополнение. Мощный инструмент в борьбе против таблиц с огромным числом реквизитов, растягивающих форму карточки до небывалых размеров. Удобный функционал объединения выбора из нескольких справочников в одном поле как на карточке формы, так и в диалоговом окне. Встречайте: поля множественного выбора.

Поля множественного выбора позволяют:

  • Выбирать одну запись из нескольких справочников.
  • Выбирать несколько записей из одного справочника.
  • Выбирать несколько записей из нескольких справочников.

Использование полей доступно в:

  • Компоненте “Типы справочников”.
  • Компоненте “Типы карточек электронных документов”.
  • Функции InputDialog и InputDialogEx.

Также поля множественного выбора поддерживают вызов карточки по Ctrl+F4 и подсказки.

Использование полей множественного выбора в типах справочников и типах карточек электронных документов.

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

Создание поля множественного выбора

На панели управления редактора формы появился новый Control - “Поле выбора записей”. Выбрав этот Control, кликаем на форму и получаем поле множественного выбора.

Акцентируем свое внимание на трех свойствах поля множественного выбора:

  • Реквизиты. В этом свойстве определяются реквизиты, которые будут участвовать в поле множественного выбора. Реквизиты могут принадлежать как карточки, так и табличному разделу. Однако существует несколько ограничений:
    • Нельзя использовать реквизиты, которые ссылаются на один и тот же справочник в одном поле множественного выбора.
    • В поле множественного выбора могут участвовать реквизиты только одного раздела, то есть одновременно не получиться использовать, например, реквизит карточки и реквизит табличного раздела №1.
    • При использовании реквизитов табличного раздела этот раздел нельзя вывести на форму в качестве таблицы.
    • Нельзя использовать реквизиты, участвующих в других полях множественного выбора.
  • Реквизит для отображения. В этом свойстве определяется строковый реквизит того же раздела, что и у реквизитов, участвующих во множественном выборе. В реквизит для отображения будет записываться текущий выбор. Ниже мы более подробно на примере раскроем смысл этого свойства.
  • Раздел. Содержит название раздела, реквизиты которого участвуют во множественном выборе.

Выбор одной записи из нескольких справочников.

Для выбора одной записи из нескольких справочников необходимо, чтобы реквизиты принадлежали разделу “Карточка”. В нашем примере полем множественного выбора будет поле Ответственный, реквизитами которого является реквизит Работник (спр. Работники) и реквизит Контакт (спр. Контактные лица организации). В качестве реквизита для отображения укажем строковый реквизит ФИО ответственного (рекв. для отобр.).

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

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

Выбор нескольких записей из одного справочника.

Для выбора нескольких записей из одного справочника необходимо использовать один реквизит любого табличного раздела. В нашем примере полем множественного выбора будет поле Пользователи, в котором будет участвовать только один реквизит табличного раздела №1 Пользователи (спр. Пользователи).

  

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

Для полей множественного выбора, использующих реквизиты табличного раздела, можно настроить отображение в форме-списке текущего справочника выбранных значений поля множественного выбора. Для этого необходимо завести не сохраняемый строковый реквизит карточки и добавить следующий код на событие “Открытие” набора данных:

// В форме-списке необходимо отобразить значения поля множественного выбора.
// Поле множественного выбора использует реквизиты ПользовательТ, первого детального набора данных.
UsersFunctionName = CreateSQLPivotFunction(Object.DetailDataSet(1); ArrayOf('ПользовательТ'); TRUE) 
// Реквизит с кодом “Вычисление” является не сохраняемым строковым реквизитом.
ChangeReferenceDataset(Format("%s(%s.%s),Вычисления";   ArrayOf(UsersFunctionName; Object.TableName; Object.Requisites(SYSREQ_ID).SQLFieldName)))

Теперь в форме-списке мы сможем увидеть выбранные значения, настроив отображение реквизита Вычисления. В справке по функции CreateSQLPivotFunction вы найдете подробное описание работы с ней.

Выбор нескольких записей из нескольких справочников.

Для выбора нескольких записей из нескольких справочников необходимо использовать реквизиты любого табличного раздела. В нашем примере полем множественного выбора будет поле Уполномоченные, в котором будут участвовать реквизиты табличного раздела №1 – реквизит Работник (спр. Работники) и реквизит Контактное лицо (спр. Контактные лица организации). В качестве реквизита для отображения определим реквизит Уполномоченные (рекв. для отобр.).

Где полностью “раскрывается” поле множественного выбора, так это при работе с реквизитами табличных разделов. Одним словом – красота!

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

Состояние табличного раздела №1.

Использование полей множественного выбора в функции InputDialog и InputDialogEx

Любимые “диалоги” тоже не обошли стороной и добавили возможность использовать поля множественного выбора. Чтобы добавить поле множественного выбора, достаточно установить соответствующий тип поля. Результат выбора значений в поле множественного выбора вернется через “;”.

Для выбора одной записи из нескольких справочников:

Result = InputDialog("Произвольная      строка|Ответственные";;"String:20|Reference:РАБ#КНТ#ПРС"; "Поле множественного выбора")

Для выбора нескольких записей из одного справочника:

Result = InputDialog("Произвольная строка|Ответственные";;"String:20|ReferenceM:РАБ"; "Поле множественного выбора")

Для выбора нескольких записей из нескольких справочников:

Result = InputDialog("Произвольная строка|Ответственные";;"String:20|ReferenceM:РАБ#КНТ#ПРС"; "Поле множественного выбора")

Реализация полей множественного выбора в веб-доступе

Поля множественного выбора поддерживаются и в веб-доступе. Реализованы они с помощью удобных выпадающих списков.

 

Новые возможности для прикладной разработки, простота в использовании и приятный интерфейс полей множественного выбора – чем вам ни повод окунуться с головой в мир прикладной разработки на ISBL!

Пример разработки с полями множественного выбора: Примеры полей множественного выбора.zip (10,35 Кб)

 

 

26
Авторизуйтесь, чтобы оценить материал.
3
Айрат Сибгатуллин

Крутой контрол! Пойду такой же заказывать для билдера Prestima.

Андрей Куров

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

Артем Сунцов

Добрый день. Правильно ли я понимаю, что эта красота лишь внешняя, не имеющая за собой изменений самой структуры таблиц БД? То есть:

1) Будет ли работать навигация при использовании записей справочников из табличных разделов?

2) Будет ли автоматически обновляться значение видимого реквизита при изменении, например, наименования указанной ранее записи (выбор одной/нескольких записей из нескольких справочников)?

Прочие вопросы:

3) Может ли одно и то же поле множественного выбора быть размещено на нескольких разных закладках на форме?

4) Будет ли увеличено количество детальных разделов для ТКЭД (в версии 4.8 их по-прежнему всего 6, из которых еще и 2 занято под служебные нужды)? Дело в том, что использование такого множественного выбора сильно ограничено количеством самих табличных частей, в которых могут располагаться реквизиты.

5) Поддерживаю вопрос Андрея Курова про возможность использования в веб-доступе.

Дмитрий Чепель

Артем, отвечу на часть вопросов.

1) Будет, т.к. контроль работает поверх стандартных реквизитов типа "Справочник".

2) В зависимости от того, задан ли реквизит для отображения у контроля. Если задан - то будет отображаться наименование на момент выбора записи, если не задан - всегда будет отображаться актуальное на текущий момент наименование. Собственно, в этом и назначение реквизита для отображения.

3) Такая возможность не поддерживается. Также нельзя комбинировать использование грида и контроля множественного выбора для одного раздела.

4) Не планируется. Несколько контролей множественного выбора можно связывать с одним табличным разделом (с разными реквизитами), поэтому ограничение на количество табличных разделов в ТКЭД некритично.

Денис Исаев

Поля множественного выбора доступны и в веб-доступе 4.9. Принцип выбора немного отличается(выбор осуществляется с помощью выпадающих списков), но он тоже очень удобен.

Павел Евдокимов

Вопрос на счет функций InputDialog, InputDialogEx: как использовать механизм ведущего справочника для полей с множественным выбором?

Рез = ВводМеню('Подразделение|Работники';'03|';'Аналитика:ПОД|АналитикаМ:РАБ')

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

 

Павел Евдокимов

Рез = ВводМеню('Подразделение|Работники';'03|';'Аналитика:ПОД|АналитикаМ:РАБ')

Денис Исаев
Вопрос на счет функций InputDialog, InputDialogEx: как использовать механизм ведущего справочника для полей с множественным выбором?
Павел, механизма ведущего справочника для полей множественного выбора нет. Каким образом вывидете реализацию этого функционала?
Андрей Куров
Не планируется. Несколько контролей множественного выбора можно связывать с одним табличным разделом (с разными реквизитами), поэтому ограничение на количество табличных разделов в ТКЭД некритично.

Если поля множественного выбора привязать к разным реквизитам в одной табличной части, то, как будет обработана, например, такая ситуация: в поле "Работники" добавили Иванова и Петрова, а в поле "Организации" - "Вектор", "Ромашка" и "Копыта". Сколько строк в таблице получится - 3 или 5?
Дмитрий Чепель

В таблице будет 5 строк:

1 Иванова null

2 Петрова null

3 null Вектор

...

Одна запись используется строго одним полем, это контролируется самим полем.

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

Денис, основная проблема в том, чтобы дать пользователю возможность выбирать записи например работников не из всего списка работников, а ограниченных по подразделению к примеру. Для карточек записей справочников и карточек ЭД - мы можем использовать для этого пользовательский выбор. Как быть в ситуации, когда необходимо запросить подобный список из функции InputDialog? Дайте пожалуйста знать, если суть моего вопроса не ясна.
Реализацию этого функционала я вижу следующим образом: выбор записей в функции InputDialog (и им подобным) осуществляется с фильтром по ведущему реквизиту, например:
Рез = ВводМеню('Подразделение|Работники';'03|';'Аналитика:ПОД|АналитикаМ:РАБ')

В данном запросе в поле Подразделение по умолчанию встанет подразделение (например ИТ), для заполнения поля работники будет выведен диалог с множественным выбором работников отфильтрованных по подразделению (в наем случае ИТ). Я думаю здесь просто имеет место быть недоработка.

Алексей Марков

Добавили в ТКЭД поле с множественным выбором проектов, сейчас встал вопрос как добавить в поиск это поле? При настройке критериев поиска нет этих табличных реквизитов

Дмитрий Тарасов
Добавили в ТКЭД поле с множественным выбором проектов, сейчас встал вопрос как добавить в поиск это поле? При настройке критериев поиска нет этих табличных реквизитов

Заведите скрытый строковый реквизит, в который при сохранении карточки собирайте значения реквизитов из табличной части (код или наименование). Поиск осуществляйте по этому реквизиту.
 
Андрей Куров
Одна запись используется строго одним полем, это контролируется самим полем.

Хорошо, еще вопрос: как недостаточность табличных разделов в ТКЭД компенсируется полем множественного выбора? Допустим, к договорам есть списки: график поставок, график платежей, контрагенты, разбиение по бюджетным статьям. Всё - все таблицы выбраны. Необходимость добавления еще одной табличной части выльется уже в необходимость существенной доработки.
Алексей Марков
Заведите скрытый строковый реквизит, в который при сохранении карточки собирайте значения реквизитов из табличной части (код или наименование). Поиск осуществляйте по этому реквизиту.

Спасибо, то что надо :)
Дмитрий Чепель
Хорошо, еще вопрос: как недостаточность табличных разделов в ТКЭД компенсируется полем множественного выбора? Допустим, к договорам есть списки: график поставок, график платежей, контрагенты, разбиение по бюджетным статьям. Всё - все таблицы выбраны. Необходимость добавления еще одной табличной части выльется уже в необходимость существенной доработки.

Я уже писал выше, что несколько контролей множественного выбора можно привязать к одному табличному разделу.
Встречный вопрос - а действительно ли в ТКЭД их недостаточно? Когда мы увеличивали количество табличных разделов справочниках, проводили анализ и для ТКЭД, в итоге ситуаций нехватки табличных разделов для ТКЭД не нашли. В вашем примере можно создать отдельный справочник договоров, указанную информацию хранить в нем.
Андрей Куров
В вашем примере можно создать отдельный справочник договоров, указанную информацию хранить в нем.

Несколько странно одни реквизиты документа заполнять в карточке документа, а другие реквизиты документа заполнять в справочнике. Я понимаю, что обходные пути всегда можно найти, но это очередной костыль, который никак не улучшает user experience.
 
несколько контролей множественного выбора можно привязать к одному табличному разделу
Это никак не поможет, если табличные части состоят из нескольких реквизитов.
 
Мы еще, к счастью, не столкнулись с ситуацией нехватки табличных частей в документе, но я описал вполне реальный случай - мы добрались до ограничения, когда разрабатывали интегрированную финансово-учетную систему из DIRECTUM, 1С, OLAP и самописного софта - клиента системы бюджетирования. Еще один уровень детализации, и придется вводить сложные конструкции, которые явно неудобнее использовать, чем просто добавить еще одну табличную часть на карточку документа. Денис Баранов как-то написал, что нужно сообщать о реальных случаях использования системы, потому что разработчики не могут быть в курсе всей ситуаций. Вот я и сообщаю: на реальном проекте сложилась такая ситуация, когда потолок количества табличных частей в карточке документа был достигнут. При этом проект продолжается, экватор еще не пройден, и никто не может гарантировать, что этот потолок не будет превышен.
Еще у Артема Сунцова можно уточнить - у него реальный запрос на увеличение количества табличных частей в документе или это с заделом на будущее он спрашивал.
Дмитрий Чепель

Андрей, предлагаю оформить идею по увеличению количества табличных частей в ТКЭД.

 

Это никак не поможет, если табличные части состоят из нескольких реквизитов
Честно говоря, не понял, о чем идет речь. Выше в статье описан пример, как использовать несколько полей множественного выбора, использующих несколько реквизитов, в одном табличном разделе (см. Состояние табличного раздела №1).
Артем Сунцов

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

Ранее писал об абсолютно реальном примере нехватки (все по тем же договорным документам); нам пришлось просто убить 1 наименее критичный табличный раздел в ТКЭД, полностью перенеся с него логику в связанный справочник, чтобы на его место засунуть новый, более важный. Еще раз повторить подобный фокус уже не удастся... Поддерживаю пожелание об увеличении количества доступных табличных разделов в ТКЭД.

Андрей Куров
Выше в статье описан пример, как использовать несколько полей множественного выбора, использующих несколько реквизитов

Я не вижу такого примера.
 
Давайте на конкретном примере. Допустим, у нас кончились табличные части в КД и нам надо добавить две табличных части
1) Строка, Дата, Дробное число
2) Строка, Строка, Дата
 
Как нам здесь помогут поля множественного выбора? Вот я о таком примере говорю.
Дмитрий Чепель

Попробую еще раз.

1. Если нам надо использовать несколько полей множественного выбора в карточке, то их данные можно хранить в одном табличном разделе. Таким образом, ограниченное количество табличных частей не является проблемой в данной ситуации, т.к. они не требуют большого количества табличных разделов.

Пример рассмотрен в статье - поля "Пользователи" и "Уполномоченные" хранятся в одном табличном разделе (см. "Выбор нескольких записей из нескольких справочников".)

2. Сами по себе поля множественного выбора никак не решают вопрос нехватки табличных частей. Еще раз предлагаю оформить идею по их увеличению в ТКЭД.

 

Андрей Куров
Сами по себе поля множественного выбора никак не решают вопрос нехватки табличных частей.

Я видимо просто неправильно понял вот эту вашу реплику, из-за которой пришлось оформлять комментарий:
Несколько контролей множественного выбора можно связывать с одним табличным разделом (с разными реквизитами), поэтому ограничение на количество табличных разделов в ТКЭД некритично.

 
Андрей Куров

Я хотел сказать, что вопрос с увеличением количества табличных частей в ТКЭД закрыт, Дмитрий, вас я понял, идею я оформил.

Евгений Петренко

В таблицах выбор записей из справочника автоматически фильтруется по контексту НОР.

При использовании этого контрола фильтр по контексту НОР  у меня не отработал. Все записи, включая записи других НОР, доступны.

Алексей Долгих

Возможно ли определить фильтр на предлагаемые пользователю записи при работе с контролом Поле множественного выбора? Если да, то как?

Добрый день! Подскажите, почему не могу выбрать табличную часть в качестве реквизитов в поле реквизиты как описано? Табличные части есть, доступен только выбор карточки

 

Николай Николаев

К вопросу ограничений использования реквизитов, в статье написано что:

Нельзя использовать реквизиты, участвующих в других полях множественного выбора

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

Татьяна Ларионова

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

Values = "*Подразделение"
     ValueTypes = "ReferenceM:ПОД"
     DefaultValues = "Поле множественного выбора"
     Параметры =    InputDialog(Values;DefaultValues;ValueTypes;"Выберите подразделения")

Выдает общий список всех подразделений без иерархии, а нужно, чтобы при выборе подразделения верхнего уровня, также выбирались все подчиненные подразделения.

Заранее спасибо

Авторизуйтесь, чтобы написать комментарий