1с обработкавыбора очистить выбранное значение
В форме размещаем кнопку "Подбор". Это может быть кнопка панели инструментов или отдельно стоящая кнопка.
В обработчике события Нажатие для кнопки пишем:
При этом происходят довольно интересные вещи:
1. В первой строке получаем форму выбора. Это особая форма, которая может не совпадать с формой списка (а может совпадать). Форму выбора можно создать самому, или она будет сгенерирована системой автоматически, или форма списка может работать в режиме выбора.
Если вы получили не форму подбора, а обычную форму (методом ПолучитьФорму или ПолучитьФормуСписка), то по умолчанию у нее не установлено свойство РежимВыбора. Нужно или установить это свойство в Истина, или оповещать о выборе элемента самостоятельно (см. метод формы ОповеститьОВыборе).
а) Первым параметром можно передать имя формы или объект описания метаданных типа формы. Если у объекта несколько форм выбора, то здесь можно указать, какую форму нужно использовать.
б) Вторым параметр указывается владелец формы - форма или элемент управления, из которого производится вызов формы выбора. После совершения выбора именно владельцу формы будет послано оповещение о выборе, которое инициирует событие "ОбработкаВыбора" (у формы или элемента формы).
в) Третьим параметром можно указать ключ уникальности для поиска среди уже открытых форм. Если форма с таким ключом уникальности будет найдена, то будет возвращена именно она. Это удобно, если не нужно открывать новых форм выбора.
2. Вторая строка устанавливает режим, при котором после выбора значения форма не будет закрываться, т.е. это и и есть основная функция подбора. При множественном выборе это свойство имеет смысл установить в Истина, но об этом ниже. Здесь же можно присвоить и другие свойства открываемой формы, например, расположение на экране, задать значения реквизитов формы или экспортных переменных модуля формы.
3. Третья строка открывает форму выбора. После первой строки форма еще не была открыта, но ее модуль уже был скомпилирован и инициализирован.
В свойствах формы должен быть назначен обработчик события "ОбработкаВыбора".
2. Множественный выбор
При таком выборе пользователь может выделить сразу несколько элементов (например, с помощью клавиши Ctrl) и после нажатия кнопки "Выбрать" система вернет массив выбранных элементов, а не один элемент, как в первом случае.
Тогда обработчик события ОбработкаВыбора можно написать так:
Примечание: Для ручной генерации события выбора из формы подбора нужно использовать функцию ОповеститьОВыборе.
При выборе ссылочного значения в поле ввода иногда возникает необходимость специальным образом обработать выбирамемое значение.
Например, в документе, нужно выбрать поставщика. Но нужно вмешаться в процесс выбора значения и кроме ссылки на поставщика получить еще и другую информацию о поставщике. Например, его полное наименование и ИНН, которые являются реквизитами поставщика.
Для того, чтобы вмешаться в процесс выбора значения используется событие ОбработкаВыбора элемента формы Поле. Это событие поставляется расширением поля ввода. Обработчик этого события имеет такой синтаксис:
Во втором параметре (ВыбранноеЗначение) платформа передает в обработчик то значение, которое выбрал пользователь. В данном случае это будет ссылка на поставщика.
Но проблема заключается в том, что обработчик ОбработкаВыбора исполняется на клиенте, то есть объявление процедуры выглядит так:
А на клиенте возможности ссылки очень сильно ограничены. В частности, от нее нельзя через точку получить значения реквизитов.
Поэтому для того, чтобы в этой ситуации получить значения реквизитов ссылки, нужно из этого обработчика вызвать серверную функцию и в ней получить нужные реквизиты. Например так:
При этом следует иметь ввиду два момента:
- Во-первых, для получения реквизитов используется неконтекстный серверный вызов (&НаСервереБезКонтекста). Это важно, т.к. в этом обработчике нельзя использовать контекстные серверные вызовы (&НаСервере).
- Во-вторых, любое обращение к серверу требует дополнительных ресурсов системы и может замедлять работу пользователя, особенно в случае подключения по низкоскоростному каналу связи. Поэтому нужно прежде всего внимательно оценить, а так ли необходимо в этом месте получать реквизиты ссылки или можно обойтись без этого? И если нужно получать несколько реквизитов и при этом используется какой-то сложный алгоритм – нужно постараться реализовать его так, чтобы все необходимые данные получить за один серверный вызов, вернуть их на клиента и на клиенте только поместить их в нужные поля формы, не проводя каких-то сложных вычислений.
Подробнее об использовании метода ОбработкаВыбора можно прочитать в синтакс-помощнике: Интерфейс (управляемый) - Поле формы - Расширение поля ввода - События:
Для иллюстрации механизма подбора информации в форме будем использовать задачу подбора элементов справочника Номенклатура в табличную часть документа ПриходнаяНакладная как наиболее распространенную. Поскольку механизм подбора реализован на уровне форм, то в других случаях просто будут задействованы иные прикладные объекты. Сама механика подбора не изменится.
Для организации подбора в форму документа следует открыть форму справочника как подчиненную форме документа в целом либо одному из элементов формы. Способ получения формы справочника может быть любым, также как и сама форма справочника, которая будет использована. Важно лишь то, что эта форма должна быть открыта как подчиненная.
Результат подбора будет доступен в обработчике события ОбработкаВыбора формы документа или элемента формы (в зависимости от того, чему мы подчиним форму справочника при открытии). Событие ОбработкаВыбора в форме документа будет вызвано в двух случаях:
- когда в форме справочника будет выполнен интерактивный выбор;
- когда в форме справочника будет вызван метод ОповеститьОВыборе .
Одиночный подбор
При одиночном подборе форма справочника будет закрываться сразу после выбора элемента. Для выбора следующего элемента необходимо будет снова инициировать подбор.
Откроем форму документа ПриходнаяНакладная , создадим команду Подбор и назначим для нее обработчик:
В этой процедуре мы открываем форму выбора для справочника Номенклатура , указывая, что она подчинена таблице Материалы формы документа ПриходнаяНакладная ( Элементы.Материалы ). При выборе из формы выбора справочника выбранное значение будет передано в обработчик события ОбработкаВыбора таблицы формы Материалы , так как она является владельцем открытой формы выбора.
Поэтому откроем палитру свойств таблицы Материалы и создадим обработчик события ОбработкаВыбора :
В этой процедуре мы добавляем новую строку в таблицу Материалы и присваиваем колонке Материал в новой строке выбранное в форме выбора справочника значение. Это значение передается в обработчик события в параметре ВыбранноеЗначение .
Множественный подбор
При множественном подборе форма справочника будет открыта до тех пор, пока пользователь не закроет ее интерактивно или не будет вызван метод формы Закрыть() .
Обработчик команды Подбор :
Обработчик события ОбработкаВыбора остается без изменений.
Подбор с использованием множественного выбора
Еще одним способом организации подбора является возможность выделения в списке сразу нескольких строк. Режим множественного выделения в списке устанавливается, как правило, во всех формах списков по умолчанию. Однако возможность выбрать сразу несколько элементов из списка по умолчанию, как правило, отключена.
Поэтому для того, чтобы в форме списка справочника Номенклатура можно было не только отметить, но и выбрать сразу несколько элементов, мы воспользуемся одним из параметров расширения формы динамического списка — МножественныйВыбор .
Обработчик команды Подбор :
Обработчик события ОбработкаВыбора :
Множественный подбор с использованием множественного выбора
Последний способ подбора сочетает в себе оба рассмотренных ранее способа. Мы будем отмечать сразу несколько элементов справочника и подбирать их в документ без закрытия формы выбора. Затем снова отмечать несколько элементов справочника и подбирать их в документ. Для этого нам будет необходимо при открытии формы выбора установить оба параметра: ЗакрыватьПриВыборе и МножественныйВыбор .
Обработчик команды Подбор :
Обработчик события ОбработкаВыбора остается без изменений.
Использование метода ОповеститьОВыборе()
Метод формы ОповеститьОВыборе() используется в тех случаях, когда алгоритм формирования данных подбора сложен и кроме собственно выбора элемента справочника от пользователя требуется указание некоторой дополнительной информации. В этом случае метод ОповеститьОВыборе() вызывается тогда, когда вся необходимая информация подбора сформирована.
Метод ОповеститьОВыборе() посылает оповещение владельцу формы о выполнении выбора или подбора, передает ему выбранное значение и закрывает форму, если она открыта не в режиме множественного выбора.
Также метод ОповеститьОВыборе() может использоваться в тех случаях, когда требуется передать в форму документа не только выбранный элемент справочника (или массив элементов), а некоторую произвольную структуру данных.
Справка
ТабличноеПоле.ДобавитьСтроку()
Добавляет строку в табличное поле, аналогично выполнению команды «Добавить».
- Если табличное поле связано с таблицей или деревом значений, метод добавляет строку в таблицу или дерево значений (аналогично соответствующим методам этих объектов).
- Если табличное поле связано со списком объектов, хранимых в базе данных, метод начинает редактирование нового объекта этого списка. (Например, список объектов в форме списка справочника, или документа).
- Если табличное поле связано с набором записей или табличной частью, то метод начинает редактирование новой записи. (Например, список записей в форме списка регистра сведений; табличная часть документа или справочника).
Доступность: Толстый клиент.
ДанныеФормыКоллекция.Добавить()
Добавляет элемент в конец коллекции и возвращает его в качестве результата метода. Возвращаемое значение: ДанныеФормыЭлементКоллекции .
Доступность: тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Пусть у нас есть есть документ ПриходнаяНакладная с табличной частью Состав . Для этого документа необходимо реализовать подбор номенклатур в табличную часть. Должна быть возможность переносить в документ несколько номенклатур за раз. То есть сначала пользователь подбирает номенклатуры в определенную таблицу, а затем по команде «Перенести в документ» данные из этой таблицы переносятся в табличную часть документа. При переносе в табличную часть, если номенклатура уже была добавлена ранее, нужно увеличить количество в этой строке на значение, указанное в подборе.
Рассмотрим два способа решения этой задачи: без обращения к серверу и с обращением к серверу.
Без обращения к серверу
Создадим форму списка у справочника Номенклатура не назначая ее основной. Добавим реквизит формы ПодобранныеНоменклатуры (тип ТаблицаЗначений ) и разместим соответствующий элемент формы. Для полей динамического списка ЭтоГруппа и Ссылка установим флаг ИспользоватьВсегда . Чуть позже станет понятно, для чего.
Все действия выбора будут сводиться к добавлению строки в таблицу ПодобранныеНоменклатуры элементов динамического списка. Если элемент уже был добавлен в таблицу, то увеличиваем его количество. Код обработки выбора элемента списка номенклатуры:
Форма подбора номенклатур вызывается из формы документа ПриходнаяНакладная по команде Подбор :
Когда в форме выбора необходимые номенклатуры подобраны, выполняется команда ПеренестиКлиент :
Теперь подобранные номенклатуры доступны в обработчике ОбработкаВыбора элемента формы документа:
С обращением к серверу
Отличия в реализации подбора будут в этом случае только в передаче данных в документ и, затем, обработки подобранных номенклатур в документе. Вот таким образом будет выглядеть команда передачи данных в документ из подбора:
Обработчик события ОбработкаВыбора элемента формы документа:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Добрый день. Конфигурация бух 3.0. Помогите пожалуйста разобраться с событием обработка выбора. При выборе значения из подчинённой формы не происходит действий на основной форме. Почему так? В основной форме открывается форма списка по команде:
&НаКлиенте
Процедура ЗаполнитьМаршрут(Команда)
Объект.ЭтапыРабот.Очистить(); //очистка табл части документа
ВыбФорма = ПолучитьФорму("Справочник.ТиповыеМаршрутыЗаявок_ЕО.Форма.ФормаВыбора"); //вызов формы выбора этапов
ВыбФорма.Открыть();
В форме выбора такой код:
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
ОповеститьОВыборе(ВыбранноеЗначение);
СтандартнаяОбработка = Ложь;
Так же в основной форме есть процедура обработка выбора
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
Если ТипЗнч(ЗначениеВыбора) = Тип("СправочникСсылка.ТиповыеМаршрутыЗаявок_ЕО") и ЗначениеЗаполнено(ЗначениеВыбора) Тогда
ОбработатьЗаполнениеСпискаЭтапов(ЗначениеВыбора, Объект.Дата);
КонецЕсли;
И последующее заполнение табличной части основной формы:
&НаКлиенте
Процедура ОбработатьЗаполнениеСпискаЭтапов(Маршрут, Дата)
Для Каждого ТекСтрока из Маршрут.Этапы Цикл
НовСтрока = Объект.ЭтапыРабот.Добавить();
НовСтрока.Этап = ТекСтрока.Этап;
НовСтрока.ВерсияЭтапа = 1;
НовСтрока.СледующийЭтап =ТекСтрока.СледующийЭтап;
НовСтрока.ВерсияСледующегоЭтапа = 1;
НовСтрока.ПервыйЭтап =ТекСтрока.ПервыйЭтап;
НовСтрока.Срок = ТекСтрока.Срок;
НовСтрока.ИсполнительРоль = ПолучитьИсполнителя(ТекСтрока.Этап, Дата);
НовСтрока.НазваниеДокумента = ТекСтрока.Этап.НазваниеДокументаРезультата;
КонецЦикла
ошибка в использовании подхода, применяемого в обычных формах.
не нужно открывать форму так как тут. для УФ реализовали ОткрытьФорму - в нем можно указать владельца формы - конкретный элемент текущей. тогда из формы выбора платформа автоматом передаст выбранное значение. и вот тогда сработает событие ОбработкаВыбора конкретного элемента
(1) И ещё небольшой дополнительный вопрос. бух 2.0 после выбора элемента в форме выбора переменная "ЗначениеВыбора" в процедуре "ОбработкаВыбора" принимается как ссылка на выбранный элемент, т.е. я могу обращаться к реквизитам : Актуальность, ВерсияДанных, Ссылка и т.д. Как я понял это реализовано через такой механизм формы выбора :
В бух 3.0 таких модулей я не обнаружил. Может я конечно и ошибаюсь, но как ещё можно получить значение выбора с возможностью обращения к реквизитам полученного объекта?
Читайте также: