В новой своей File лаборатории выбрать краткий/подробный профиль через собственную дочернюю форму; вернуть реальный ВыборНастроек, проверить ключ и всю readonly-returned Structure до применения UI настроек.
Где и как запускать
Тонкий управляемый клиент8.5.1.1343 и собственные &НаСервере guards двух NEW File common forms; только UI memory, без внешнего сервера/аккаунта/хранилищ.
Подготовка
В отдельной НОВОЙ одноразовой Windows VM вручную создайте НОВУЮ пустую File ИБ C:\1c-labs\OwnSettingsChoice4_bce39b0e-5b56-4efa-91e7-0bad794e073b\IB. Это не копия рабочей базы, не импорт типовой CF и не запуск в пользовательской базе. UUID в пути и версии — заданные маркеры своей лаборатории, а не выдуманный фактический UUID конфигурации; они не защищают от намеренной подмены, junction или копирования маркеров.
Конфигуратор → Конфигурация → свойства: Имя=УчебныйВыборНастроек85; Версия=OwnSettingsChoice4-14f20466-545f-4f68-98d2-69b233da4aca; ОсновнойРежимЗапуска=УправляемоеПриложение; РежимСовместимости=НеИспользовать; язык Русский. Создайте только две указанные общие формы и одну собственную роль УчебныйВыбор85Администратор с доступом к ним и Администрирование для own guards. Нет документов, справочников, журналов, регистров, констант, планов, бизнес-процессов, задач, отчетов, обработок, общих модулей/реквизитов, заданий, подписок и расширений. Нет регистрации системы взаимодействия или внешнего аккаунта.
Общие → Общие формы → УчебныйПросмотр85: управляемая форма. Реквизиты ТекущийКлюч85/Строка30, Заголовок85/Строка100, ЛимитСтрок85/Число2.0, Протокол85/неограниченная Строка; вывести как поля только для просмотра, протокол многострочный. Остановка85/Булево скрыт, исходно Ложь. Добавьте собственную команду ОткрытьВыбор85, Действие=ОткрытьВыбор85, связанную с кнопкой Открыть выбор. Вставьте весь CODE в модуль этой формы. ФормаВыбора85 объявлена с &НаКлиенте: это клиентская переменная модуля, не реквизит формы и не параметр серверного вызова.
В свойствах событий УчебныйПросмотр85 явно привяжите ПриСозданииНаСервере → ПриСозданииНаСервере и ОбработкаВыбора → ОбработкаВыбора. Создавая обработчик своей команды, сохраните автоматически созданный обязательный параметр Команда; код реально проверяет его native тип КомандаФормы, имя, строковое Действие и принадлежность текущей форме. На клиенте Действие только читается, не назначается. События и обработчики вручную не вызывайте.
Общие → Общие формы → УчебныйВыборПрофиля85: управляемая форма. Параметры формы → ТекущийКлюч85/Строка30. Реквизиты Остановка85 и Отправлено85/Булево скрыты, исходно Ложь. Команды ВыбратьКраткий85/Действие=ВыбратьКраткий85 и ВыбратьПодробный85/Действие=ВыбратьПодробный85; свяжите с кнопками Краткий и Подробный. Вставьте SELECTOR целиком; событие ПриСозданииНаСервере привяжите к одноименному обработчику.
Конфигурация → Открыть модуль управляемого приложения: вставьте APPLICATION целиком. Штатное ПриНачалеРаботыСистемы() без параметров открывает только свою форму просмотра. Обновите только свою новую пустую учебную CF, закройте Конфигуратор и запустите тонкий клиент8.5.1.1343 этой File ИБ. Если реальная строка регистрации ИБ отличается хотя бы форматированием от проверяемой File строки, будет честный отказ, не автоматическая нормализация/смена пути.
Серверные guards обеих форм проверяют платформу, имя/версию/UUID-маркеры/File путь, пустую структуру метаданных, ровно две own forms, отсутствие расширений и настоящие привязки событий. ПолучитьДействие документирован только на сервере, поэтому клиент его не вызывает. Startup отдельно проверяет свою платформу/File строку. ПолучитьФорму и ОткрытьФорму обращаются к внутренней серверной части платформы: не обещается отсутствие client/server обмена; серверы/аккаунты системы взаимодействия и внешняя сеть не используются.
Исходный просмотр: Краткий85, Краткий учебный список, лимит2. Это два собственных ключа произвольного native типа, выбранные самим приложением, а не зарегистрированные ID, записи БД или существующие настройки хранилища. Нажмите Открыть выбор: actual GetForm с настоящим владельцем и Уникальность=Истина получает новую own selector form или честный отказ. Реальный тип/имя/владелец/закрытие после выбора проверяются до Открыть().
Теперь в отдельном настоящем UI событии нажмите Подробный. Параметры формы native имеют тип ДанныеФормыСтруктура; код использует именно их метод Свойство и проверенный строковый текущий ключ, а не объявляет параметры обычной Структура. Native constructor создает настоящий ВыборНастроек с текущим Краткий85; RW КлючНастроек меняется на фактически выбранный Подробный85 и читается обратно.
ДополнительныеСвойства только для чтения: нельзя присвоить новую структуру самому свойству. Код получает настоящую mutable Структура из нового объекта. Ее начальная пустота не обещана справкой: actual Count=0 обязателен, иначе STOP. Через Вставить добавляются ровно Источник85/Строка, Заголовок85/Строка и ЛимитСтрок85/Число; фактическое повторное чтение свойства проверяет count3, все ключи/типы/значения до передачи.
ОповеститьОВыборе передает настоящий проверенный descriptor реальному владельцу и закрывает selector согласно native ЗакрыватьПриВыборе. В owner ОбработкаВыбора используются ОБА обязательных параметра: exact actual held SourceForm и реально переданный выбор. Владелец повторно проверяет полный пакет до применения любых новых реквизитов просмотра, затем читает обратно ключ/заголовок/лимит и выводит фактический протокол: Подробный85, Полный учебный список, лимит4.
После успешного выбора можно открыть следующую НОВУЮ форму выбора и нажать Краткий: текущий actual key Подробный85 пройдет constructor, RW изменится на Краткий85, применится лимит2. Это новые обычные UI события после нормального завершения, не retry после ошибки и не открытие/закрытие той же формы в одном BSL вызове. Нажатие того же профиля допустимо, но для изучения реального перехода выбирайте другой профиль.
Отмена/ручное закрытие selector без выбора не объявляется успехом: owner сохраняет удержанный источник и не открывает другой selector поверх него. Следующая попытка останавливает текущую форму. После любой ошибки sticky STOP текущей owner/selector, никаких уведомлений об успехе, повторов, автоматического закрытия/пересоздания/очистки или восстановления UI профиля. Частично измененные own UI реквизиты возможны; состояние окон после исключения не обещано. Не переоткрывайте формы для обхода остановки.
Здесь только учебные собственные объекты/формы в памяти и проверяемые скалярные настройки просмотра. Запись настроек в хранилище, запросы/изменение данных ИБ, регистрация/подключение системы взаимодействия, сеть и файловые операции не выполняются. VM/CF/ИБ/формы сейчас не создавались и1С не запускалась; результат описывает будущую ручную проверку, не подтвержденный runtime.
&НаСервере
Процедура ПроверитьСтенд85()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnSettingsChoice4_bce39b0e-5b56-4efa-91e7-0bad794e073b\IB"";" Тогда
ВызватьИсключение "Разрешена только собственная новая File ИБ8.5.1.1343 в отдельной учебной VM";
КонецЕсли;
Если Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0
Или Метаданные.ЖурналыДокументов.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0
Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0
Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0
Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0
Или Метаданные.ОбщиеМодули.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.Обработки.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0
Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0
Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0
Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0
Или Метаданные.Роли.Количество() <> 1 Или Метаданные.Роли.Найти("УчебныйВыбор85Администратор") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 2
Или Метаданные.ОбщиеФормы.Найти("УчебныйПросмотр85") = Неопределено
Или Метаданные.ОбщиеФормы.Найти("УчебныйВыборПрофиля85") = Неопределено Тогда
ВызватьИсключение "Нужны только две собственные учебные формы без объектов данных и чужих обработчиков";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Расширения в собственной лаборатории запрещены";
КонецЕсли;
Если ИмяФормы <> "ОбщаяФорма.УчебныйПросмотр85" И ИмяФормы <> "ОбщаяФорма.УчебныйВыборПрофиля85" Тогда
ВызватьИсключение "Не совпало действительное имя своей формы";
КонецЕсли;
Если ПолучитьДействие("ПриСозданииНаСервере") <> "ПриСозданииНаСервере" Тогда
ВызватьИсключение "Нужна настоящая привязка серверного события создания";
КонецЕсли;
Если ИмяФормы = "ОбщаяФорма.УчебныйПросмотр85" И ПолучитьДействие("ОбработкаВыбора") <> "ОбработкаВыбора" Тогда
ВызватьИсключение "Не привязано настоящее событие выбора владельца";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКоманду85(Команда, Имя)
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Тогда ВызватьИсключение "Нужна настоящая команда этой формы"; КонецЕсли;
Если ТипЗнч(Команда.Имя) <> Тип("Строка") Или ТипЗнч(Команда.Действие) <> Тип("Строка") Тогда
ВызватьИсключение "Нужны реальные строковые имя и действие команды";
КонецЕсли;
Если Команда.Имя <> Имя Или Команда.Действие <> Имя Или Команды.Найти(Имя) <> Команда Тогда
ВызватьИсключение "Команда или её действие не принадлежат собственному обработчику";
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьПрофиль85(Ключ)
Если ТипЗнч(Ключ) <> Тип("Строка") Тогда ВызватьИсключение "Собственный ключ профиля должен быть строкой"; КонецЕсли;
Если Ключ = "Краткий85" Тогда
Возврат Новый Структура("Ключ,Заголовок,Лимит", Ключ, "Краткий учебный список", 2);
ИначеЕсли Ключ = "Подробный85" Тогда
Возврат Новый Структура("Ключ,Заголовок,Лимит", Ключ, "Полный учебный список", 4);
КонецЕсли;
ВызватьИсключение "Такого собственного профиля нет";
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПроверитьВыбор85(Выбор)
Если ТипЗнч(Выбор) <> Тип("ВыборНастроек") Тогда ВызватьИсключение "Нужен настоящий native ВыборНастроек"; КонецЕсли;
Ключ = Выбор.КлючНастроек;
Профиль = ПолучитьПрофиль85(Ключ);
Дополнения = Выбор.ДополнительныеСвойства;
Если ТипЗнч(Дополнения) <> Тип("Структура") Тогда ВызватьИсключение "Native дополнительные свойства должны быть Структура"; КонецЕсли;
Если Дополнения.Количество() <> 3 Тогда ВызватьИсключение "Нужны ровно три собственных дополнительных поля"; КонецЕсли;
Если Не Дополнения.Свойство("Источник85", Источник)
Или Не Дополнения.Свойство("Заголовок85", Заголовок)
Или Не Дополнения.Свойство("ЛимитСтрок85", Лимит) Тогда
ВызватьИсключение "Не совпал полный набор собственных полей";
КонецЕсли;
Если ТипЗнч(Источник) <> Тип("Строка") Или ТипЗнч(Заголовок) <> Тип("Строка") Или ТипЗнч(Лимит) <> Тип("Число") Тогда
ВызватьИсключение "Не совпали фактические типы всех дополнительных значений";
КонецЕсли;
Если Источник <> "ОбщаяФорма.УчебныйВыборПрофиля85" Или Заголовок <> Профиль.Заголовок Или Лимит <> Профиль.Лимит Тогда
ВызватьИсключение "Дополнительные значения не соответствуют выбранному собственному профилю";
КонецЕсли;
Возврат Новый Структура("Ключ,Заголовок,Лимит", Ключ, Заголовок, Лимит);
КонецФункции
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Попытка
Если ТипЗнч(Отказ) <> Тип("Булево") Или ТипЗнч(СтандартнаяОбработка) <> Тип("Булево") Тогда
ВызватьИсключение "Нужны настоящие параметры создания формы выбора";
КонецЕсли;
Если Отказ Или Не СтандартнаяОбработка Тогда ВызватьИсключение "Создание собственного выбора отменено"; КонецЕсли;
ПроверитьСтенд85();
Если ТипЗнч(Параметры) <> Тип("ДанныеФормыСтруктура") Тогда ВызватьИсключение "Нужна native коллекция параметров формы, не Структура"; КонецЕсли;
Если Не Параметры.Свойство("ТекущийКлюч85", ТекущийКлюч) Тогда ВызватьИсключение "Не передан свой текущий профиль"; КонецЕсли;
ПолучитьПрофиль85(ТекущийКлюч);
Остановка85 = Ложь;
Отправлено85 = Ложь;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ВыбратьКраткий85(Команда)
Если Остановка85 Или Отправлено85 Тогда ВызватьИсключение "STOP или выбор уже отправлен"; КонецЕсли;
Попытка
ПроверитьКоманду85(Команда, "ВыбратьКраткий85");
ПередатьВыбор85("Краткий85");
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ВыбратьПодробный85(Команда)
Если Остановка85 Или Отправлено85 Тогда ВызватьИсключение "STOP или выбор уже отправлен"; КонецЕсли;
Попытка
ПроверитьКоманду85(Команда, "ВыбратьПодробный85");
ПередатьВыбор85("Подробный85");
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПередатьВыбор85(Ключ)
ПроверитьСтенд85();
Если Остановка85 Или Отправлено85 Тогда ВызватьИсключение "Передача этой формы уже остановлена"; КонецЕсли;
Если ТипЗнч(ВладелецФормы) <> Тип("ФормаКлиентскогоПриложения") Тогда ВызватьИсключение "Нужна реальная собственная форма-владелец"; КонецЕсли;
Если ВладелецФормы.ИмяФормы <> "ОбщаяФорма.УчебныйПросмотр85" Тогда ВызватьИсключение "Владелец не является собственным просмотром"; КонецЕсли;
Если ТипЗнч(Параметры) <> Тип("ДанныеФормыСтруктура") Тогда ВызватьИсключение "Нужны native ДанныеФормыСтруктура"; КонецЕсли;
Если Не Параметры.Свойство("ТекущийКлюч85", ТекущийКлюч) Тогда ВызватьИсключение "Нет собственного текущего ключа"; КонецЕсли;
ПолучитьПрофиль85(ТекущийКлюч);
Профиль = ПолучитьПрофиль85(Ключ);
Выбор = Новый ВыборНастроек(ТекущийКлюч);
Если ТипЗнч(Выбор) <> Тип("ВыборНастроек") Тогда ВызватьИсключение "Конструктор не подтвердил native тип"; КонецЕсли;
Если ТипЗнч(Выбор.КлючНастроек) <> Тип("Строка") Или Выбор.КлючНастроек <> ТекущийКлюч Тогда
ВызватьИсключение "Конструктор не сохранил реальный собственный текущий ключ";
КонецЕсли;
Выбор.КлючНастроек = Ключ;
Если ТипЗнч(Выбор.КлючНастроек) <> Тип("Строка") Или Выбор.КлючНастроек <> Ключ Тогда
ВызватьИсключение "Не подтвердилось фактическое изменение выбранного ключа";
КонецЕсли;
Дополнения = Выбор.ДополнительныеСвойства;
Если ТипЗнч(Дополнения) <> Тип("Структура") Тогда ВызватьИсключение "Native дополнительные свойства имеют другой тип"; КонецЕсли;
Если Дополнения.Количество() <> 0 Тогда ВызватьИсключение "В своем новом объекте уже есть неизвестные поля; это отказ"; КонецЕсли;
Дополнения.Вставить("Источник85", "ОбщаяФорма.УчебныйВыборПрофиля85");
Дополнения.Вставить("Заголовок85", Профиль.Заголовок);
Дополнения.Вставить("ЛимитСтрок85", Профиль.Лимит);
Прочитанный = ПроверитьВыбор85(Выбор);
Если Прочитанный.Ключ <> Ключ Или Прочитанный.Заголовок <> Профиль.Заголовок Или Прочитанный.Лимит <> Профиль.Лимит Тогда
ВызватьИсключение "Полный фактически прочитанный пакет не совпал с выбранным профилем";
КонецЕсли;
Отправлено85 = Истина;
ОповеститьОВыборе(Выбор);
КонецПроцедуры
Свой владелец получает и открывает выбор, проверяет и применяет результат
Общие → Общие формы → УчебныйПросмотр85 → Модуль
Тонкий управляемый клиент и own &НаСервере guards
&НаКлиенте
Перем ФормаВыбора85;
&НаСервере
Процедура ПроверитьСтенд85()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnSettingsChoice4_bce39b0e-5b56-4efa-91e7-0bad794e073b\IB"";" Тогда
ВызватьИсключение "Разрешена только собственная новая File ИБ8.5.1.1343 в отдельной учебной VM";
КонецЕсли;
Если Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0
Или Метаданные.ЖурналыДокументов.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0
Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0
Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0
Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0
Или Метаданные.ОбщиеМодули.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.Обработки.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0
Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0
Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0
Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0
Или Метаданные.Роли.Количество() <> 1 Или Метаданные.Роли.Найти("УчебныйВыбор85Администратор") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 2
Или Метаданные.ОбщиеФормы.Найти("УчебныйПросмотр85") = Неопределено
Или Метаданные.ОбщиеФормы.Найти("УчебныйВыборПрофиля85") = Неопределено Тогда
ВызватьИсключение "Нужны только две собственные учебные формы без объектов данных и чужих обработчиков";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Расширения в собственной лаборатории запрещены";
КонецЕсли;
Если ИмяФормы <> "ОбщаяФорма.УчебныйПросмотр85" И ИмяФормы <> "ОбщаяФорма.УчебныйВыборПрофиля85" Тогда
ВызватьИсключение "Не совпало действительное имя своей формы";
КонецЕсли;
Если ПолучитьДействие("ПриСозданииНаСервере") <> "ПриСозданииНаСервере" Тогда
ВызватьИсключение "Нужна настоящая привязка серверного события создания";
КонецЕсли;
Если ИмяФормы = "ОбщаяФорма.УчебныйПросмотр85" И ПолучитьДействие("ОбработкаВыбора") <> "ОбработкаВыбора" Тогда
ВызватьИсключение "Не привязано настоящее событие выбора владельца";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьКоманду85(Команда, Имя)
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Тогда ВызватьИсключение "Нужна настоящая команда этой формы"; КонецЕсли;
Если ТипЗнч(Команда.Имя) <> Тип("Строка") Или ТипЗнч(Команда.Действие) <> Тип("Строка") Тогда
ВызватьИсключение "Нужны реальные строковые имя и действие команды";
КонецЕсли;
Если Команда.Имя <> Имя Или Команда.Действие <> Имя Или Команды.Найти(Имя) <> Команда Тогда
ВызватьИсключение "Команда или её действие не принадлежат собственному обработчику";
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьПрофиль85(Ключ)
Если ТипЗнч(Ключ) <> Тип("Строка") Тогда ВызватьИсключение "Собственный ключ профиля должен быть строкой"; КонецЕсли;
Если Ключ = "Краткий85" Тогда
Возврат Новый Структура("Ключ,Заголовок,Лимит", Ключ, "Краткий учебный список", 2);
ИначеЕсли Ключ = "Подробный85" Тогда
Возврат Новый Структура("Ключ,Заголовок,Лимит", Ключ, "Полный учебный список", 4);
КонецЕсли;
ВызватьИсключение "Такого собственного профиля нет";
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПроверитьВыбор85(Выбор)
Если ТипЗнч(Выбор) <> Тип("ВыборНастроек") Тогда ВызватьИсключение "Нужен настоящий native ВыборНастроек"; КонецЕсли;
Ключ = Выбор.КлючНастроек;
Профиль = ПолучитьПрофиль85(Ключ);
Дополнения = Выбор.ДополнительныеСвойства;
Если ТипЗнч(Дополнения) <> Тип("Структура") Тогда ВызватьИсключение "Native дополнительные свойства должны быть Структура"; КонецЕсли;
Если Дополнения.Количество() <> 3 Тогда ВызватьИсключение "Нужны ровно три собственных дополнительных поля"; КонецЕсли;
Если Не Дополнения.Свойство("Источник85", Источник)
Или Не Дополнения.Свойство("Заголовок85", Заголовок)
Или Не Дополнения.Свойство("ЛимитСтрок85", Лимит) Тогда
ВызватьИсключение "Не совпал полный набор собственных полей";
КонецЕсли;
Если ТипЗнч(Источник) <> Тип("Строка") Или ТипЗнч(Заголовок) <> Тип("Строка") Или ТипЗнч(Лимит) <> Тип("Число") Тогда
ВызватьИсключение "Не совпали фактические типы всех дополнительных значений";
КонецЕсли;
Если Источник <> "ОбщаяФорма.УчебныйВыборПрофиля85" Или Заголовок <> Профиль.Заголовок Или Лимит <> Профиль.Лимит Тогда
ВызватьИсключение "Дополнительные значения не соответствуют выбранному собственному профилю";
КонецЕсли;
Возврат Новый Структура("Ключ,Заголовок,Лимит", Ключ, Заголовок, Лимит);
КонецФункции
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Попытка
Если ТипЗнч(Отказ) <> Тип("Булево") Или ТипЗнч(СтандартнаяОбработка) <> Тип("Булево") Тогда
ВызватьИсключение "Нужны настоящие параметры события создания";
КонецЕсли;
Если Отказ Или Не СтандартнаяОбработка Тогда ВызватьИсключение "Создание собственной формы отменено"; КонецЕсли;
ПроверитьСтенд85();
Профиль = ПолучитьПрофиль85("Краткий85");
ТекущийКлюч85 = Профиль.Ключ;
Заголовок85 = Профиль.Заголовок;
ЛимитСтрок85 = Профиль.Лимит;
Протокол85 = "Исходный собственный профиль: Краткий85; лимит2";
Остановка85 = Ложь;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьВыбор85(Команда)
Если Остановка85 Тогда ВызватьИсключение "STOP: повторные действия этой формы запрещены"; КонецЕсли;
Попытка
ПроверитьКоманду85(Команда, "ОткрытьВыбор85");
ПроверитьСтенд85();
ПолучитьПрофиль85(ТекущийКлюч85);
Если ФормаВыбора85 <> Неопределено Тогда ВызватьИсключение "Собственная форма выбора уже удерживается"; КонецЕсли;
ПараметрыВыбора = Новый Структура("ТекущийКлюч85", ТекущийКлюч85);
ФормаВыбора85 = ПолучитьФорму("ОбщаяФорма.УчебныйВыборПрофиля85", ПараметрыВыбора, ЭтотОбъект, Истина);
Если ТипЗнч(ФормаВыбора85) <> Тип("ФормаКлиентскогоПриложения") Тогда
ВызватьИсключение "Native GetForm вернул иной тип или отказ создания, а не свою новую форму";
КонецЕсли;
Если ФормаВыбора85.ИмяФормы <> "ОбщаяФорма.УчебныйВыборПрофиля85" Тогда ВызватьИсключение "Получена другая форма"; КонецЕсли;
Если ТипЗнч(ФормаВыбора85.ВладелецФормы) <> Тип("ФормаКлиентскогоПриложения") Тогда ВызватьИсключение "Нет настоящего владельца"; КонецЕсли;
Если ФормаВыбора85.ВладелецФормы <> ЭтотОбъект Тогда ВызватьИсключение "Форма выбора принадлежит другому владельцу"; КонецЕсли;
ФормаВыбора85.ЗакрыватьПриВыборе = Истина;
Если ТипЗнч(ФормаВыбора85.ЗакрыватьПриВыборе) <> Тип("Булево") Или Не ФормаВыбора85.ЗакрыватьПриВыборе Тогда
ВызватьИсключение "Не подтвердилось штатное закрытие после выбора";
КонецЕсли;
ФормаВыбора85.Открыть();
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если Остановка85 Тогда ВызватьИсключение "STOP: результат после ошибки не принимается"; КонецЕсли;
Попытка
ПроверитьСтенд85();
Если ТипЗнч(ИсточникВыбора) <> Тип("ФормаКлиентскогоПриложения") Или ФормаВыбора85 = Неопределено Тогда
ВызватьИсключение "Нет реально открытого собственного источника выбора";
КонецЕсли;
Если ИсточникВыбора <> ФормаВыбора85 Или ИсточникВыбора.ИмяФормы <> "ОбщаяФорма.УчебныйВыборПрофиля85" Тогда
ВызватьИсключение "Оповещение пришло не от удержанной собственной формы";
КонецЕсли;
Если ТипЗнч(ИсточникВыбора.ВладелецФормы) <> Тип("ФормаКлиентскогоПриложения") Тогда ВызватьИсключение "У источника иной тип владельца"; КонецЕсли;
Если ИсточникВыбора.ВладелецФормы <> ЭтотОбъект Тогда ВызватьИсключение "Источник не связан с этой формой"; КонецЕсли;
Профиль = ПроверитьВыбор85(ВыбранноеЗначение);
ТекущийКлюч85 = Профиль.Ключ;
Заголовок85 = Профиль.Заголовок;
ЛимитСтрок85 = Профиль.Лимит;
Если ТипЗнч(ТекущийКлюч85) <> Тип("Строка") Или ТипЗнч(Заголовок85) <> Тип("Строка") Или ТипЗнч(ЛимитСтрок85) <> Тип("Число") Тогда
ВызватьИсключение "Типы собственных реквизитов просмотра не подтвердились";
КонецЕсли;
Если ТекущийКлюч85 <> Профиль.Ключ Или Заголовок85 <> Профиль.Заголовок Или ЛимитСтрок85 <> Профиль.Лимит Тогда
ВызватьИсключение "Примененные собственные настройки не прошли фактическое чтение обратно";
КонецЕсли;
Протокол85 = "Принят собственный профиль: " + ТекущийКлюч85 + "; заголовок: " + Заголовок85 + "; лимит: " + Строка(ЛимитСтрок85);
ФормаВыбора85 = Неопределено;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Штатный запуск только своей новой лаборатории и формы просмотра
Конфигурация → Открыть модуль управляемого приложения
Тонкий управляемый клиент
Процедура ПриНачалеРаботыСистемы()
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnSettingsChoice4_bce39b0e-5b56-4efa-91e7-0bad794e073b\IB"";" Тогда
ВызватьИсключение "Штатный запуск разрешен только своей новой учебной File ИБ8.5.1.1343";
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.УчебныйПросмотр85");
КонецПроцедуры
Разбор по шагам
Создать собственную NEW VM/File CF и две точные управляемые формы; вставить все три блока, привязать настоящие startup/создание/команды/выбор. Пройти own platform/File/metadata guards.
Из owner команды получить новый actual selector с Owner=ЭтотОбъект, Unique=True; проверить actual тип/имя/владельца и открыть, не вызывая события выбора вручную.
В настоящей команде selector создать native ВыборНастроек из actual current own key, изменить RW key на выбранный свой профиль и проверить readback. Из RO свойства взять actual Structure, Count0 либо STOP, заполнить/перечитать ровно3 typed поля.
Native NotifyChoice вызывает owner ChoiceProcessing с настоящим held SourceForm. Повторно проверить весь результат BEFORE apply; применить и фактически перечитать собственные key/title/limit. Другой профиль выбирается только следующими нормальными UI событиями.
Как проверить результат
Ровно4 PRIMARY, native constructor125/SettingsKey7578 RW/AdditionalProperties7579 RO. Параметры формы — native DataFormStructure, не Structure; клиент не вызывает server-only GetAction и не назначает Action.
Commands фактические, проверены type/name/Action/own identity. GetForm UniqueTrue, actual form or STOP, настоящий Owner; native callback2 formal consumed и exact held Source до применения результата.
Ключи только собственные String Краткий85/Подробный85; actual constructor key→RW key→readback. RO AdditionalProperties не присваивается, actual Structure0→3 с exact names/types/values и повторной проверкой владельца.
Guard/readback всего пакета до notify/apply. После ошибки sticky STOP без повторных мутаций/cleanup/хранилищ/данных ИБ/внешней сети; runtime не подтвержден.
Ожидаемый результат
Ожидаемый будущий ручной результат: initial Краткий85/лимит2 → выбор Подробный85/Полный учебный список/лимит4 → следующий нормальный выбор Краткий85/лимит2. Все значения проходят фактический native descriptor/callback и полный контроль; native mismatch дает отказ, не успешный пример.
На что обратить внимание
Заданные UUID пути/версии — только own markers, не фактический configuration UUID и не защита от malicious подмены. Используйте новую пустую учебную VM/File CF.
Не назначайте RO ДополнительныеСвойства или форму.Параметры; actual возвращенная Structure mutable, а Params имеют другой native тип. Начальная пустота AdditionalProperties не документирована и проверяется, не обещается.
SettingsKey произвольный native, но здесь только два own String ключа. Нет фиктивных серверных IDs, чужих сохраненных вариантов, произвольного caller или обещания сохранения хранилища.
Native GetAction только Server; Action команды на клиенте только читается. NotifyChoice вызывается в реальном отдельном UI событии и передает значение настоящему owner ChoiceProcessing.
После любой ошибки/отмененного источника не обходите STOP переоткрытием форм: окно/частичное UI состояние не восстанавливаются автоматически. Никакой работы с пользовательскими базами.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.