Перейти к содержимому

Как сделать множественный выбор в 1с

  • автор:

Организация подборов в табличную часть документа

Для иллюстрации механизма подбора информации в форме будем использовать задачу подбора элементов справочника Номенклатура в табличную часть документа ПриходнаяНакладная как наиболее распространенную. Поскольку механизм подбора реализован на уровне форм, то в других случаях просто будут задействованы иные прикладные объекты. Сама механика подбора не изменится.

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

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

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

Одиночный подбор

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

Откроем форму документа ПриходнаяНакладная , создадим команду Подбор и назначим для нее обработчик:

В этой процедуре мы открываем форму выбора для справочника Номенклатура , указывая, что она подчинена таблице Материалы формы документа ПриходнаяНакладная ( Элементы.Материалы ). При выборе из формы выбора справочника выбранное значение будет передано в обработчик события ОбработкаВыбора таблицы формы Материалы , так как она является владельцем открытой формы выбора.

Поэтому откроем палитру свойств таблицы Материалы и создадим обработчик события ОбработкаВыбора :

В этой процедуре мы добавляем новую строку в таблицу Материалы и присваиваем колонке Материал в новой строке выбранное в форме выбора справочника значение. Это значение передается в обработчик события в параметре ВыбранноеЗначение .

Множественный подбор

При множественном подборе форма справочника будет открыта до тех пор, пока пользователь не закроет ее интерактивно или не будет вызван метод формы Закрыть() .

Обработчик команды Подбор :

Обработчик события ОбработкаВыбора остается без изменений.

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

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

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

Обработчик команды Подбор :

Обработчик события ОбработкаВыбора :

Множественный подбор с использованием множественного выбора

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

Обработчик команды Подбор :

Обработчик события ОбработкаВыбора остается без изменений.

Использование метода ОповеститьОВыборе()

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

Метод ОповеститьОВыборе() посылает оповещение владельцу формы о выполнении выбора или подбора, передает ему выбранное значение и закрывает форму, если она открыта не в режиме множественного выбора.

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

Справка

ТабличноеПоле.ДобавитьСтроку()

Добавляет строку в табличное поле, аналогично выполнению команды «Добавить».

  • Если табличное поле связано с таблицей или деревом значений, метод добавляет строку в таблицу или дерево значений (аналогично соответствующим методам этих объектов).
  • Если табличное поле связано со списком объектов, хранимых в базе данных, метод начинает редактирование нового объекта этого списка. (Например, список объектов в форме списка справочника, или документа).
  • Если табличное поле связано с набором записей или табличной частью, то метод начинает редактирование новой записи. (Например, список записей в форме списка регистра сведений; табличная часть документа или справочника).

Доступность: Толстый клиент.

ДанныеФормыКоллекция.Добавить()

Добавляет элемент в конец коллекции и возвращает его в качестве результата метода. Возвращаемое значение: ДанныеФормыЭлементКоллекции .

Доступность: тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).

Как сделать множественный выбор в 1с

В форме размещаем кнопку «Подбор». Это может быть кнопка панели инструментов или отдельно стоящая кнопка.

В обработчике события Нажатие для кнопки пишем:

При этом происходят довольно интересные вещи:

1. В первой строке получаем форму выбора. Это особая форма, которая может не совпадать с формой списка (а может совпадать). Форму выбора можно создать самому, или она будет сгенерирована системой автоматически, или форма списка может работать в режиме выбора.

Если вы получили не форму подбора, а обычную форму (методом ПолучитьФорму или ПолучитьФормуСписка), то по умолчанию у нее не установлено свойство РежимВыбора. Нужно или установить это свойство в Истина, или оповещать о выборе элемента самостоятельно (см. метод формы ОповеститьОВыборе).

а) Первым параметром можно передать имя формы или объект описания метаданных типа формы. Если у объекта несколько форм выбора, то здесь можно указать, какую форму нужно использовать.

б) Вторым параметр указывается владелец формы — форма или элемент управления, из которого производится вызов формы выбора. После совершения выбора именно владельцу формы будет послано оповещение о выборе, которое инициирует событие «ОбработкаВыбора» (у формы или элемента формы).

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

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

3. Третья строка открывает форму выбора. После первой строки форма еще не была открыта, но ее модуль уже был скомпилирован и инициализирован.

В свойствах формы должен быть назначен обработчик события «ОбработкаВыбора».

2. Множественный выбор

При таком выборе пользователь может выделить сразу несколько элементов (например, с помощью клавиши Ctrl) и после нажатия кнопки «Выбрать» система вернет массив выбранных элементов, а не один элемент, как в первом случае.

Тогда обработчик события ОбработкаВыбора можно написать так:

Примечание: Для ручной генерации события выбора из формы подбора нужно использовать функцию ОповеститьОВыборе.

Множественный выбор в поле ввода

Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.

Планируется в версии 8.3.23

Будет реализован новый интерфейс для последовательного ввода однотипных значений.

Часто перед разработчиками встает задача хранить для одного объекта несколько значений одного типа. Например:

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

Нескольких номеров телефонов для контрагента или контактного лица

Роли пользователя, принадлежность к группам доступа

Для хранения таких данных можно использовать, например, табличную часть. А для показа как правило используется табличное поле формы с одной колонкой. Пример из 1С:Документооборота, форма письма:

В версии 8.3.23 появится возможность отображать такие реквизиты более компактно, показывая их значения в одну строку:

img-02.png

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

Ввод текста или автоподбор с клавиатуры

Выбор значений из выпадающего списка

Множественный выбор из формы выбора

В диалоге редактирования списка значений

При вводе множественных значений в выпадающем списке могут отображаются флажки:

img-03.png
Можно будет указать, разрешено ли вводить дублирующие значения и пустые значения.
img-04.png

img-05.png

Можно будет кастомизировать оформление множественных значений – задать цвет текста, цвет фона, шрифт, картинку, наличие гиперссылки и т.д.

Элемент Поле ввода будет расширен новыми свойствами и событиями для поддержки этой функциональности. Также во встроенном языке появятся новые объекты.

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

Реализация подборов в документах

Доброго времени суток, уважаемые читатели! В этой заметке мы будем говорить о реализации механизма подборов в системе 1С:Предприятие. Подборы в основном используются в документах, но могут быть использованы в справочниках и любых других объектах. В чем заключается работа этого механизма? Давайте посмотрим.

Предназначение механизма

Как обычно пользователь вводит данные в документы? Например, пользователь создает документ Реализация. Затем, чтобы добавить строку в табличную часть документа, нажимает на кнопку «Добавить». В строке табличной части выбирает элемент из справочника, либо пользуется функцией ввода по строке, вводит название и выбирает соответствующую позицию.

Такой ввод является относительно удобным, но если в документе требуется ввести сто и больше строк, то такой метод одиночного выбора является достаточно долгим. Более эффективно было бы сделать следующим образом: открыть форму справочника, затем нажать на соответствующий элемент, который автоматически добавляется в табличную часть, но форма не закрывается. В этом случае можно ввести документ с большим количеством строк. Это и называется механизмом подбора. По умолчанию в платформе его нет. Его надо будет реализовывать самостоятельно программными средствами. Но ничего сложного в этом нет.

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

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

Здесь применяется принцип под названием «Блокировать окно владельца». Когда будет открываться форма подбора, система не должна позволять переключаться на другие элементы. Если открыть форму справочника, то невозможно переключиться в документ, окно будет заблокировано. Но в приложение можно спокойно переключиться. Такой принцип позволяет избежать ошибочного клика на документ, который сделает окно подбора неактивным. Если такое произойдет, то в этом случае можно легко запутаться. Реализуем подобный механизм, чтобы окно владельца блокировалось.

Простой вариант подбора

Начинаем реализацию подборов и начнем от простого к сложному. Для начала реализуем простейший вариант подбора. Этот вариант будет такой. Первое, нужно, чтобы форма выбора не закрывалась. Для этого можно использовать специальный параметр управляемой формы, который называется «ЗакрыватьПриВыборе». Обратимся к Синтаксис-помощнику и найдем этот параметр управляемой формы.

Параметр управляемой формы ЗакрыватьПриВыборе

Описание параметра управляемой формы ЗакрыватьПриВыборе в Синтаксис-помощнике

Итак, в параметрах указывается флаг «ЗакрыватьПриВыборе, то есть мы можем при открытии формы выбора передать значение этого параметра равную ЛОЖЬ. В этом случае, в момент двойного клика, либо при нажатии ENTER система не будет закрывать форму выбора. Именно такое поведение нам нужно.

Дальше мы открываем форму с передачей этого параметра и обязательно указываем, что эта форма подчинена определенному владельцу. Она должна открыватся в таком режиме. Для чего нужен владелец? Дело в том, что нужно поймать событие двойного клика или нажатие на ENTER в исходной форме владельца и в этой форме реализовать обработчик, который называется «ОбработкаВыбора». Давайте посмотрим, как это работает и всё станет понятно.

Итак, в форме документа создадим команду Подбор. Отразим эту команду на форме в командной панели. Здесь важно расположить кнопку в командной панели таблицы формы.

Кнопка Подбор на панели задач

Размещение команды Подбор на панели задач табличной части

Итак, в обработчике действия открываем форму и передаем в неё параметр. Конечно, можно создать структуру с названием «Параметры», но это было бы критической ошибкой. «Параметры» – это название свойства текущей управляемой формы, поэтому название изменим на «ПараметрыПодбора».

Для того, чтобы открыть форму используем метод глобального контекста «ОткрытьФорму», где в первом параметре указано, что конкретно мы хоти открыть.

Функция глобального контекста ОткрытьФорму

Описание функции ОткрытьФорму в Синтаксис-помощники

Если нужно указать конкретную форму, то следует написать так:

Где «ИмяФормы» это название формы, которую нужно открыть. Если нужно открыть основную форму, то нужно указать имя основной формы так:

И вторым параметром передаем параметры подбора. Третий параметр для этого метода – это Владелец, то есть какому владельцу будет подчинена данная форма.

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

Обработчик события формы ОбработкаВыбора

Обработка выбора или подбора на форме

Этот обработчик, который называется «ОбработкаВыбора» срабатывает, когда пользователь делает двойной клик, нажимает ENTER или кнопку «Выбрать» в подчиненной форме. Более логично подчинить форму непосредственно таблице формы «Товары». Когда пользователь будет осуществлять выбор будет срабатывать обработчик.

Добавляем новую строку в табличную часть. Для этого обращаемся к объекту табличная часть «Товары», используя метод «Добавить». Можно заполнить и цену выбранного товара. Есть обработчик «ТоварыНоменклатураПриИзменении», который может это сделать и может возникнуть соблазн вызвать этот обработчик. Зачем что-то писать если всё уже написано, но это обернется проблемами.

Если пробовать это сделать в старом документе с заполненной табличной частью, то все будет работать. Но могут быть проблемы с новыми документами. Если создать новый документ и попытаться подобрать номенклатуру, то возникает ошибка, связанная с методом «ТоварыНоменклатураПриИзменении».

Ошибка при попытке указать цену

Система не знает такого выражения как «Цена». Если сделать еще раз выбор и посмотреть в отладчике, что содержится в текущих данных, то можно увидеть, что значение еще не определено. То есть на самой форме нет еще ни одной строки. Мы добавили строку лишь в основной реквизит формы. Еще не произошла синхронизация, поэтому вызывать данное событие нельзя. Если нужно присвоить цену, то это нужно сделать без обработчика «ТоварыНоменклатураПриИзменении».

Подборы с множественным выбором

Сейчас немного усложним задачу. Ведь подбор работает только на одиночные выборы. То есть, если выделить несколько строк в форме подбора справочника и нажать на кнопку «Выбрать», то добавиться последняя выбранная строка. Каким образом можно реализовать множественный подбор? Если открыть форму выбора справочника и открыть в реквизитах свойства списка, то можно увидеть флаг «МножественныйВыбор». Именно это флаг нам и нужен.

Свойство таблицы МножественныйВыбор

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

Здесь же, в свойствах списка есть еще такое свойство как «РежимВыделения». По умолчанию оно стоит взначении «Множественный» и пользователь может выделять много строк, но множественного выбора не происходит. Нужно установить флаг «МножественныйВыбор». Лучше это делать программно, обращаясь к элементу управления формы и к его флагу «МножественныйВыбор». Но есть одна проблема, которая связана с названием элемента управления формы. Это название нужно знать точно. Если элемент будет называться по-другому, то это вызовет ошибку. Этого можно избежать.

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

Как видно, здесь тоже есть параметр «МножественныйВыбор». Если выставить в основном реквизите данной формы этот параметр, то не нужно знать имя элемента управления формы. Поэтому при открытии формы нужно просто передать параметр «МножественныйВыбор».

Теперь при выборе значения будет возвращаться несколько значений. Это будет тип значений «Массив». Изменим программный код в соответствии с этим пониманием:

Сейчас выбираются все строки, которые выделены, желаемый результат получен. Но еще нет возможности выбирать количество подбираемого товара. Давайте это сделаем. Для этого нужно немного изменить процедуру «ДобавитьСтрокуТовары», добавив функцию глобального контекста «ВвестиЧисло».

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

Реализация формы подбора

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

  • Просмотр выбранных значений в текущем сеансе подбора, то есть ему нужно просмотреть что он уже сделал и произвести необходимые изменения. Может быть пользователь кликнул дважды случайно и хочет отказаться от сделанного выбора. То есть нужно предоставить возможность визуализации выбранных значений.
  • Корректировка выбранных значений, например, пользователь ввел одну строчку и потом решает, что вместо одной штуки товара нужно указать четыреста штук. У пользователя должна быть возможность корректировки строки, не закрывая подбор.

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

Создадим для документа «РеализацияТоваров» новую форму, которая будет называться «ФормаПодбора». Создадим произвольную форму, так как она не будет отображать данные документа. На форме создадим реквизит «Таблица» с типом данных «ТаблицаЗначений». Сделанный пользователем выбор будет размещен в этом реквизите.

В таблицу добавим несколько колонок. Колонка «Номенклатура» тип данных справочник «Номенклатура». И колонка «Количество» тип данных число длина 15, точность 3.

Создадим еще один реквизит «Товары», в котором будет размещен список товаров с типом данных «ДинамическийСписок». В качестве основной таблицы динамического списка укажем справочник «Номенклатура». Здесь важно отметить, что обычно в подборе, кроме данных по номенклатуре, еще указывается и текущий остаток товара, который можно получить с помощью произвольного запроса. Чтобы работали механизмы множественного выбора нужно выставить флаг «Основной реквизит».

После установки этого флага система будет наследовать соответствующие параметры от динамического списка для этой формы. К сожалению, после установки этого флага на форме появилось три командных панели. И две из них абсолютно одинаковые. Чтобы отключить лишние панели нужно убрать флаг «Автозаполнение» у элемента формы «Командная панель». Для номенклатуры оставим командную панель, а вот для «Таблицы» отключим, поскольку пользователи добавляет данные в таблицу двойным кликом по верхней таблицы формы.

Флаг Автозаполнение

Флаг Автозаполнение элемента формы «Командная панель»

Итак, форму настроили, теперь нужно реализовать правильное поведение формы. Для начала в списке свойств формы найдем свойство «РежимОткрытияОкна» и из выпадающего списка выберем значение «Блокировать окно владельца». Это необходимо, чтобы пользователь не потерял окно подбора, когда нечаянно кликнет за пределами формы. В этом режиме можно перейти в главное приложение, а окно владельца блокируется, то есть то окно, из которого происходил вызов. Если сравнить с модальным режимом, то в этом режиме блокируются все окна приложения.

Когда пользователь делает выбор на одном из строк таблицы «Товары», то происходит добавление этой строки в нижнюю таблицу. Посмотрим какие есть события для таблицы формы «Товары». Событие «Выбор» как раз подойдет для реализации наших планов. Оно срабатывает при двойном щелчке мыши или нажатии на ENTER. По умолчанию система при выполнении этого действия откроет элемент справочника на редактирование, но нашем случае нужно изменить стандартное поведение.

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

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

Теперь нужно, чтобы при добавлении товара, который уже есть в нижней таблице не было дублирования строк, а вместо этого увеличивалось количество. Но хотелось бы вначале поговорить о том, какой тип данных у реквизита «Таблица». Если говорить о модуле формы подбора, то на клиенте переменная «Таблица» имеет другой тип данных. Если посмотреть в отладчике, то он покажет, что это тип данных «ДанныеФормыКоллекция». Синтаксис-помощник показывает, что у этого объекта есть метод «НайтиСтроки». Можно использовать этот метод, передавая параметры поиска. Перед тем, как добавить новую строку, будет осуществлен поиск.

Передача результата в вызывающую форму

Сейчас нужно сделать передачу выбранных значений пользователя в форму владельца. Для этого воспользуемся методом «ОповеститьОВыборе». Этот метод управляемой формы нужно вызывать в форме подбора. Нужно создать команду формы, назовём ее «Перенести» и разместим ее на форме в виде кнопке и установим флаг «КнопкаПоУмолчанию», чтобы при нажатии клавиш Ctrl+ENTER происходило нажатие на эту кнопку.

Форма подбора номенклатуры

Форма подбора с возможностью перенести данные в табличную часть документа

Обратите внимание, что в метод «ОповеститьОВыборе» будет передаваться не тип данных таблица значений, ведь этого нельзя сделать на клиенте, а тип «ДанныеФормыКоллекция».

На уровне владельца нужно обработать сделанный выбор в обработчике событий «ТоварыОбработкаВыбора» и в процедуре «ДобавитьСтрокуТовары».

Передача данных табличной части в вызываемую форму

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

Кроме того, в форме подбора напишем обработчик события «ПриСозданииНаСервере».

Еще чуточку изменим обработчик событий «ТоварыОбработкаВыбора» и процедуру «ДобавитьСтрокуТовары».

Теперь все корректно работает. Может вы увидите, что можно еще улучшить для себя в этом подборе. А результат можно посмотреть в коротком видео (33 секунды):

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *