Тип: Произвольный. Содержит начальное значение выбора, переданное в форму, открываемую для выбора или подбора значения из списка. При стандартном выборе значения в поле ввода или в ячейке табличного поля из связанной с ним формы выбора, в начальное значение выбора записывается значение поля. Если открытие формы выбора осуществляется из модуля, то начальное значение выбора необходимо устанавливать средствами языка до открытия формы выбора. Перед открытием формы (до события ПриОткрытии) система производит попытку позиционирования списка, связанного с основным реквизитом формы (если такой существует), на этом значении. Далее значение может быть обработано средствами языка в обработчике события ПриОткрытии.
Полное описание, параметры и ограничения
Форма.НачальноеЗначениеВыбора (Form.ChoiceInitialValue)
Форма (Form)
НачальноеЗначениеВыбора (ChoiceInitialValue)
Доступен, начиная с версии 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 используется только для своих экземпляров в данном опыте, не для поиска или закрытия произвольных чужих окон.
Модальный и немодальный результат идут разными путями. Не посылайте один результат одновременно через Закрыть(Код) и ОповеститьОВыборе.
Оповестить — широковещательное сообщение, не адресное и не граница безопасности. Наш фильтр предназначен для собственного пустого стенда; произвольным внешним данным нельзя доверять.
ЗакрыватьПриЗакрытииВладельца влияет на окна, не записывает бизнес-объекты. Урок не обещает отсутствия внутренних операций интерфейса или сохранения его положения.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.