НастройкиОкна получают по собственному КлючСохраненияПоложенияОкна. Изменяем размер отдельного образца, сохраняем снимок, проверяем другой размер и возвращаем прежний профиль.
Где и как запускать
Полный модуль общей управляемой формы УчебныйПультНастроек85. Отдельная новая учебная база, новый учебный пользователь, толстый управляемый клиент Windows с интерфейсом Такси. Объекты настроек загружаются, сохраняются и проверяются только на сервере.
Подготовка
Используйте новую отдельную пустую базу 8.5.1.1343. Имя конфигурации в корне дерева задайте УчебнаяКонфигурацияСинтаксиса, язык встроенного языка Русский, режим совместимости Не использовать, интерфейс Такси. Для каждого урока нужна своя новая копия этого пустого стенда.
Создайте нового пользователя с точным именем guide-settings-5bd84f8c-6fa5-4870-82bb-5296cf0f9e55. Ранее под этим именем в этой базе никто не должен работать. В своей учебной роли разрешите СохранениеДанныхПользователя и открытие своих двух общих форм. Войдите под этим пользователем в толстом клиенте Windows, режим Управляемое приложение. В коде есть проверка имени базы и пользователя.
Создайте две общие управляемые формы: УчебныйПультНастроек85 и УчебныйОбразецНастроек85. Пульт — обычная общая форма без расширения прикладного объекта. Образец — обычная общая форма без модуля, обработчиков и программной записи. Их точные имена обязательны.
В пульте создайте строковые реквизиты ПрофильВида и ПрофильОкна длиной 128, КлючСнимка длиной 300, ИмяОбразца длиной 300, КлючИсточник и КлючОкнаОбразца длиной 500, УчебныйПользователь длиной 100. Создайте булевы СнимокСоздан и УрокЗавершен. На форме поля для этих служебных реквизитов не размещайте; АвтоматическоеСохранениеДанныхВНастройках оставьте НеИспользовать.
В пульте создайте четыре команды ОткрытьОбразец, СнятьСнимок, ВосстановитьСнимок, ОчиститьУрок. Их клиентские действия — одноимённые процедуры полного модуля. У команд снимите ИзменяетСохраняемыеДанные. Перетащите команды на форму как четыре кнопки. Событие ПриСозданииНаСервере назначьте одноимённой процедуре.
Весь код выбранного урока вставьте в модуль УчебныйПультНастроек85. Для запуска создайте общую команду ОткрытьУчебныйПультНастроек85 без параметра, учебную подсистему УчебныеНастройкиСтенд85 и включите в её командном интерфейсе эту общую команду. В модуль общей команды вставьте полностью:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("ОбщаяФорма.УчебныйПультНастроек85");
КонецПроцедуры
Обновите конфигурацию учебной базы. В клиенте откройте свой учебный раздел и выполните эту команду. Образец отдельно не запускайте: кнопку открытия содержит пульт.Код создаёт строковые профили из UUID. Параметр КлючНазначенияИспользования является стандартным параметром формы; пользовательский параметр с таким именем не добавляйте. КлючСохраненияПоложенияОкна задаётся свойством уже полученной формы до Открыть. Источник строится из реального readonly ИмяФормы полученного собственного образца.
Настройки формы формируются при закрытии образца. Снимок разрешён только после закрытия; СохранитьНастройкиПользователя вызывается в толстом управляемом клиенте и сохраняет настройки только этого нового учебного пользователя. На сервер передаются ключи, а не объекты НастройкиФормы/НастройкиОкна/НастройкиИсторииВыбора.
В начале запишите выведенные ключи. Снимок сохраняется в ХранилищеСистемныхНастроек под отдельным UUID-ключом; повторная запись снимка запрещена. ОчиститьУрок удаляет только точные собственные ключи снимка, источника и окна текущего учебного пользователя, после чего повторное открытие этим пультом запрещено. Если сеанс аварийно завершился, проверяйте только записанные собственные ключи на этом стенде.
Запуск в 1С не выполнялся. Здесь проверяются исходный модуль, сигнатуры, контексты и нативная справка. После опыта закройте пульт и завершите этот отдельный учебный сеанс. Автоматические настройки самого пульта могут остаться в профиле нового учебного пользователя; для полной утилизации стенда используйте свою одноразовую копию базы.
В образце создайте строковые реквизиты ЗаголовокКарточки длиной 100 и Примечание длиной 300, поля ПолеЗаголовкаКарточки и ПолеПримечания с соответствующими путями. Для ПолеПримечания включите МногострочныйРежим и растягивание по вертикали/горизонтали в редакторе формы. АвтоматическоеСохранениеДанныхВНастройках — НеИспользовать.
У образца включите возможность изменения размера окна. Код до открытия задаёт современное РежимБлокировкиПриОткрытииОкна=БлокироватьВладельца: образец открывается поверх пульта, который является его владельцем. Во время опыта пульт заблокирован до закрытия образца. Не меняйте размер основного окна или начальной страницы.
&НаКлиенте
Перем СобственныйОбразец;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверитьУчебныйСеанс();
ЭтаФорма.УчебныйПользователь = ИмяПользователя();
ЭтаФорма.ПрофильВида = "guide-owned-form-" + Строка(Новый УникальныйИдентификатор);
ЭтаФорма.ПрофильОкна = "guide-owned-window-" + Строка(Новый УникальныйИдентификатор);
ЭтаФорма.КлючСнимка = "guide-owned-settings-snapshot-" + Строка(Новый УникальныйИдентификатор);
ЭтаФорма.ИмяОбразца = "";
ЭтаФорма.КлючИсточник = "";
ЭтаФорма.КлючОкнаОбразца = "";
ЭтаФорма.СнимокСоздан = Ложь;
ЭтаФорма.УрокЗавершен = Ложь;
ЭтаФорма.КлючНазначенияИспользования = "guide-owned-controller-" + Строка(Новый УникальныйИдентификатор);
ЭтаФорма.КлючСохраненияПоложенияОкна = ЭтаФорма.КлючНазначенияИспользования;
Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
ВызватьИсключение "Случайный ключ снимка занят; ничего не записано";
КонецЕсли;
Сообщить("Собственный пользователь: " + ЭтаФорма.УчебныйПользователь);
Сообщить("Собственный ключ снимка: " + ЭтаФорма.КлючСнимка);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьУчебныйСеанс()
Если ИмяПользователя() <> "guide-settings-5bd84f8c-6fa5-4870-82bb-5296cf0f9e55" Тогда
ВызватьИсключение "Нужен отдельный новый учебный пользователь";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьОбразец(Команда)
Если ЭтаФорма.УрокЗавершен Тогда
ВызватьИсключение "Собственный опыт уже очищен; создайте новый пустой стенд";
КонецЕсли;
Если СобственныйОбразец <> Неопределено Тогда
Если СобственныйОбразец.Открыта() Тогда
ВызватьИсключение "Сначала закройте собственный образец";
КонецЕсли;
КонецЕсли;
ПараметрыОбразца = Новый Структура("КлючНазначенияИспользования", ЭтаФорма.ПрофильВида);
СобственныйОбразец = ПолучитьФорму("ОбщаяФорма.УчебныйОбразецНастроек85", ПараметрыОбразца, ЭтаФорма, Истина);
Если СобственныйОбразец = Неопределено Тогда
ВызватьИсключение "Собственная общая форма не получена";
КонецЕсли;
Если ТипЗнч(СобственныйОбразец) <> Тип("ФормаКлиентскогоПриложения") Тогда
ВызватьИсключение "Нужна собственная управляемая форма";
КонецЕсли;
СобственныйОбразец.КлючСохраненияПоложенияОкна = ЭтаФорма.ПрофильОкна;
СобственныйОбразец.РежимБлокировкиПриОткрытииОкна = РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца;
Если СобственныйОбразец.КлючНазначенияИспользования <> ЭтаФорма.ПрофильВида Тогда
ВызватьИсключение "Стандартный параметр собственного профиля не применён";
КонецЕсли;
Если ЭтаФорма.КлючИсточник = "" Тогда
ЭтаФорма.ИмяОбразца = СобственныйОбразец.ИмяФормы;
ПодготовитьКлючиНаСервере();
КонецЕсли;
СобственныйОбразец.Открыть();
Сообщить(СобственныйОбразец.Открыта());
Сообщить("Изменяйте только собственный образец и закройте его перед работой со снимком");
КонецПроцедуры
&НаСервере
Процедура ПодготовитьКлючиНаСервере()
ПроверитьУчебныйСеанс();
Если ЭтаФорма.ИмяОбразца <> "ОбщаяФорма.УчебныйОбразецНастроек85" Тогда
ВызватьИсключение "Получено имя чужой формы";
КонецЕсли;
ЭтаФорма.КлючОкнаОбразца = ЭтаФорма.ИмяОбразца + "/" + ЭтаФорма.ПрофильОкна + "/Такси/НастройкиОкнаТонкогоКлиента";
ЭтаФорма.КлючИсточник = ЭтаФорма.КлючОкнаОбразца;
Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
ВызватьИсключение "Исходный профиль уже существует; начните на новом пустом стенде";
КонецЕсли;
Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючОкнаОбразца, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
ВызватьИсключение "Профиль окна уже существует; ничего не заменяется";
КонецЕсли;
Сообщить("Собственный источник: " + ЭтаФорма.КлючИсточник);
Сообщить("Собственное окно: " + ЭтаФорма.КлючОкнаОбразца);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьЗакрытыйОбразец()
Если ЭтаФорма.УрокЗавершен Тогда
ВызватьИсключение "Собственный опыт уже очищен";
КонецЕсли;
Если ЭтаФорма.КлючИсточник = "" Тогда
ВызватьИсключение "Сначала откройте собственный образец";
КонецЕсли;
Если СобственныйОбразец <> Неопределено Тогда
Если СобственныйОбразец.Открыта() Тогда
ВызватьИсключение "Закройте собственный образец; настройки открытой формы ещё не сформированы";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СнятьСнимок(Команда)
ПроверитьЗакрытыйОбразец();
#Если ТолстыйКлиентУправляемоеПриложение Тогда
СохранитьНастройкиПользователя();
СнятьСнимокНаСервере();
#Иначе
ВызватьИсключение "Урок требует толстый клиент в режиме управляемого приложения";
#КонецЕсли
КонецПроцедуры
&НаСервере
Процедура СнятьСнимокНаСервере()
ПроверитьУчебныйСеанс();
Если ЭтаФорма.СнимокСоздан Тогда
ВызватьИсключение "Собственный снимок уже создан; он не перезаписывается";
КонецЕсли;
Настройки = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь);
Если Настройки = Неопределено Тогда
Сообщить("Собственной сохранённой настройки пока нет; снимок не создан");
Возврат;
КонецЕсли;
Если ТипЗнч(Настройки) <> Тип("НастройкиОкна") Тогда
ВызватьИсключение "Источник имеет другой тип; снимок не создан";
КонецЕсли;
Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
ВызватьИсключение "Ключ снимка уже занят; ничего не заменяется";
КонецЕсли;
ХранилищеСистемныхНастроек.Сохранить(ЭтаФорма.КлючСнимка, "", Настройки, , ЭтаФорма.УчебныйПользователь);
ЭтаФорма.СнимокСоздан = Истина;
ПрочитанныйСнимок = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь);
Если ТипЗнч(ПрочитанныйСнимок) <> Тип("НастройкиОкна") Тогда
ВызватьИсключение "Снимок создан, но тип повторного чтения неверен; очистите собственный ключ";
КонецЕсли;
Сообщить("Тип источника: " + Строка(ТипЗнч(Настройки)));
Сообщить("Тип собственного снимка подтверждён повторным чтением");
КонецПроцедуры
&НаКлиенте
Процедура ВосстановитьСнимок(Команда)
ПроверитьЗакрытыйОбразец();
#Если ТолстыйКлиентУправляемоеПриложение Тогда
СохранитьНастройкиПользователя();
ВосстановитьСнимокНаСервере();
#Иначе
ВызватьИсключение "Урок требует толстый управляемый клиент";
#КонецЕсли
КонецПроцедуры
&НаСервере
Процедура ВосстановитьСнимокНаСервере()
ПроверитьУчебныйСеанс();
Если Не ЭтаФорма.СнимокСоздан Тогда
ВызватьИсключение "Сначала создайте реальный собственный снимок";
КонецЕсли;
Снимок = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь);
Если ТипЗнч(Снимок) <> Тип("НастройкиОкна") Тогда
ВызватьИсключение "Собственный снимок отсутствует или имеет другой тип";
КонецЕсли;
ХранилищеСистемныхНастроек.Сохранить(ЭтаФорма.КлючИсточник, "", Снимок, , ЭтаФорма.УчебныйПользователь);
Восстановленное = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь);
Если ТипЗнч(Восстановленное) <> Тип("НастройкиОкна") Тогда
ВызватьИсключение "Не подтверждён тип восстановленного собственного профиля";
КонецЕсли;
Сообщить("Тип восстановленного профиля подтверждён; откройте образец и проверьте поведение отдельно");
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьУрок(Команда)
ПроверитьЗакрытыйОбразец();
#Если ТолстыйКлиентУправляемоеПриложение Тогда
СохранитьНастройкиПользователя();
ОчиститьУрокНаСервере();
#Иначе
ВызватьИсключение "Урок требует толстый управляемый клиент";
#КонецЕсли
КонецПроцедуры
&НаСервере
Процедура ОчиститьУрокНаСервере()
ПроверитьУчебныйСеанс();
ХранилищеСистемныхНастроек.Удалить(ЭтаФорма.КлючСнимка, "", ЭтаФорма.УчебныйПользователь);
ХранилищеСистемныхНастроек.Удалить(ЭтаФорма.КлючИсточник, "", ЭтаФорма.УчебныйПользователь);
Если ЭтаФорма.КлючОкнаОбразца <> ЭтаФорма.КлючИсточник Тогда
ХранилищеСистемныхНастроек.Удалить(ЭтаФорма.КлючОкнаОбразца, "", ЭтаФорма.УчебныйПользователь);
КонецЕсли;
Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
ВызватьИсключение "Собственный ключ снимка не очищен: " + ЭтаФорма.КлючСнимка;
КонецЕсли;
Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
ВызватьИсключение "Собственный исходный профиль не очищен: " + ЭтаФорма.КлючИсточник;
КонецЕсли;
Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючОкнаОбразца, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
ВызватьИсключение "Собственный профиль окна не очищен: " + ЭтаФорма.КлючОкнаОбразца;
КонецЕсли;
ЭтаФорма.СнимокСоздан = Ложь;
ЭтаФорма.УрокЗавершен = Истина;
Сообщить("Все точные собственные ключи отсутствуют в хранилище; пульт больше не открывает образец");
КонецПроцедуры
Разбор по шагам
Нажмите ОткрытьОбразец. До Открыть код назначает собственный UUID в КлючСохраненияПоложенияОкна; имя читает из реально полученной управляемой формы.
Полученное окно поверх владельца сделайте заметно широким, но не максимизированным. Запомните визуальные размеры и ширину поля Примечание. Закройте только это окно крестиком: пульт снова станет доступен.
Нажмите СнятьСнимок. Для толстого и тонкого клиентов Такси документированный источник — ИмяФормы/значение КлючСохраненияПоложенияОкна/Такси/НастройкиОкнаТонкогоКлиента. Суффикс ТонкогоКлиента используется и в выбранном толстом управляемом клиенте.
Проверьте, что сервер загрузил НастройкиОкна, сохранил объект без обращения к его внутренним размерам и повторно прочитал снимок. Неопределено обрабатывается без создания фиктивного объекта.
Снова откройте собственный образец, сделайте вспомогательное окно узким и выше прежнего, затем закройте. Это второй автоматический вариант того же собственного ключа окна.
Нажмите ВосстановитьСнимок: текущие настройки сохраняются, затем сервер возвращает прежний объект только в собственный ключ окна текущего учебного пользователя.
Откройте образец вновь в том же виде вспомогательного окна и сопоставьте широкий размер с исходным снимком. Сервер не обещает точные пиксели или координаты, которых нет в публичном API НастройкиОкна.
Закройте образец и выполните ОчиститьУрок. В этом опыте источник окна совпадает с КлючОкнаОбразца, поэтому отдельное повторное удаление окна пропускается. Проверки отсутствия источника и окна читают тот же точный ключ.
Как проверить результат
Положительный путь: Тип источника: НастройкиОкна, подтверждение типа снимка, подтверждение типа восстановленного профиля. При отсутствии источника нужно проверить отдельное окно, изменение размера и штатное закрытие; подстановка конструкции Новый запрещена.
Размер после первого закрытия и после восстановления визуально широкий; между ними вы действительно наблюдали собственное узкое окно. Размер основного окна учебного клиента не служит контрольным результатом.
Очистка проверяет отсутствие снимка и источника с пустым КлючНастроек и явным именем нового пользователя. Никакие ключи ОсновноеОкно, НачальнаяСтраница и настройки другого пользователя не читаются и не удаляются.
Ожидаемый результат
Непрозрачный объект размеров собственного вспомогательного окна проходит реальный цикл сохранения, повторного чтения и восстановления. Ключ определяется интерфейсом Такси и собственным UUID окна.
На что обратить внимание
У НастройкиОкна нет публичных свойств Ширина, Высота или Положение и нет конструктора. Проверка типа и восстановление объекта доступны через стандартное хранилище, отдельные числа размеров из него получить нельзя.
КлючНазначенияИспользования и КлючСохраненияПоложенияОкна решают разные задачи. В ключ окна входит значение второго; суффикс Такси нужен только для выбранного интерфейса. Для мобильного клиента и веб-клиента этот код ключа не переносите автоматически.
Клиент может открывать образец вкладкой, а окно без разрешённого изменения размера не даёт нужного опыта. Если после подготовки не появляется реальный объект НастройкиОкна, положительный путь не подтверждён; исправьте собственный стенд.
Вспомогательное окно, тема, масштаб Windows и экран могут ограничивать восстановленный размер. Урок не является проверкой точных координат или поведения нескольких мониторов. Запуск в 1С не подтверждён.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.