Тип: Булево. Разрешает или запрещает выбор нескольких строк из табличных полей. Истина - разрешено.
Полное описание, параметры и ограничения
Форма.МножественныйВыбор (Form.MultipleChoice)
Форма (Form)
МножественныйВыбор (MultipleChoice)
Доступен, начиная с версии 8.0.
Использование:
Чтение и запись.
Описание:
Тип: Булево.
Разрешает или запрещает выбор нескольких строк из табличных полей.
Истина - разрешено.
Доступность:
Толстый клиент.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Собственный подбор: открыть окно и принять результат
Два полных модуля обычных форм работают с книгой и ручкой в памяти. Пульт управляет своими окнами; Подбор возвращает код, обрабатывает отмену и отправляет отфильтровываемое оповещение.
Где и как запускать
Полный модуль собственной обычной формы Пульт обработки УчебныйПодбор85. Только толстый клиент с обычными формами; не запускался.
Подготовка
Создайте НОВУЮ пустую учебную конфигурацию УчебныеФормы85 на платформе 8.5.1.1343. Бизнес-объектов, расширений, подписок и регламентных заданий нет. Для уроков подбора добавьте только собственную обработку УчебныйПодбор85 и две обычные формы Пульт/Подбор. Другие уроки используют отдельные новые внешние обработки. Рабочие УТ, КА, УНФ и БП не изменяйте. Здесь никакие формы или базы не создавались и код не запускался: runtimeVerifiedScenarios=0.
Создайте общий модуль УчебныеФормы85: Клиент (обычное приложение)=Да, Сервер=Да, Глобальный=Нет, Вызов сервера=Нет. Вставьте целиком отдельный модуль проверки стенда ниже. Обычная форма вызывает его в толстом клиенте; управляемая — только из серверного события создания.
В своей конфигурации создайте только обработку УчебныйПодбор85 с обычными формами Пульт и Подбор. Пульт: реквизит ВыбранныйКод (Строка,10), поле отображения и кнопки ОткрытьПодбор/МодальныйПодбор/ЗакрытьПодбор. Подбор: реквизит Товары типа ТаблицаЗначений, табличное поле ТаблицаТоваров с Данные=Товары и кнопки Выбрать/Отмена. Рабочий справочник не нужен.
В Пульт назначьте одноимённые действия кнопок и события ПриОткрытии, ОбработкаВыбора, ОбработкаОповещения. В Подбор назначьте Выбрать/Отмена; обработчик ПриОткрытии программно устанавливает Пульт. Процедура ПриОткрытии в Подбор содержит Экспорт и не имеет параметров — этого требует УстановитьДействие.
Вставьте оба полных модуля в соответствующие формы, отдельно от общего модуля проверки. Основная форма обработки — Пульт. Проверьте F7 и запускайте только толстым клиентом в обычном приложении. Не открывайте Подбор самостоятельно: подготовку владельца и режима выполняет Пульт.
Перем Подбор;
Перем КлючПодбора;
Процедура ПриОткрытии()
УчебныеФормы85.ПроверитьСвойПустойСтенд();
Если Метаданные.Обработки.Количество() <> 1 Или Метаданные.Обработки[0].Имя <> "УчебныйПодбор85" Тогда
ВызватьИсключение "Подготовьте только собственную обработку УчебныйПодбор85";
КонецЕсли;
КлючПодбора = Новый УникальныйИдентификатор;
Подбор = Неопределено;
ВыбранныйКод = "";
КонецПроцедуры
Функция ПодготовитьПодбор()
Если Подбор <> Неопределено И Подбор.Открыта() Тогда
Если Подбор.МодальныйРежим Тогда
ВызватьИсключение "Сначала завершите свой модальный выбор";
КонецЕсли;
Возврат Подбор;
КонецЕсли;
Подбор = Обработки.УчебныйПодбор85.ПолучитьФорму("Подбор", ЭтаФорма.ЭтаФорма, КлючПодбора);
Если ТипЗнч(Подбор) <> Тип("Форма") Тогда
ВызватьИсключение "Не получена собственная обычная форма Подбор";
КонецЕсли;
Подбор.ВладелецФормы = ЭтаФорма;
Подбор.КлючУникальности = КлючПодбора;
Подбор.ЗакрыватьПриЗакрытииВладельца = Истина;
Подбор.РежимВыбора = Истина;
Подбор.МножественныйВыбор = Ложь;
Подбор.ЗакрыватьПриВыборе = Истина;
Подбор.НачальноеЗначениеВыбора = "B-02";
Подбор.АвтоЗаголовок = Ложь;
Подбор.Заголовок = "Выберите собственную книгу или ручку";
Подбор.УстановитьДействие("ПриОткрытии", Новый Действие("ПриОткрытии"));
Если ТипЗнч(Подбор.ВладелецФормы) <> Тип("Форма") Или Подбор.КлючУникальности <> КлючПодбора
Или ТипЗнч(Подбор.ПолучитьДействие("ПриОткрытии")) <> Тип("Действие") Тогда
ВызватьИсключение "Не совпал владелец, ключ или обработчик собственной формы";
КонецЕсли;
Если Не Подбор.ЗакрыватьПриЗакрытииВладельца Или Не Подбор.РежимВыбора
Или Подбор.МножественныйВыбор Или Не Подбор.ЗакрыватьПриВыборе
Или Подбор.НачальноеЗначениеВыбора <> "B-02" Или Подбор.АвтоЗаголовок
Или Подбор.Заголовок <> "Выберите собственную книгу или ручку" Тогда
ВызватьИсключение "Не совпал собственный профиль одиночного подбора";
КонецЕсли;
Возврат Подбор;
КонецФункции
Процедура ОткрытьПодбор(Кнопка)
ФормаПодбора = ПодготовитьПодбор();
Если Не ФормаПодбора.Открыта() Тогда
ФормаПодбора.Открыть();
Иначе
ФормаПодбора.Активизировать();
КонецЕсли;
Сообщить("Доступность ввода в своём подборе: " + Строка(ФормаПодбора.ВводДоступен()));
КонецПроцедуры
Процедура МодальныйПодбор(Кнопка)
ФормаПодбора = ПодготовитьПодбор();
Если ФормаПодбора.Открыта() Тогда
Сообщить("Закройте свой немодальный подбор перед отдельным модальным опытом");
Возврат;
КонецЕсли;
Код = ФормаПодбора.ОткрытьМодально(120);
Если Код = Неопределено Тогда
Сообщить("Отмена или таймаут; прежний код сохранён");
Возврат;
КонецЕсли;
ПринятьКод(Код);
КонецПроцедуры
Процедура ЗакрытьПодбор(Кнопка)
Если Подбор <> Неопределено И Подбор.Открыта() Тогда
Подбор.Закрыть();
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
Если ТипЗнч(Источник) <> Тип("Форма") Или Источник.КлючУникальности <> КлючПодбора Тогда
Возврат;
КонецЕсли;
ПринятьКод(ЗначениеВыбора);
КонецПроцедуры
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия <> "УчебныйПодбор85.ПозицияВыбрана" Или ТипЗнч(Параметр) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Если Не Параметр.Свойство("Ключ", Ключ) Или Ключ <> КлючПодбора
Или Не Параметр.Свойство("Код", Код) Или ТипЗнч(Источник) <> Тип("Форма")
Или Источник.КлючУникальности <> КлючПодбора Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Код) = Тип("Строка") И (Код = "A-01" Или Код = "B-02") Тогда
Сообщить("Общее оповещение о своей позиции: " + Код);
КонецЕсли;
КонецПроцедуры
Процедура ПринятьКод(Код)
Если ТипЗнч(Код) <> Тип("Строка") Или (Код <> "A-01" И Код <> "B-02") Тогда
ВызватьИсключение "Подбор должен вернуть только собственный A-01 или B-02";
КонецЕсли;
ВыбранныйКод = Код;
Сообщить("Принят код: " + ВыбранныйКод);
КонецПроцедурыУчебныйПодбор85.Подбор
Своя обработка УчебныйПодбор85 → Формы → Подбор → Модуль
Полный отдельный модуль второй обычной формы; не вставлять в основной модуль этого урока. Не выполнялся.
Процедура ПриОткрытии() Экспорт
УчебныеФормы85.ПроверитьСвойПустойСтенд();
Товары = Новый ТаблицаЗначений;
Товары.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
Товары.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
Товары.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Товары.Колонки.Добавить("Выбран", Новый ОписаниеТипов("Булево"));
Книга = Товары.Добавить();
Книга.Код = "A-01";
Книга.Наименование = "Книга";
Книга.Количество = 3;
Книга.Выбран = Ложь;
Ручка = Товары.Добавить();
Ручка.Код = "B-02";
Ручка.Наименование = "Ручка";
Ручка.Количество = 1;
Ручка.Выбран = Ложь;
Таблица = ЭтаФорма.ЭлементыФормы.ТаблицаТоваров;
Таблица.СоздатьКолонки();
Таблица.АвтоВводНовойСтроки = Ложь;
Если Товары.Количество() <> 2 Тогда
ВызватьИсключение "Ожидались два собственных учебных товара";
КонецЕсли;
Таблица.ТекущаяСтрока = Товары[0];
Если Не ЭтаФорма.РежимВыбора Или ЭтаФорма.МножественныйВыбор
Или ТипЗнч(ЭтаФорма.ВладелецФормы) <> Тип("Форма") Тогда
ВызватьИсключение "Откройте собственный одиночный подбор только из Пульта";
КонецЕсли;
Начальная = Товары.Найти(ЭтаФорма.НачальноеЗначениеВыбора, "Код");
Если Начальная = Неопределено Тогда
ВызватьИсключение "Начальный код не принадлежит своей таблице";
КонецЕсли;
Таблица.ТекущаяСтрока = Начальная;
Таблица.ТолькоПросмотр = Истина;
КонецПроцедуры
Процедура Выбрать(Кнопка)
Таблица = ЭтаФорма.ЭлементыФормы.ТаблицаТоваров;
Строка = Таблица.ТекущаяСтрока;
Если Строка = Неопределено Тогда
Сообщить("Выберите собственную строку");
Возврат;
КонецЕсли;
Если Товары.Количество() <> 2 Или (Строка.Код <> "A-01" И Строка.Код <> "B-02") Тогда
ВызватьИсключение "Изменился собственный источник подбора";
КонецЕсли;
Пакет = Новый Структура("Ключ,Код", ЭтаФорма.КлючУникальности, Строка.Код);
Оповестить("УчебныйПодбор85.ПозицияВыбрана", Пакет, ЭтаФорма);
Если ЭтаФорма.МодальныйРежим Тогда
ЭтаФорма.Закрыть(Строка.Код);
Иначе
ЭтаФорма.ОповеститьОВыборе(Строка.Код);
КонецЕсли;
КонецПроцедуры
Процедура Отмена(Кнопка)
ЭтаФорма.Закрыть();
КонецПроцедурыУчебныеФормы85.ПроверкаСтенда
Своя пустая конфигурация УчебныеФормы85 → Общие → Общие модули → УчебныеФормы85
Полный общий модуль: обычный клиент и сервер, без глобального доступа и вызова сервера. Не выполнялся.
Процедура ПроверитьСвойПустойСтенд() Экспорт
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Пульт получает именно собственную обычную форму Подбор через менеджер подготовленной обработки. Владелец — текущий Пульт, ключ — свой UUID. Повторное обращение не плодит окна: уже открытый подбор активизируется.
ВладелецФормы, КлючУникальности и ЗакрыватьПриЗакрытииВладельца задают связь двух своих окон. ЭтаФорма.ЭтаФорма в аргументе владельца показывает документированное свойство, возвращающее саму обычную форму; обычно достаточно контекстного ЭтаФорма.
Пульт задаёт одиночный режим, авто-закрытие после выбора и НачальноеЗначениеВыбора=B-02. Подбор вручную находит этот код в собственной таблице и выбирает Ручку: автоматическое позиционирование главного списка здесь не обещается.
РежимВыбора проверяется собственным обработчиком; фактический результат передаёт отдельная кнопка. Сам по себе флаг не превращает произвольную таблицу в стандартный главный список выбора. МножественныйВыбор=Ложь оставляет одиночный опыт.
УстановитьДействие связывает событие ПриОткрытии с экспортной процедурой именно модуля Подбор. ПолучитьДействие проверяет тип назначенного действия, но не выдумывает недокументированное поле с именем обработчика.
Немодальный результат поступает в ОбработкаВыбора владельца через ОповеститьОВыборе; форма закрывается по ЗакрыватьПриВыборе. Модальный опыт возвращает код через Закрыть(Код) → ОткрытьМодально(120), поэтому тот же код не посылается вторично через событие выбора.
Отмена и таймаут возвращают Неопределено и сохраняют прежний код. МодальныйРежим только читается. ВводДоступен выводит диагностическое фактическое значение, а не утверждение, что любая форма всегда активна.
Общее Оповестить отправляется всем созданным формам. Пульт фильтрует имя события, тип пакета, ключ своего подбора, источник и допустимый код. Это дополнительное диагностическое сообщение, а не второй способ повторно записать результат выбора.
Как проверить результат
В будущем ручном опыте ОткрытьПодбор показывает две собственные строки, начальная — Ручка. Выберите Книгу: Пульт получает A-01, Подбор закрывается. Повторное нажатие при открытом подборе должно активизировать это окно, не создать лишнее.
МодальныйПодбор открывается только после закрытия немодального окна. Выбор возвращает код; Отмена, крестик и таймаут 120 секунд должны сохранить прежний код. Не ждите таймаут в рабочей базе.
Для отрицательной проверки пакета на копии Подбор замените только имя события на ЧужоеСобытие: общий обработчик Пульта должен его игнорировать, а немодальное событие выбора продолжает свой отдельный маршрут. Не меняйте фильтр принимающей формы.
Закройте свой Пульт при немодальном Подбор: дочернее окно должно закрыться по своему флагу. Владельца открытой модальной формы нельзя закрыть до окончания дочернего выбора; не подменяйте этот запрет успешной проверкой.
Здесь формы, таймаут, активация, события и закрытие не запускались; это проверки для будущего ручного протокола, не утверждение о runtime.
Ожидаемый результат
Подготовлены два полных модуля Пульт/Подбор и проверка собственного стенда. Ожидается одиночный выбор, сохранение кода при отмене и корректный жизненный цикл собственных окон. runtimeVerifiedScenarios=0.
На что обратить внимание
Обычная Форма не равна ФормаКлиентскогоПриложения. Метод менеджера ПолучитьФорму из этого урока относится к толстому клиенту, не к тонкому/веб-клиенту.
UUID используется только для своих экземпляров в данном опыте, не для поиска или закрытия произвольных чужих окон.
Модальный и немодальный результат идут разными путями. Не посылайте один результат одновременно через Закрыть(Код) и ОповеститьОВыборе.
Оповестить — широковещательное сообщение, не адресное и не граница безопасности. Наш фильтр предназначен для собственного пустого стенда; произвольным внешним данным нельзя доверять.
ЗакрыватьПриЗакрытииВладельца влияет на окна, не записывает бизнес-объекты. Урок не обещает отсутствия внутренних операций интерфейса или сохранения его положения.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.