ФормаКлиентскогоПриложения.ВыбратьИзСпискаАсинх

Методы · ChooseFromListAsync

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

Синтаксис

ВыбратьИзСпискаАсинх(<СписокЗначений>, <ЭлементФормы>, <НачальноеЗначение>)
Полное описание, параметры и ограничения

ФормаКлиентскогоПриложения.ВыбратьИзСпискаАсинх (ClientApplicationForm.ChooseFromListAsync)

ФормаКлиентскогоПриложения (ClientApplicationForm)

ВыбратьИзСпискаАсинх (ChooseFromListAsync)

Доступен, начиная с версии 8.3.18.

Синтаксис:
ВыбратьИзСпискаАсинх(<СписокЗначений>, <ЭлементФормы>, <НачальноеЗначение>)
Параметры:

<СписокЗначений> (обязательный)
Тип: СписокЗначений.
Список значений, содержащий значения, из которых будет осуществляться выбор.

<ЭлементФормы> (необязательный)
Тип: ГруппаФормы, ТаблицаФормы, ПолеФормы, КнопкаФормы.
Элемент формы, около которого будет открыт выпадающий список. Для некоторых элементов выпадающий список будет показан около активной области.
Если не указан, то будет выбран активный элемент формы.
Примечание: В качестве этого параметра нельзя указывать кнопки, расположенные в командной панели или подменю.

<НачальноеЗначение> (необязательный)
Тип: Число, ЭлементСпискаЗначений.
Задает начальный элемент, который будет активным при открытии списка.
Если параметр не указан, в списке не будет выбрано начальное значение.
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - выбранный элемент списка или Неопределено, если пользователь отказался от выбора.
Описание:

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

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент.

См. также:
ФормаКлиентскогоПриложения, метод ВыбратьИзСписка
ФормаКлиентскогоПриложения, метод ПоказатьВыборИзСписка

Использование в версии:

Доступен, начиная с версии 8.3.18.

Методическая информация

Практические примеры

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

ВыбратьИзСпискаАсинх возвращает обещание выбранного элемента. Начальный элемент задаём объектом списка, отмена и изменившееся количество не перезаписывают данные.

Где и как запускать

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

Подготовка

  1. В отдельной учебной базе платформы 8.5.1.1343 создайте внешнюю обработку УчебнаяФорма85 с пустой управляемой основной формой. Используйте тонкий клиент Windows.

  2. В свойствах формы → События назначьте ПриСозданииНаСервере. Вставьте полный модуль урока, включая клиентские и серверные помощники, на уровне модуля.

  3. Не создавайте вручную ЗначениеПримера, ПолеПримера и кнопку: код создаёт их полностью. Каждый урок запускайте в отдельной копии своей формы.

  4. Сохраните свою EPF и откройте её в учебной базе. Собственное количество начинается с 3, цена книги задана в коде как 250; исходный расчёт равен 750.

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

  6. Команда расчёта имеет ИзменяетСохраняемыеДанные = Ложь. Уроки изменяют только свой интерфейс и значения собственной формы, не конфигурацию и не рабочие данные.

  7. Запуск и вид в 1С не проверены. Компоновку, сочетания клавиш и расположение команд осмотрите вручную в указанном клиенте; не переносите настройки на рабочие формы без отдельной проверки.

Перем Занято;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Новые = Новый Массив;
    ТипРеквизита = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный));
    Новые.Добавить(Новый РеквизитФормы("ЗначениеПримера", ТипРеквизита, "", "Количество книг", Истина));
    ЭтаФорма.ИзменитьРеквизиты(Новые);
    ЭтаФорма.ЗначениеПримера = 3;
    Поле = Элементы.Добавить("ПолеПримера", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеВвода;
    Поле.ПутьКДанным = "ЗначениеПримера";
    Поле.Заголовок = "Количество собственных книг";


    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Выполнить собственный учебный шаг";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

&НаКлиенте
Асинх Процедура УчебноеДействие(Команда)
    Если Занято = Истина Тогда
        Возврат;
    КонецЕсли;
    Занято = Истина;
    Элементы.КнопкаУчебноеДействие.Доступность = Ложь;
    ДоВыбора = ЗначениеПримера;
    Варианты = Новый СписокЗначений;
    Варианты.Добавить(3, "Три учебные книги — 750");
    Варианты.Добавить(5, "Пять учебных книг — 1250");
    Попытка
        Выбор = Ждать ЭтаФорма.ВыбратьИзСпискаАсинх(Варианты, Элементы.ПолеПримера, Варианты.Получить(0));
    Исключение
        Занято = Ложь;
        Элементы.КнопкаУчебноеДействие.Доступность = Истина;
        ВызватьИсключение;
    КонецПопытки;
    Занято = Ложь;
    Элементы.КнопкаУчебноеДействие.Доступность = Истина;
    Если Выбор = Неопределено Тогда
        Сообщить("Выбор отменён: собственное количество не изменено");
        Возврат;
    КонецЕсли;
    Если ЗначениеПримера <> ДоВыбора Тогда
        Сообщить("Количество изменилось за время выбора. Повторите выбор для актуального значения");
        Возврат;
    КонецЕсли;
    Количество = Выбор.Значение;
    Если ТипЗнч(Количество) <> Тип("Число") Тогда
        ВызватьИсключение "Выбор должен содержать число, а не видимую подпись";
    КонецЕсли;
    Если Количество <> 3 И Количество <> 5 Тогда
        ВызватьИсключение "Неожиданное значение учебного списка";
    КонецЕсли;
    ЗначениеПримера = Количество;
    Если ТипЗнч(ЗначениеПримера) <> Тип("Число") Тогда
        ВызватьИсключение "Собственное количество должно быть числом";
    КонецЕсли;
    Если ЗначениеПримера < 1 ИЛИ ЗначениеПримера > 10 ИЛИ ЗначениеПримера <> Цел(ЗначениеПримера) Тогда
        ВызватьИсключение "Для учебного расчёта выберите целое количество от 1 до 10";
    КонецЕсли;
    Цена = 250;
    Сумма = ЗначениеПримера * Цена;
    Сообщить(Сумма >= 250 И Сумма <= 2500);
    Сообщить(Сумма / Цена = ЗначениеПримера);
    Сообщить(СтрШаблон("Собственные книги: %1 × %2 = %3", ЗначениеПримера, Цена, Сумма));

КонецПроцедуры

Разбор по шагам

  1. Создаём свой список из чисел 3 и 5 с понятными подписями сумм. Подпись Три учебные книги — 750 не является сохранённым значением.

  2. Запоминаем количество до выбора и временно отключаем только кнопку запуска. Поле остаётся доступным, поэтому изменение во время выбора проверяется отдельно.

  3. Передаём поле ввода как якорь и Варианты.Получить(0) как начальный элемент. Это объект элемента списка, не произвольное начальное число количества.

  4. Ждать получает элемент либо Неопределено. Сначала обрабатываем отмену и проверяем актуальность сохранённого значения, затем читаем Выбор.Значение.

  5. После проверки допустимых 3 или 5 изменяем только собственный реквизит и рассчитываем 750 или 1250. Кнопка восстанавливается также при исключении.

Как проверить результат

  1. Выберите второй элемент: количество 5, две Истина и 1250. Выберите первый: 3 и 750.

  2. Отмените список: текущее количество остаётся прежним. Если значение поменялось во время ожидания, ожидается предложение повторить выбор без перезаписи.

Ожидаемый результат

Настоящий выпадающий список формы участвует в проверяемом собственном расчёте с веткой отмены.

На что обратить внимание

  1. НачальноеЗначение имеет тип Число или ЭлементСпискаЗначений; здесь используем элемент, чтобы не смешать индекс с количеством книг.

  2. Кнопки командной панели и подменю не подходят для якоря этого метода.

  3. Метод СписокЗначений.ВыбратьЭлементАсинх — другой контракт: его не подменяем методом самой формы.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

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

Два кода A-01/B-02 отделены от представлений Книга/Ручка. Меню и список возвращают элемент списка, а отмена сохраняет прежний выбор. В списке начальный элемент — собственная Ручка, не произвольный номер строки.

Где и как запускать

Полный модуль своей управляемой формы. Только перечисленные клиентские режимы; не запускался.

Подготовка

  1. Создайте НОВУЮ пустую учебную конфигурацию УчебныеФормы85 на платформе 8.5.1.1343. Бизнес-объектов, расширений, подписок и регламентных заданий нет. Для уроков подбора добавьте только собственную обработку УчебныйПодбор85 и две обычные формы Пульт/Подбор. Другие уроки используют отдельные новые внешние обработки. Рабочие УТ, КА, УНФ и БП не изменяйте. Здесь никакие формы или базы не создавались и код не запускался: runtimeVerifiedScenarios=0.

  2. Создайте общий модуль УчебныеФормы85: Клиент (обычное приложение)=Да, Сервер=Да, Глобальный=Нет, Вызов сервера=Нет. Вставьте целиком отдельный модуль проверки стенда ниже. Обычная форма вызывает его в толстом клиенте; управляемая — только из серверного события создания.

  3. Создайте новую внешнюю обработку с управляемой формой. Добавьте реквизиты ВыбранныйКод (Строка,10) и Название (Строка,40), поле ввода ПолеКода с привязкой к ВыбранныйКод и отдельное поле Название. Именно ПолеКода будет якорем раскрываемого списка.

  4. Создайте команды и кнопки Меню и Список, свяжите одноимённые обработчики. Также добавьте МенюАсинх и СписокАсинх. Событие ПриСозданииНаСервере свяжите с одноимённой процедурой.

  5. Для синхронных методов управляемой формы нужен отдельный учебный режим РежимИспользованияМодальности=Использовать и тонкий/толстый клиент, не веб-клиент. Не меняйте эту настройку рабочей конфигурации ради старых вызовов. При НеИспользовать и в веб-клиенте выбирайте только асинхронные команды.

  6. Вставьте целиком основной код в модуль формы и проверьте 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 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. СоздатьСвойСписок добавляет две настоящие пары значение/представление: A-01/Книга и B-02/Ручка. Значение не совпадает с подписью, поэтому в реквизит записывается именно код.

  2. Меню вызывает метод этой подготовленной формы около собственного поля ввода. Кнопка командной панели не передаётся как якорь: нативная справка это запрещает.

  3. Список передаёт Начальный — элемент, полученный из того же списка через НайтиПоЗначению("B-02"). Это не строка B-02 вместо элемента и не индекс из чужой таблицы.

  4. ПринятьЭлемент сначала обрабатывает Неопределено. При отмене реквизиты остаются прежними. При выборе проверяет тип, код и соответствие представления собственной паре, затем заполняет ВыбранныйКод/Название.

  5. В асинхронных командах Ждать получает результат обещания; без Ждать это не выбранный элемент.

Как проверить результат

  1. В будущем ручном запуске выберите Книгу: A-01/Книга. Затем Ручку: B-02/Ручка. Не ожидайте, что метод вернёт голую строку вместо ЭлементСпискаЗначений.

  2. После выбора откройте меню и отмените его: оба прежних реквизита должны сохраниться. При открытии списка должна быть выбрана Ручка; наличие начального элемента не отменяет право пользователя выбрать Книгу или отменить выбор.

  3. В управляемом варианте сравните синхронные и асинхронные команды только в разрешённых режимах. Веб-клиент проверяйте отдельно асинхронным вариантом; здесь интерфейс не запускался.

Ожидаемый результат

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

На что обратить внимание

  1. Синхронные методы управляемой формы не являются вариантом для веб-клиента или режима НеИспользовать.

  2. ЭлементСпискаЗначений, его Значение и его Представление — разные сущности. Начальный элемент должен принадлежать переданному списку.

  3. Подпись не используется как ключ. Этот учебный список содержит только две собственные строковые пары, а не произвольные внешние объекты.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.