ФормаКлиентскогоПриложения.КлючНазначенияИспользования

Свойства · PurposeUseKey

Тип: Строка. Ключ назначения используется при сохранении/загрузке текущих настроек. Использование зависит от расширения формы. Во всех формах ключ назначения используется при сохранении и загрузке автоматически сохраняемых значений реквизитов формы. Формы, открытые с различными ключами назначения использования будут иметь собственные наборы значений автоматически сохраняемых реквизитов. Если режим совместимости Версия8_3_4 или с более ранней не установлен: Во всех формах ключ назначения также используется при сохранении и загрузке пользовательских настроек формы. Таким образом, формы, открытые с различными ключами назначения использования, будут иметь собственные настройки состава, взаимного расположения и свойств элементов. При попытке присвоить свойству значение длинее 128 символов будет выдано исключение. При создании формы заполняется на основе параметра формы КлючНазначенияИспользования.

Полное описание, параметры и ограничения

ФормаКлиентскогоПриложения.КлючНазначенияИспользования (ClientApplicationForm.PurposeUseKey)

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

КлючНазначенияИспользования (PurposeUseKey)

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

Использование:
Чтение и запись.
Описание:
Тип: Строка.
Ключ назначения используется при сохранении/загрузке текущих настроек.
Использование зависит от расширения формы.
Во всех формах ключ назначения используется при сохранении и загрузке автоматически сохраняемых значений реквизитов формы.
Формы, открытые с различными ключами назначения использования будут иметь собственные наборы значений автоматически сохраняемых реквизитов.
Если режим совместимости Версия8_3_4 или с более ранней не установлен:
Во всех формах ключ назначения также используется при сохранении и загрузке пользовательских настроек формы. Таким образом, формы, открытые с различными ключами назначения использования, будут иметь собственные настройки состава, взаимного расположения и свойств элементов.

При попытке присвоить свойству значение длинее 128 символов будет выдано исключение.
При создании формы заполняется на основе параметра формы КлючНазначенияИспользования.
Доступность:

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

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

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

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

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

Снять снимок собственной истории выбора в новом учебном профиле

История выбора хранится общим непрозрачным объектом пользователя, а не отдельно по форме. Выбираем значения собственного перечисления, загружаем созданную платформой историю и сохраняем её снимок только на новом одноразовом стенде.

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

Полный модуль общей управляемой формы УчебныйПультНастроек85. Отдельная новая учебная база, новый учебный пользователь, толстый управляемый клиент Windows с интерфейсом Такси. Объекты настроек загружаются, сохраняются и проверяются только на сервере.

Подготовка

  1. Используйте новую отдельную пустую базу 8.5.1.1343. Имя конфигурации в корне дерева задайте УчебнаяКонфигурацияСинтаксиса, язык встроенного языка Русский, режим совместимости Не использовать, интерфейс Такси. Для каждого урока нужна своя новая копия этого пустого стенда.

  2. Создайте нового пользователя с точным именем guide-settings-5bd84f8c-6fa5-4870-82bb-5296cf0f9e55. Ранее под этим именем в этой базе никто не должен работать. В своей учебной роли разрешите СохранениеДанныхПользователя и открытие своих двух общих форм. Войдите под этим пользователем в толстом клиенте Windows, режим Управляемое приложение. В коде есть проверка имени базы и пользователя.

  3. Создайте две общие управляемые формы: УчебныйПультНастроек85 и УчебныйОбразецНастроек85. Пульт — обычная общая форма без расширения прикладного объекта. Образец — обычная общая форма без модуля, обработчиков и программной записи. Их точные имена обязательны.

  4. В пульте создайте строковые реквизиты ПрофильВида и ПрофильОкна длиной 128, КлючСнимка длиной 300, ИмяОбразца длиной 300, КлючИсточник и КлючОкнаОбразца длиной 500, УчебныйПользователь длиной 100. Создайте булевы СнимокСоздан и УрокЗавершен. На форме поля для этих служебных реквизитов не размещайте; АвтоматическоеСохранениеДанныхВНастройках оставьте НеИспользовать.

  5. В пульте создайте четыре команды ОткрытьОбразец, СнятьСнимок, ВосстановитьСнимок, ОчиститьУрок. Их клиентские действия — одноимённые процедуры полного модуля. У команд снимите ИзменяетСохраняемыеДанные. Перетащите команды на форму как четыре кнопки. Событие ПриСозданииНаСервере назначьте одноимённой процедуре.

  6. Весь код выбранного урока вставьте в модуль УчебныйПультНастроек85. Для запуска создайте общую команду ОткрытьУчебныйПультНастроек85 без параметра, учебную подсистему УчебныеНастройкиСтенд85 и включите в её командном интерфейсе эту общую команду. В модуль общей команды вставьте полностью:
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    ОткрытьФорму("ОбщаяФорма.УчебныйПультНастроек85");
    КонецПроцедуры
    Обновите конфигурацию учебной базы. В клиенте откройте свой учебный раздел и выполните эту команду. Образец отдельно не запускайте: кнопку открытия содержит пульт.

  7. Код создаёт строковые профили из UUID. Параметр КлючНазначенияИспользования является стандартным параметром формы; пользовательский параметр с таким именем не добавляйте. КлючСохраненияПоложенияОкна задаётся свойством уже полученной формы до Открыть. Источник строится из реального readonly ИмяФормы полученного собственного образца.

  8. Настройки формы формируются при закрытии образца. Снимок разрешён только после закрытия; СохранитьНастройкиПользователя вызывается в толстом управляемом клиенте и сохраняет настройки только этого нового учебного пользователя. На сервер передаются ключи, а не объекты НастройкиФормы/НастройкиОкна/НастройкиИсторииВыбора.

  9. В начале запишите выведенные ключи. Снимок сохраняется в ХранилищеСистемныхНастроек под отдельным UUID-ключом; повторная запись снимка запрещена. ОчиститьУрок удаляет только точные собственные ключи снимка, источника и окна текущего учебного пользователя, после чего повторное открытие этим пультом запрещено. Если сеанс аварийно завершился, проверяйте только записанные собственные ключи на этом стенде.

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

  11. В конфигураторе создайте перечисление УчебныеКниги85 со значениями Книга, Тетрадь, Блокнот. У метаданных перечисления оставьте ИсторияВыбораПриВводе=Авто. Новых элементов справочников, документов или записей регистров для урока не создавайте.

  12. В образце создайте реквизит УчебнаяКнига с типом ПеречислениеСсылка.УчебныеКниги85, поле ввода ПолеКниги с ПутьКДанным=УчебнаяКнига и заголовком Выбор собственной книги. Кнопка выпадающего списка — Авто. Поле не переводите в режим произвольного строкового списка. АвтоматическоеСохранениеДанныхВНастройках — НеИспользовать.

  13. При первом открытии сервер требует отсутствия ИсторияВыбора у строго нового учебного пользователя. Этот ключ общий для всех полей пользователя и может также включать участников обсуждений. Систему взаимодействия не подключайте; других форм выбора в этом сеансе не открывайте.

  14. Авто не гарантирует генерацию истории для каждого поля и набора значений. В нативном перечислении доступны только Авто и НеИспользовать; значения Использовать нет. Если источник не появился после реальных выборов и сохранения, зафиксируйте отрицательный результат и очистите созданные собственные ключи. Положительный путь продолжайте только при реальном объекте НастройкиИсторииВыбора.

&НаКлиенте
Перем СобственныйОбразец;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПроверитьУчебныйСеанс();
    ЭтаФорма.УчебныйПользователь = ИмяПользователя();
    ЭтаФорма.ПрофильВида = "guide-owned-form-" + Строка(Новый УникальныйИдентификатор);
    ЭтаФорма.ПрофильОкна = "guide-owned-window-" + Строка(Новый УникальныйИдентификатор);
    ЭтаФорма.КлючСнимка = "guide-owned-settings-snapshot-" + Строка(Новый УникальныйИдентификатор);
    ЭтаФорма.ИмяОбразца = "";
    ЭтаФорма.КлючИсточник = "";
    ЭтаФорма.КлючОкнаОбразца = "";
    ЭтаФорма.СнимокСоздан = Ложь;
    ЭтаФорма.УрокЗавершен = Ложь;
    ЭтаФорма.КлючНазначенияИспользования = "guide-owned-controller-" + Строка(Новый УникальныйИдентификатор);
    ЭтаФорма.КлючСохраненияПоложенияОкна = ЭтаФорма.КлючНазначенияИспользования;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Случайный ключ снимка занят; ничего не записано";
    КонецЕсли;
    Сообщить("Собственный пользователь: " + ЭтаФорма.УчебныйПользователь);
    Сообщить("Собственный ключ снимка: " + ЭтаФорма.КлючСнимка);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьУчебныйСеанс()
    Если ИмяПользователя() <> "guide-settings-5bd84f8c-6fa5-4870-82bb-5296cf0f9e55" Тогда
        ВызватьИсключение "Нужен отдельный новый учебный пользователь";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьОбразец(Команда)
    Если ЭтаФорма.УрокЗавершен Тогда
        ВызватьИсключение "Собственный опыт уже очищен; создайте новый пустой стенд";
    КонецЕсли;
    Если СобственныйОбразец <> Неопределено Тогда
        Если СобственныйОбразец.Открыта() Тогда
            ВызватьИсключение "Сначала закройте собственный образец";
        КонецЕсли;
    КонецЕсли;
    ПараметрыОбразца = Новый Структура("КлючНазначенияИспользования", ЭтаФорма.ПрофильВида);
    СобственныйОбразец = ПолучитьФорму("ОбщаяФорма.УчебныйОбразецНастроек85", ПараметрыОбразца, ЭтаФорма, Истина);
    Если СобственныйОбразец = Неопределено Тогда
        ВызватьИсключение "Собственная общая форма не получена";
    КонецЕсли;
    Если ТипЗнч(СобственныйОбразец) <> Тип("ФормаКлиентскогоПриложения") Тогда
        ВызватьИсключение "Нужна собственная управляемая форма";
    КонецЕсли;
    СобственныйОбразец.КлючСохраненияПоложенияОкна = ЭтаФорма.ПрофильОкна;
    СобственныйОбразец.РежимБлокировкиПриОткрытииОкна = РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца;
    Если СобственныйОбразец.КлючНазначенияИспользования <> ЭтаФорма.ПрофильВида Тогда
        ВызватьИсключение "Стандартный параметр собственного профиля не применён";
    КонецЕсли;
    Если ЭтаФорма.КлючИсточник = "" Тогда
        ЭтаФорма.ИмяОбразца = СобственныйОбразец.ИмяФормы;
        ПодготовитьКлючиНаСервере();
    КонецЕсли;
    СобственныйОбразец.Элементы.ПолеКниги.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.Авто;
    СобственныйОбразец.Открыть();
    Сообщить(СобственныйОбразец.Открыта());
    Сообщить("Изменяйте только собственный образец и закройте его перед работой со снимком");
КонецПроцедуры

&НаСервере
Процедура ПодготовитьКлючиНаСервере()
    ПроверитьУчебныйСеанс();
    Если ЭтаФорма.ИмяОбразца <> "ОбщаяФорма.УчебныйОбразецНастроек85" Тогда
        ВызватьИсключение "Получено имя чужой формы";
    КонецЕсли;
    ЭтаФорма.КлючОкнаОбразца = ЭтаФорма.ИмяОбразца + "/" + ЭтаФорма.ПрофильОкна + "/Такси/НастройкиОкнаТонкогоКлиента";
    ЭтаФорма.КлючИсточник = "ИсторияВыбора";
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Исходный профиль уже существует; начните на новом пустом стенде";
    КонецЕсли;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючОкнаОбразца, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Профиль окна уже существует; ничего не заменяется";
    КонецЕсли;
    Сообщить("Собственный источник: " + ЭтаФорма.КлючИсточник);
    Сообщить("Собственное окно: " + ЭтаФорма.КлючОкнаОбразца);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьЗакрытыйОбразец()
    Если ЭтаФорма.УрокЗавершен Тогда
        ВызватьИсключение "Собственный опыт уже очищен";
    КонецЕсли;
    Если ЭтаФорма.КлючИсточник = "" Тогда
        ВызватьИсключение "Сначала откройте собственный образец";
    КонецЕсли;
    Если СобственныйОбразец <> Неопределено Тогда
        Если СобственныйОбразец.Открыта() Тогда
            ВызватьИсключение "Закройте собственный образец; настройки открытой формы ещё не сформированы";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СнятьСнимок(Команда)
    ПроверитьЗакрытыйОбразец();
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        СохранитьНастройкиПользователя();
        СнятьСнимокНаСервере();
    #Иначе
        ВызватьИсключение "Урок требует толстый клиент в режиме управляемого приложения";
    #КонецЕсли
КонецПроцедуры

&НаСервере
Процедура СнятьСнимокНаСервере()
    ПроверитьУчебныйСеанс();
    Если ЭтаФорма.СнимокСоздан Тогда
        ВызватьИсключение "Собственный снимок уже создан; он не перезаписывается";
    КонецЕсли;
    Настройки = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь);
    Если Настройки = Неопределено Тогда
        Сообщить("Собственной сохранённой настройки пока нет; снимок не создан");
        Возврат;
    КонецЕсли;
    Если ТипЗнч(Настройки) <> Тип("НастройкиИсторииВыбора") Тогда
        ВызватьИсключение "Источник имеет другой тип; снимок не создан";
    КонецЕсли;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Ключ снимка уже занят; ничего не заменяется";
    КонецЕсли;
    ХранилищеСистемныхНастроек.Сохранить(ЭтаФорма.КлючСнимка, "", Настройки, , ЭтаФорма.УчебныйПользователь);
    ЭтаФорма.СнимокСоздан = Истина;
    ПрочитанныйСнимок = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь);
    Если ТипЗнч(ПрочитанныйСнимок) <> Тип("НастройкиИсторииВыбора") Тогда
        ВызватьИсключение "Снимок создан, но тип повторного чтения неверен; очистите собственный ключ";
    КонецЕсли;
    Сообщить("Тип источника: " + Строка(ТипЗнч(Настройки)));
    Сообщить("Тип собственного снимка подтверждён повторным чтением");
КонецПроцедуры

&НаКлиенте
Процедура ВосстановитьСнимок(Команда)
    ПроверитьЗакрытыйОбразец();
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        СохранитьНастройкиПользователя();
        ВосстановитьСнимокНаСервере();
    #Иначе
        ВызватьИсключение "Урок требует толстый управляемый клиент";
    #КонецЕсли
КонецПроцедуры

&НаСервере
Процедура ВосстановитьСнимокНаСервере()
    ПроверитьУчебныйСеанс();
    Если Не ЭтаФорма.СнимокСоздан Тогда
        ВызватьИсключение "Сначала создайте реальный собственный снимок";
    КонецЕсли;
    Снимок = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь);
    Если ТипЗнч(Снимок) <> Тип("НастройкиИсторииВыбора") Тогда
        ВызватьИсключение "Собственный снимок отсутствует или имеет другой тип";
    КонецЕсли;
    ХранилищеСистемныхНастроек.Сохранить(ЭтаФорма.КлючИсточник, "", Снимок, , ЭтаФорма.УчебныйПользователь);
    Восстановленное = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь);
    Если ТипЗнч(Восстановленное) <> Тип("НастройкиИсторииВыбора") Тогда
        ВызватьИсключение "Не подтверждён тип восстановленного собственного профиля";
    КонецЕсли;
    Сообщить("Тип восстановленного профиля подтверждён; откройте образец и проверьте поведение отдельно");
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьУрок(Команда)
    ПроверитьЗакрытыйОбразец();
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        СохранитьНастройкиПользователя();
        ОчиститьУрокНаСервере();
    #Иначе
        ВызватьИсключение "Урок требует толстый управляемый клиент";
    #КонецЕсли
КонецПроцедуры

&НаСервере
Процедура ОчиститьУрокНаСервере()
    ПроверитьУчебныйСеанс();
    ХранилищеСистемныхНастроек.Удалить(ЭтаФорма.КлючСнимка, "", ЭтаФорма.УчебныйПользователь);
    ХранилищеСистемныхНастроек.Удалить(ЭтаФорма.КлючИсточник, "", ЭтаФорма.УчебныйПользователь);
    Если ЭтаФорма.КлючОкнаОбразца <> ЭтаФорма.КлючИсточник Тогда
        ХранилищеСистемныхНастроек.Удалить(ЭтаФорма.КлючОкнаОбразца, "", ЭтаФорма.УчебныйПользователь);
    КонецЕсли;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Собственный ключ снимка не очищен: " + ЭтаФорма.КлючСнимка;
    КонецЕсли;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Собственный исходный профиль не очищен: " + ЭтаФорма.КлючИсточник;
    КонецЕсли;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючОкнаОбразца, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Собственный профиль окна не очищен: " + ЭтаФорма.КлючОкнаОбразца;
    КонецЕсли;
    ЭтаФорма.СнимокСоздан = Ложь;
    ЭтаФорма.УрокЗавершен = Истина;
    Сообщить("Все точные собственные ключи отсутствуют в хранилище; пульт больше не открывает образец");
КонецПроцедуры

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

  1. Откройте образец. Код получает настоящую подготовленную общую форму и назначает ИсторияВыбораПриВводе.Авто именно её ПолеКниги — свойству расширения поля ввода, а не readonly свойству метаданных перечисления.

  2. Через стандартную кнопку выпадающего списка выберите Книга, затем Блокнот; подтверждайте реальный интерактивный выбор, а не присваивайте реквизиту значение программно. Закройте образец.

  3. Нажмите СнятьСнимок. Толстый клиент сохраняет настройки нового пользователя, сервер читает ХранилищеСистемныхНастроек.Загрузить("ИсторияВыбора", "", , своё имя). Если результат Неопределено, снимок не записывается и положительный путь заканчивается здесь.

  4. При реальном объекте сервер проверяет НастройкиИсторииВыбора, сохраняет его под новым UUID-ключом снимка и перечитывает. Нельзя прочитать его внутренний список, заменить его СпискомЗначений или вызвать придуманный конструктор.

  5. Повторно откройте образец, выберите Тетрадь интерактивно и закройте. Запишите, появилась ли новая история в выпадающем списке: отображение и порядок зависят от режима Авто, поэтому порядок не является обещанным контрольным результатом.

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

  7. Проверьте поведение в собственном образце отдельным повторным открытием. Если список в текущем сеансе не изменился, отметьте ограничение кеша; не повторяйте запись для другого пользователя и не объявляйте визуальное восстановление успешным.

  8. Закройте образец, выполните ОчиститьУрок. Команда удаляет точные записи снимка, ИсторияВыбора этого нового пользователя и его собственного окна, проверяет отсутствие в серверном хранилище и запрещает новый выбор через этот пульт.

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

  1. Отрицательный путь является допустимым: сообщение Собственной сохранённой настройки пока нет; снимок не создан, СнимокСоздан остаётся Ложь и команда восстановления отклоняется. Он не подтверждает получение НастройкиИсторииВыбора.

  2. Положительный путь требует сообщений Тип источника: НастройкиИсторииВыбора, подтверждения типа повторного чтения снимка и восстановленного профиля. Значения пользовательского перечисления выбираются вручную; предметные данные не записываются.

  3. Серверная очистка подтверждает отсутствие трёх точных записей на момент вызова. Она не очищает внутренний кеш истории работающего клиента; при выходе он может записать историю снова. Для полной утилизации используйте отдельную одноразовую копию базы, а не очистку рабочего пользователя.

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

Либо зафиксировано отсутствие генерации истории в режиме Авто, либо реальный объект собственной истории прошёл сохранение снимка и повторное чтение. Серверное восстановление типа отделено от неподтверждённого поведения клиентского кеша.

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

  1. Ключ ИсторияВыбора не содержит имя формы, КлючНазначенияИспользования или имя поля. Поэтому урок требует нового пользователя и нового стенда; перенос в рабочий профиль недопустим.

  2. У НастройкиИсторииВыбора нет публичных методов, свойств и конструктора. Содержимое истории невозможно перечислить через этот тип. ИсторияВыбораПриВводе.Авто не является принудительным включением; Использовать отсутствует в справке 8.5.1.1343.

  3. История выбора и текущее значение УчебнаяКнига — разные данные. Восстановление объекта истории не устанавливает реквизит формы и не создаёт элементы перечисления или справочника.

  4. Нативная справка не обещает сброс кеша истории после Сохранить/Удалить. Положительный результат повторного чтения не равен визуальному восстановлению; после завершения клиента история может быть автоматически записана повторно. Обе границы явно проверяются вручную на одноразовом стенде.

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

Сохранить снимок вида своей формы и вернуть скрытое поле

НастройкиФормы получают после реального изменения вида собственной формы. Непрозрачный объект сохраняем под отдельным UUID-ключом, меняем собственный профиль и восстанавливаем снимок.

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

Полный модуль общей управляемой формы УчебныйПультНастроек85. Отдельная новая учебная база, новый учебный пользователь, толстый управляемый клиент Windows с интерфейсом Такси. Объекты настроек загружаются, сохраняются и проверяются только на сервере.

Подготовка

  1. Используйте новую отдельную пустую базу 8.5.1.1343. Имя конфигурации в корне дерева задайте УчебнаяКонфигурацияСинтаксиса, язык встроенного языка Русский, режим совместимости Не использовать, интерфейс Такси. Для каждого урока нужна своя новая копия этого пустого стенда.

  2. Создайте нового пользователя с точным именем guide-settings-5bd84f8c-6fa5-4870-82bb-5296cf0f9e55. Ранее под этим именем в этой базе никто не должен работать. В своей учебной роли разрешите СохранениеДанныхПользователя и открытие своих двух общих форм. Войдите под этим пользователем в толстом клиенте Windows, режим Управляемое приложение. В коде есть проверка имени базы и пользователя.

  3. Создайте две общие управляемые формы: УчебныйПультНастроек85 и УчебныйОбразецНастроек85. Пульт — обычная общая форма без расширения прикладного объекта. Образец — обычная общая форма без модуля, обработчиков и программной записи. Их точные имена обязательны.

  4. В пульте создайте строковые реквизиты ПрофильВида и ПрофильОкна длиной 128, КлючСнимка длиной 300, ИмяОбразца длиной 300, КлючИсточник и КлючОкнаОбразца длиной 500, УчебныйПользователь длиной 100. Создайте булевы СнимокСоздан и УрокЗавершен. На форме поля для этих служебных реквизитов не размещайте; АвтоматическоеСохранениеДанныхВНастройках оставьте НеИспользовать.

  5. В пульте создайте четыре команды ОткрытьОбразец, СнятьСнимок, ВосстановитьСнимок, ОчиститьУрок. Их клиентские действия — одноимённые процедуры полного модуля. У команд снимите ИзменяетСохраняемыеДанные. Перетащите команды на форму как четыре кнопки. Событие ПриСозданииНаСервере назначьте одноимённой процедуре.

  6. Весь код выбранного урока вставьте в модуль УчебныйПультНастроек85. Для запуска создайте общую команду ОткрытьУчебныйПультНастроек85 без параметра, учебную подсистему УчебныеНастройкиСтенд85 и включите в её командном интерфейсе эту общую команду. В модуль общей команды вставьте полностью:
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    ОткрытьФорму("ОбщаяФорма.УчебныйПультНастроек85");
    КонецПроцедуры
    Обновите конфигурацию учебной базы. В клиенте откройте свой учебный раздел и выполните эту команду. Образец отдельно не запускайте: кнопку открытия содержит пульт.

  7. Код создаёт строковые профили из UUID. Параметр КлючНазначенияИспользования является стандартным параметром формы; пользовательский параметр с таким именем не добавляйте. КлючСохраненияПоложенияОкна задаётся свойством уже полученной формы до Открыть. Источник строится из реального readonly ИмяФормы полученного собственного образца.

  8. Настройки формы формируются при закрытии образца. Снимок разрешён только после закрытия; СохранитьНастройкиПользователя вызывается в толстом управляемом клиенте и сохраняет настройки только этого нового учебного пользователя. На сервер передаются ключи, а не объекты НастройкиФормы/НастройкиОкна/НастройкиИсторииВыбора.

  9. В начале запишите выведенные ключи. Снимок сохраняется в ХранилищеСистемныхНастроек под отдельным UUID-ключом; повторная запись снимка запрещена. ОчиститьУрок удаляет только точные собственные ключи снимка, источника и окна текущего учебного пользователя, после чего повторное открытие этим пультом запрещено. Если сеанс аварийно завершился, проверяйте только записанные собственные ключи на этом стенде.

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

  11. В образце создайте строковые реквизиты ЗаголовокКарточки длиной 100 и Примечание длиной 300, два поля ввода ПолеЗаголовкаКарточки и ПолеПримечания с соответствующим ПутьКДанным. Заголовки полей — Заголовок карточки и Примечание. Оставьте оба видимыми. АвтоматическоеСохранениеДанныхВНастройках — НеИспользовать.

  12. В свойствах образца разрешите пользователю изменение состава формы. В клиенте нужна стандартная команда Ещё → Изменить форму. Если она недоступна из-за роли или настроек вашей учебной формы, сначала исправьте подготовку стенда; не заменяйте опыт программным Видимость=Ложь.

&НаКлиенте
Перем СобственныйОбразец;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПроверитьУчебныйСеанс();
    ЭтаФорма.УчебныйПользователь = ИмяПользователя();
    ЭтаФорма.ПрофильВида = "guide-owned-form-" + Строка(Новый УникальныйИдентификатор);
    ЭтаФорма.ПрофильОкна = "guide-owned-window-" + Строка(Новый УникальныйИдентификатор);
    ЭтаФорма.КлючСнимка = "guide-owned-settings-snapshot-" + Строка(Новый УникальныйИдентификатор);
    ЭтаФорма.ИмяОбразца = "";
    ЭтаФорма.КлючИсточник = "";
    ЭтаФорма.КлючОкнаОбразца = "";
    ЭтаФорма.СнимокСоздан = Ложь;
    ЭтаФорма.УрокЗавершен = Ложь;
    ЭтаФорма.КлючНазначенияИспользования = "guide-owned-controller-" + Строка(Новый УникальныйИдентификатор);
    ЭтаФорма.КлючСохраненияПоложенияОкна = ЭтаФорма.КлючНазначенияИспользования;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Случайный ключ снимка занят; ничего не записано";
    КонецЕсли;
    Сообщить("Собственный пользователь: " + ЭтаФорма.УчебныйПользователь);
    Сообщить("Собственный ключ снимка: " + ЭтаФорма.КлючСнимка);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьУчебныйСеанс()
    Если ИмяПользователя() <> "guide-settings-5bd84f8c-6fa5-4870-82bb-5296cf0f9e55" Тогда
        ВызватьИсключение "Нужен отдельный новый учебный пользователь";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьОбразец(Команда)
    Если ЭтаФорма.УрокЗавершен Тогда
        ВызватьИсключение "Собственный опыт уже очищен; создайте новый пустой стенд";
    КонецЕсли;
    Если СобственныйОбразец <> Неопределено Тогда
        Если СобственныйОбразец.Открыта() Тогда
            ВызватьИсключение "Сначала закройте собственный образец";
        КонецЕсли;
    КонецЕсли;
    ПараметрыОбразца = Новый Структура("КлючНазначенияИспользования", ЭтаФорма.ПрофильВида);
    СобственныйОбразец = ПолучитьФорму("ОбщаяФорма.УчебныйОбразецНастроек85", ПараметрыОбразца, ЭтаФорма, Истина);
    Если СобственныйОбразец = Неопределено Тогда
        ВызватьИсключение "Собственная общая форма не получена";
    КонецЕсли;
    Если ТипЗнч(СобственныйОбразец) <> Тип("ФормаКлиентскогоПриложения") Тогда
        ВызватьИсключение "Нужна собственная управляемая форма";
    КонецЕсли;
    СобственныйОбразец.КлючСохраненияПоложенияОкна = ЭтаФорма.ПрофильОкна;
    СобственныйОбразец.РежимБлокировкиПриОткрытииОкна = РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца;
    Если СобственныйОбразец.КлючНазначенияИспользования <> ЭтаФорма.ПрофильВида Тогда
        ВызватьИсключение "Стандартный параметр собственного профиля не применён";
    КонецЕсли;
    Если ЭтаФорма.КлючИсточник = "" Тогда
        ЭтаФорма.ИмяОбразца = СобственныйОбразец.ИмяФормы;
        ПодготовитьКлючиНаСервере();
    КонецЕсли;

    СобственныйОбразец.Открыть();
    Сообщить(СобственныйОбразец.Открыта());
    Сообщить("Изменяйте только собственный образец и закройте его перед работой со снимком");
КонецПроцедуры

&НаСервере
Процедура ПодготовитьКлючиНаСервере()
    ПроверитьУчебныйСеанс();
    Если ЭтаФорма.ИмяОбразца <> "ОбщаяФорма.УчебныйОбразецНастроек85" Тогда
        ВызватьИсключение "Получено имя чужой формы";
    КонецЕсли;
    ЭтаФорма.КлючОкнаОбразца = ЭтаФорма.ИмяОбразца + "/" + ЭтаФорма.ПрофильОкна + "/Такси/НастройкиОкнаТонкогоКлиента";
    ЭтаФорма.КлючИсточник = ЭтаФорма.ИмяОбразца + "/" + ЭтаФорма.ПрофильВида + "/НастройкиФормы";
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Исходный профиль уже существует; начните на новом пустом стенде";
    КонецЕсли;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючОкнаОбразца, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Профиль окна уже существует; ничего не заменяется";
    КонецЕсли;
    Сообщить("Собственный источник: " + ЭтаФорма.КлючИсточник);
    Сообщить("Собственное окно: " + ЭтаФорма.КлючОкнаОбразца);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьЗакрытыйОбразец()
    Если ЭтаФорма.УрокЗавершен Тогда
        ВызватьИсключение "Собственный опыт уже очищен";
    КонецЕсли;
    Если ЭтаФорма.КлючИсточник = "" Тогда
        ВызватьИсключение "Сначала откройте собственный образец";
    КонецЕсли;
    Если СобственныйОбразец <> Неопределено Тогда
        Если СобственныйОбразец.Открыта() Тогда
            ВызватьИсключение "Закройте собственный образец; настройки открытой формы ещё не сформированы";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СнятьСнимок(Команда)
    ПроверитьЗакрытыйОбразец();
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        СохранитьНастройкиПользователя();
        СнятьСнимокНаСервере();
    #Иначе
        ВызватьИсключение "Урок требует толстый клиент в режиме управляемого приложения";
    #КонецЕсли
КонецПроцедуры

&НаСервере
Процедура СнятьСнимокНаСервере()
    ПроверитьУчебныйСеанс();
    Если ЭтаФорма.СнимокСоздан Тогда
        ВызватьИсключение "Собственный снимок уже создан; он не перезаписывается";
    КонецЕсли;
    Настройки = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь);
    Если Настройки = Неопределено Тогда
        Сообщить("Собственной сохранённой настройки пока нет; снимок не создан");
        Возврат;
    КонецЕсли;
    Если ТипЗнч(Настройки) <> Тип("НастройкиФормы") Тогда
        ВызватьИсключение "Источник имеет другой тип; снимок не создан";
    КонецЕсли;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Ключ снимка уже занят; ничего не заменяется";
    КонецЕсли;
    ХранилищеСистемныхНастроек.Сохранить(ЭтаФорма.КлючСнимка, "", Настройки, , ЭтаФорма.УчебныйПользователь);
    ЭтаФорма.СнимокСоздан = Истина;
    ПрочитанныйСнимок = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь);
    Если ТипЗнч(ПрочитанныйСнимок) <> Тип("НастройкиФормы") Тогда
        ВызватьИсключение "Снимок создан, но тип повторного чтения неверен; очистите собственный ключ";
    КонецЕсли;
    Сообщить("Тип источника: " + Строка(ТипЗнч(Настройки)));
    Сообщить("Тип собственного снимка подтверждён повторным чтением");
КонецПроцедуры

&НаКлиенте
Процедура ВосстановитьСнимок(Команда)
    ПроверитьЗакрытыйОбразец();
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        СохранитьНастройкиПользователя();
        ВосстановитьСнимокНаСервере();
    #Иначе
        ВызватьИсключение "Урок требует толстый управляемый клиент";
    #КонецЕсли
КонецПроцедуры

&НаСервере
Процедура ВосстановитьСнимокНаСервере()
    ПроверитьУчебныйСеанс();
    Если Не ЭтаФорма.СнимокСоздан Тогда
        ВызватьИсключение "Сначала создайте реальный собственный снимок";
    КонецЕсли;
    Снимок = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь);
    Если ТипЗнч(Снимок) <> Тип("НастройкиФормы") Тогда
        ВызватьИсключение "Собственный снимок отсутствует или имеет другой тип";
    КонецЕсли;
    ХранилищеСистемныхНастроек.Сохранить(ЭтаФорма.КлючИсточник, "", Снимок, , ЭтаФорма.УчебныйПользователь);
    Восстановленное = ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь);
    Если ТипЗнч(Восстановленное) <> Тип("НастройкиФормы") Тогда
        ВызватьИсключение "Не подтверждён тип восстановленного собственного профиля";
    КонецЕсли;
    Сообщить("Тип восстановленного профиля подтверждён; откройте образец и проверьте поведение отдельно");
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьУрок(Команда)
    ПроверитьЗакрытыйОбразец();
    #Если ТолстыйКлиентУправляемоеПриложение Тогда
        СохранитьНастройкиПользователя();
        ОчиститьУрокНаСервере();
    #Иначе
        ВызватьИсключение "Урок требует толстый управляемый клиент";
    #КонецЕсли
КонецПроцедуры

&НаСервере
Процедура ОчиститьУрокНаСервере()
    ПроверитьУчебныйСеанс();
    ХранилищеСистемныхНастроек.Удалить(ЭтаФорма.КлючСнимка, "", ЭтаФорма.УчебныйПользователь);
    ХранилищеСистемныхНастроек.Удалить(ЭтаФорма.КлючИсточник, "", ЭтаФорма.УчебныйПользователь);
    Если ЭтаФорма.КлючОкнаОбразца <> ЭтаФорма.КлючИсточник Тогда
        ХранилищеСистемныхНастроек.Удалить(ЭтаФорма.КлючОкнаОбразца, "", ЭтаФорма.УчебныйПользователь);
    КонецЕсли;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючСнимка, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Собственный ключ снимка не очищен: " + ЭтаФорма.КлючСнимка;
    КонецЕсли;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючИсточник, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Собственный исходный профиль не очищен: " + ЭтаФорма.КлючИсточник;
    КонецЕсли;
    Если ХранилищеСистемныхНастроек.Загрузить(ЭтаФорма.КлючОкнаОбразца, "", , ЭтаФорма.УчебныйПользователь) <> Неопределено Тогда
        ВызватьИсключение "Собственный профиль окна не очищен: " + ЭтаФорма.КлючОкнаОбразца;
    КонецЕсли;
    ЭтаФорма.СнимокСоздан = Ложь;
    ЭтаФорма.УрокЗавершен = Истина;
    Сообщить("Все точные собственные ключи отсутствуют в хранилище; пульт больше не открывает образец");
КонецПроцедуры

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

  1. Откройте пульт и нажмите ОткрытьОбразец. ПолучитьФорму создаёт подготовленный образец со стандартным параметром собственного КлючНазначенияИспользования; код проверяет это значение и читает readonly ИмяФормы.

  2. В образце через Ещё → Изменить форму скройте только Примечание и подтвердите изменение. Закройте образец крестиком; пульт оставьте открытым.

  3. Нажмите СнятьСнимок. После сохранения настроек толстым клиентом сервер читает точный ключ ИмяФормы/UUID-профиль/НастройкиФормы с пустым КлючНастроек и своим пользователем в четвёртом аргументе Загрузить.

  4. Сервер принимает только реальный тип НастройкиФормы, сохраняет его под свободным ключом снимка с явным пятым аргументом пользователя и перечитывает. Отсутствие источника означает, что интерактивная настройка ещё не сохранена; снимок в этой ветви не создаётся.

  5. Снова откройте образец: Примечание должно быть скрыто. Через Изменить форму верните Примечание и подтвердите изменение. Закройте образец, чтобы сформировался новый вариант собственного профиля.

  6. Нажмите ВосстановитьСнимок. Сначала сохраняется текущий изменённый вариант, затем на сервере исходный собственный ключ получает прежний непрозрачный снимок. Повторное чтение подтверждает тип; содержимое непрозрачного объекта код не разбирает.

  7. Нажмите ОткрытьОбразец и проверьте, что Примечание снова скрыто. Это отдельная поведенческая проверка, которой нельзя заменить проверку одного типа объекта.

  8. Закройте образец, нажмите ОчиститьУрок и проверьте сообщение об отсутствии всех точных собственных ключей. Повторное открытие этим пультом теперь отклоняется.

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

  1. После СнятьСнимок показаны Тип источника: НастройкиФормы и подтверждение типа собственного снимка. Если показано отсутствие собственной настройки, положительный путь не выполнен: повторите интерактивное изменение, закрытие и сохранение.

  2. После изменения Примечание видно, а после восстановления и нового получения формы — скрыто. Не проверяйте это по Строка(Настройки): у объекта нет публичного списка свойств и методов.

  3. Очистка подтверждает отсутствие источника, снимка и собственного окна. Повторная команда открытия завершается сообщением об очищенном опыте. Повторный СнятьСнимок до очистки не заменяет уже созданный снимок.

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

Снимок собственной интерактивной настройки отделён от нового варианта формы, затем восстановлен в тот же уникальный профиль текущего учебного пользователя. Тип подтверждается сервером, внешний вид — отдельным ручным открытием.

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

  1. НастройкиФормы — сериализуемый непрозрачный серверный объект без публичных конструкторов, свойств и методов. Новый НастройкиФормы и присваивание Настройки.Видимость неверны.

  2. КлючНазначенияИспользования учитывается для пользовательского вида формы вне режима совместимости 8.3.4 и ниже. Профиль передаётся при создании, чтобы его настройки загружались для нужного назначения; присваивание после открытия не заменяет этот этап.

  3. Тип повторного чтения доказывает, что сохранён объект ожидаемого вида, но не доказывает скрытие поля. Внешний вид и применение кеша требуют проверки в 1С. Запись выполняется для текущего пользователя; настройки другого пользователя не используются.

  4. Окно должно быть закрыто перед снимком, восстановлением и очисткой. Очистка во время открытого образца может быть отменена последующим автоматическим сохранением.

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

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

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

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

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