НастройкиФормы

Типы · FormSettings

Содержит настройки состава, взаимного расположения и свойств элементов формы клиентского приложения.

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

НастройкиФормы (FormSettings)

НастройкиФормы (FormSettings)

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

Описание:

Содержит настройки состава, взаимного расположения и свойств элементов формы клиентского приложения.

Доступность:

Сервер, толстый клиент.
Сериализуется.

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

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

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

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

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

НастройкиФормы получают после реального изменения вида собственной формы. Непрозрачный объект сохраняем под отдельным 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С» и не аффилирован с ней.