Асинхронная функция. Выбор значения из выпадающего списка. Набор значений для выбора задаются списком значений, выпадающий список будет расположен около переданого элемента формы или около его активной области.
Синтаксис
ВыбратьИзСпискаАсинх(<СписокЗначений>, <ЭлементФормы>, <НачальноеЗначение>)Полное описание, параметры и ограничения
ФормаКлиентскогоПриложения.ВыбратьИзСпискаАсинх (ClientApplicationForm.ChooseFromListAsync)
ФормаКлиентскогоПриложения (ClientApplicationForm)
ВыбратьИзСпискаАсинх (ChooseFromListAsync)
Доступен, начиная с версии 8.3.18.
Синтаксис:
ВыбратьИзСпискаАсинх(<СписокЗначений>, <ЭлементФормы>, <НачальноеЗначение>)
Параметры:
<СписокЗначений> (обязательный)
Тип: СписокЗначений.
Список значений, содержащий значения, из которых будет осуществляться выбор.
<ЭлементФормы> (необязательный)
Тип: ГруппаФормы, ТаблицаФормы, ПолеФормы, КнопкаФормы.
Элемент формы, около которого будет открыт выпадающий список. Для некоторых элементов выпадающий список будет показан около активной области.
Если не указан, то будет выбран активный элемент формы.
Примечание: В качестве этого параметра нельзя указывать кнопки, расположенные в командной панели или подменю.
<НачальноеЗначение> (необязательный)
Тип: Число, ЭлементСпискаЗначений.
Задает начальный элемент, который будет активным при открытии списка.
Если параметр не указан, в списке не будет выбрано начальное значение.
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - выбранный элемент списка или Неопределено, если пользователь отказался от выбора.
Описание:
Асинхронная функция. Выбор значения из выпадающего списка. Набор значений для выбора задаются списком значений, выпадающий список будет расположен около переданого элемента формы или около его активной области.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент.
См. также:
ФормаКлиентскогоПриложения, метод ВыбратьИзСписка
ФормаКлиентскогоПриложения, метод ПоказатьВыборИзСписка
Использование в версии:
Доступен, начиная с версии 8.3.18.
Методическая информация
Практические примеры
Выбрать собственное количество выпадающим списком формы
ВыбратьИзСпискаАсинх возвращает обещание выбранного элемента. Начальный элемент задаём объектом списка, отмена и изменившееся количество не перезаписывают данные.
Где и как запускать
Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.
Подготовка
В отдельной учебной базе платформы 8.5.1.1343 создайте внешнюю обработку УчебнаяФорма85 с пустой управляемой основной формой. Используйте тонкий клиент Windows.
В свойствах формы → События назначьте ПриСозданииНаСервере. Вставьте полный модуль урока, включая клиентские и серверные помощники, на уровне модуля.
Не создавайте вручную ЗначениеПримера, ПолеПримера и кнопку: код создаёт их полностью. Каждый урок запускайте в отдельной копии своей формы.
Сохраните свою EPF и откройте её в учебной базе. Собственное количество начинается с 3, цена книги задана в коде как 250; исходный расчёт равен 750.
Связанный реквизит помечен как СохраняемыеДанные для изучения поведения формы. Это признак реквизита формы, а не автоматическая запись книги, файла или документа в базу.
Команда расчёта имеет ИзменяетСохраняемыеДанные = Ложь. Уроки изменяют только свой интерфейс и значения собственной формы, не конфигурацию и не рабочие данные.
Запуск и вид в 1С не проверены. Компоновку, сочетания клавиш и расположение команд осмотрите вручную в указанном клиенте; не переносите настройки на рабочие формы без отдельной проверки.
Перем Занято;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Новые = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный));
Новые.Добавить(Новый РеквизитФормы("ЗначениеПримера", ТипРеквизита, "", "Количество книг", Истина));
ЭтаФорма.ИзменитьРеквизиты(Новые);
ЭтаФорма.ЗначениеПримера = 3;
Поле = Элементы.Добавить("ПолеПримера", Тип("ПолеФормы"));
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "ЗначениеПримера";
Поле.Заголовок = "Количество собственных книг";
КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
КомандаДействия.Действие = "УчебноеДействие";
КомандаДействия.Заголовок = "Выполнить собственный учебный шаг";
КомандаДействия.Подсказка = "Действие только над данными учебной формы";
КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
Кнопка.ИмяКоманды = КомандаДействия.Имя;
Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры
&НаКлиенте
Асинх Процедура УчебноеДействие(Команда)
Если Занято = Истина Тогда
Возврат;
КонецЕсли;
Занято = Истина;
Элементы.КнопкаУчебноеДействие.Доступность = Ложь;
ДоВыбора = ЗначениеПримера;
Варианты = Новый СписокЗначений;
Варианты.Добавить(3, "Три учебные книги — 750");
Варианты.Добавить(5, "Пять учебных книг — 1250");
Попытка
Выбор = Ждать ЭтаФорма.ВыбратьИзСпискаАсинх(Варианты, Элементы.ПолеПримера, Варианты.Получить(0));
Исключение
Занято = Ложь;
Элементы.КнопкаУчебноеДействие.Доступность = Истина;
ВызватьИсключение;
КонецПопытки;
Занято = Ложь;
Элементы.КнопкаУчебноеДействие.Доступность = Истина;
Если Выбор = Неопределено Тогда
Сообщить("Выбор отменён: собственное количество не изменено");
Возврат;
КонецЕсли;
Если ЗначениеПримера <> ДоВыбора Тогда
Сообщить("Количество изменилось за время выбора. Повторите выбор для актуального значения");
Возврат;
КонецЕсли;
Количество = Выбор.Значение;
Если ТипЗнч(Количество) <> Тип("Число") Тогда
ВызватьИсключение "Выбор должен содержать число, а не видимую подпись";
КонецЕсли;
Если Количество <> 3 И Количество <> 5 Тогда
ВызватьИсключение "Неожиданное значение учебного списка";
КонецЕсли;
ЗначениеПримера = Количество;
Если ТипЗнч(ЗначениеПримера) <> Тип("Число") Тогда
ВызватьИсключение "Собственное количество должно быть числом";
КонецЕсли;
Если ЗначениеПримера < 1 ИЛИ ЗначениеПримера > 10 ИЛИ ЗначениеПримера <> Цел(ЗначениеПримера) Тогда
ВызватьИсключение "Для учебного расчёта выберите целое количество от 1 до 10";
КонецЕсли;
Цена = 250;
Сумма = ЗначениеПримера * Цена;
Сообщить(Сумма >= 250 И Сумма <= 2500);
Сообщить(Сумма / Цена = ЗначениеПримера);
Сообщить(СтрШаблон("Собственные книги: %1 × %2 = %3", ЗначениеПримера, Цена, Сумма));
КонецПроцедуры
Разбор по шагам
Создаём свой список из чисел 3 и 5 с понятными подписями сумм. Подпись Три учебные книги — 750 не является сохранённым значением.
Запоминаем количество до выбора и временно отключаем только кнопку запуска. Поле остаётся доступным, поэтому изменение во время выбора проверяется отдельно.
Передаём поле ввода как якорь и Варианты.Получить(0) как начальный элемент. Это объект элемента списка, не произвольное начальное число количества.
Ждать получает элемент либо Неопределено. Сначала обрабатываем отмену и проверяем актуальность сохранённого значения, затем читаем Выбор.Значение.
После проверки допустимых 3 или 5 изменяем только собственный реквизит и рассчитываем 750 или 1250. Кнопка восстанавливается также при исключении.
Как проверить результат
Выберите второй элемент: количество 5, две Истина и 1250. Выберите первый: 3 и 750.
Отмените список: текущее количество остаётся прежним. Если значение поменялось во время ожидания, ожидается предложение повторить выбор без перезаписи.
Ожидаемый результат
Настоящий выпадающий список формы участвует в проверяемом собственном расчёте с веткой отмены.
На что обратить внимание
НачальноеЗначение имеет тип Число или ЭлементСпискаЗначений; здесь используем элемент, чтобы не смешать индекс с количеством книг.
Кнопки командной панели и подменю не подходят для якоря этого метода.
Метод СписокЗначений.ВыбратьЭлементАсинх — другой контракт: его не подменяем методом самой формы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Выбрать книгу или ручку: управляемая форма
Два кода A-01/B-02 отделены от представлений Книга/Ручка. Меню и список возвращают элемент списка, а отмена сохраняет прежний выбор. В списке начальный элемент — собственная Ручка, не произвольный номер строки.
Где и как запускать
Полный модуль своей управляемой формы. Только перечисленные клиентские режимы; не запускался.
Подготовка
Создайте НОВУЮ пустую учебную конфигурацию УчебныеФормы85 на платформе 8.5.1.1343. Бизнес-объектов, расширений, подписок и регламентных заданий нет. Для уроков подбора добавьте только собственную обработку УчебныйПодбор85 и две обычные формы Пульт/Подбор. Другие уроки используют отдельные новые внешние обработки. Рабочие УТ, КА, УНФ и БП не изменяйте. Здесь никакие формы или базы не создавались и код не запускался: runtimeVerifiedScenarios=0.
Создайте общий модуль УчебныеФормы85: Клиент (обычное приложение)=Да, Сервер=Да, Глобальный=Нет, Вызов сервера=Нет. Вставьте целиком отдельный модуль проверки стенда ниже. Обычная форма вызывает его в толстом клиенте; управляемая — только из серверного события создания.
Создайте новую внешнюю обработку с управляемой формой. Добавьте реквизиты ВыбранныйКод (Строка,10) и Название (Строка,40), поле ввода ПолеКода с привязкой к ВыбранныйКод и отдельное поле Название. Именно ПолеКода будет якорем раскрываемого списка.
Создайте команды и кнопки Меню и Список, свяжите одноимённые обработчики. Также добавьте МенюАсинх и СписокАсинх. Событие ПриСозданииНаСервере свяжите с одноимённой процедурой.
Для синхронных методов управляемой формы нужен отдельный учебный режим РежимИспользованияМодальности=Использовать и тонкий/толстый клиент, не веб-клиент. Не меняйте эту настройку рабочей конфигурации ради старых вызовов. При НеИспользовать и в веб-клиенте выбирайте только асинхронные команды.
Вставьте целиком основной код в модуль формы и проверьте F7. Данные заданы в памяти; справочник Номенклатура, сервер обмена, картинки и файлы не нужны.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УчебныеФормы85.ПроверитьСвойПустойСтенд();
ВыбранныйКод = "";
Название = "";
КонецПроцедуры
&НаКлиенте
Процедура Меню(Команда)
Список = СоздатьСвойСписок();
Элемент = ЭтаФорма.ВыбратьИзМеню(Список, Элементы.ПолеКода);
ПринятьЭлемент(Элемент);
КонецПроцедуры
&НаКлиенте
Процедура Список(Команда)
Значения = СоздатьСвойСписок();
Начальный = Значения.НайтиПоЗначению("B-02");
Элемент = ЭтаФорма.ВыбратьИзСписка(Значения, Элементы.ПолеКода, Начальный);
ПринятьЭлемент(Элемент);
КонецПроцедуры
&НаКлиенте
Функция СоздатьСвойСписок()
Список = Новый СписокЗначений;
Список.Добавить("A-01", "Книга");
Список.Добавить("B-02", "Ручка");
Возврат Список;
КонецФункции
&НаКлиенте
Процедура ПринятьЭлемент(Элемент)
Если Элемент = Неопределено Тогда
Сообщить("Выбор отменён; прежний код сохранён");
Возврат;
КонецЕсли;
Если ТипЗнч(Элемент) <> Тип("ЭлементСпискаЗначений") Или ТипЗнч(Элемент.Значение) <> Тип("Строка") Тогда
ВызватьИсключение "Нужен элемент собственного списка с кодом-строкой";
КонецЕсли;
Список = СоздатьСвойСписок();
Проверенный = Список.НайтиПоЗначению(Элемент.Значение);
Если Проверенный = Неопределено Или Элемент.Представление <> Проверенный.Представление Тогда
ВызватьИсключение "Выбрано значение не из собственного списка";
КонецЕсли;
ВыбранныйКод = Элемент.Значение;
Название = Элемент.Представление;
Сообщить(ВыбранныйКод + " — " + Название);
КонецПроцедуры
&НаКлиенте
Асинх Процедура МенюАсинх(Команда)
Значения = СоздатьСвойСписок();
Элемент = Ждать ЭтаФорма.ВыбратьИзМенюАсинх(Значения, Элементы.ПолеКода);
ПринятьЭлемент(Элемент);
КонецПроцедуры
&НаКлиенте
Асинх Процедура СписокАсинх(Команда)
Значения = СоздатьСвойСписок();
Начальный = Значения.НайтиПоЗначению("B-02");
Элемент = Ждать ЭтаФорма.ВыбратьИзСпискаАсинх(Значения, Элементы.ПолеКода, Начальный);
ПринятьЭлемент(Элемент);
КонецПроцедурыУчебныеФормы85.ПроверкаСтенда
Своя пустая конфигурация УчебныеФормы85 → Общие → Общие модули → УчебныеФормы85
Полный общий модуль: обычный клиент и сервер, без глобального доступа и вызова сервера. Не выполнялся.
Процедура ПроверитьСвойПустойСтенд() Экспорт
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
СоздатьСвойСписок добавляет две настоящие пары значение/представление: A-01/Книга и B-02/Ручка. Значение не совпадает с подписью, поэтому в реквизит записывается именно код.
Меню вызывает метод этой подготовленной формы около собственного поля ввода. Кнопка командной панели не передаётся как якорь: нативная справка это запрещает.
Список передаёт Начальный — элемент, полученный из того же списка через НайтиПоЗначению("B-02"). Это не строка B-02 вместо элемента и не индекс из чужой таблицы.
ПринятьЭлемент сначала обрабатывает Неопределено. При отмене реквизиты остаются прежними. При выборе проверяет тип, код и соответствие представления собственной паре, затем заполняет ВыбранныйКод/Название.
В асинхронных командах Ждать получает результат обещания; без Ждать это не выбранный элемент.
Как проверить результат
В будущем ручном запуске выберите Книгу: A-01/Книга. Затем Ручку: B-02/Ручка. Не ожидайте, что метод вернёт голую строку вместо ЭлементСпискаЗначений.
После выбора откройте меню и отмените его: оба прежних реквизита должны сохраниться. При открытии списка должна быть выбрана Ручка; наличие начального элемента не отменяет право пользователя выбрать Книгу или отменить выбор.
В управляемом варианте сравните синхронные и асинхронные команды только в разрешённых режимах. Веб-клиент проверяйте отдельно асинхронным вариантом; здесь интерфейс не запускался.
Ожидаемый результат
Подготовлен полный модуль формы с выбором, начальным элементом и сохранением состояния при отмене; запуск в 1С не проверен.
На что обратить внимание
Синхронные методы управляемой формы не являются вариантом для веб-клиента или режима НеИспользовать.
ЭлементСпискаЗначений, его Значение и его Представление — разные сущности. Начальный элемент должен принадлежать переданному списку.
Подпись не используется как ключ. Этот учебный список содержит только две собственные строковые пары, а не произвольные внешние объекты.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.