Загружает настройку из хранилища. Результатом работы являются настройки, загруженные из хранилища.
Синтаксис
Загрузить(<КлючОбъекта>, <КлючНастроек>, <ОписаниеНастроек>, <ИмяПользователя>)Полное описание, параметры и ограничения
СтандартноеХранилищеНастроекМенеджер.Загрузить (StandardSettingsStorageManager.Load)
СтандартноеХранилищеНастроекМенеджер (StandardSettingsStorageManager)
Загрузить (Load)
Доступен, начиная с версии 8.2.
Синтаксис:
Загрузить(<КлючОбъекта>, <КлючНастроек>, <ОписаниеНастроек>, <ИмяПользователя>)
Параметры:
<КлючОбъекта> (обязательный)
Тип: Строка.
Ключ объекта настройки.
Подробнее см. в Настройки, автоматически сохраняемые в системном хранилище.
<КлючНастроек> (необязательный)
Тип: Строка.
Ключ загружаемых настроек.
Значение по умолчанию: Пустая строка.
<ОписаниеНастроек> (необязательный)
Тип: ОписаниеНастроек.
Описание настроек.
Если не указан, то описание настройки не загружается.
<ИмяПользователя> (необязательный)
Тип: Строка.
Имя пользователя, настройки которого загружаются.
Если не указан, то загружаются настройки текущего пользователя.
В случае переименования пользователя прежние настройки не загружаются.
Если будет создан пользователь, имя которого совпадает с именем прежнего пользователя, для него будут использованы существующие настройки.
Если указан пользователь, не являющийся текущим пользователем, т.е. делается попытка обратиться к настройкам, не принадлежащим текущему пользователю, то требуется наличие у текущего пользователя права АдминистрированиеДанных.
Возвращаемое значение:
Тип: Произвольный.
Неопределено, если настройки не найдены.
Описание:
Загружает настройку из хранилища.
Результатом работы являются настройки, загруженные из хранилища.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Свое клиентское приложение: учебное окно750 и возврат исходного оформления за два настоящих запуска
Настоящий readonly global КлиентскоеПриложение, не неизвестный исходный объект. Window/OS setters работают только внутри настоящего BeforeStart, заголовки — после открытия своего окна. Реальный baseline сохраняется в одном собственном user-scoped ключе и проверенно возвращается при втором ручном старте.
Где и как запускать
Главный APPLICATION целиком в реальный модуль управляемого приложения own УчебноеОкно85. Window/OS setters прямо в ПередНачаломРаботыСистемы(Отказ), title setters после появления окна. SERVER отдельно server-call общий модуль, FORM отдельно actual общая управляемая форма. Два ручных own WindowsThinTaxi/FileIB запуска.
Подготовка
Подготовьте отдельную собственную Windows VM с платформой8.5.1.1343, тонким клиентом и управляемым интерфейсом Такси. Не используйте интерфейс Версия8_5 для этого опыта: native OS-caption setter там игнорируется. Это собственный клиент, не перебор/подключение чужих процессов или COM.
Вручную создайте новый canonical nonzero UUID-marker и собственную пустую FileIB C:\1c-labs\Уч85Окно_<UUID>\. Имя конфигурации УчебноеОкно85. В списке баз зарегистрируйте строго File="C:\1c-labs\Уч85Окно_<UUID>\";. Path-marker не является UUID самой информационной базы; реальный UUID базы в коде не измеряется. Состояние.База содержит только эту метку пути. Другие пути/параметры отвергаются, строка соединения не печатается.
Создайте ровно одного настоящего пользователя IB Уч85Окно_<UUID> с правами чтения списка пользователей и СохранениеДанныхПользователя в этой учебной базе. Список и UUID реального текущего пользователя ИБ проверяются; Состояние.Пользователь сохраняет actualIBUserUUID из ТекущийПользователь().УникальныйИдентификатор, не UUID базы. Это важно, поскольку native settings связаны с именем пользователя и имя может повторно использовать другой IBUser.
Конфигурация пустая: справочников/документов/регистров/общих реквизитов/разделителей/подписок/регламентных заданий/ботов/констант/расширений нет. Не меняйте типовую конфигурацию. Добавьте только указанные ниже свой общий модуль и свою одну общую управляемую форму; другие стартовые модули/обработчики отсутствуют.
Конфигуратор → свойства конфигурации: управляемое приложение, интерфейс Такси. Первый baseline должен иметь Обычный режим окна и настоящий Boolean отображения заголовкаОС: принимаются и True, и False. Учебное значение — противоположное реально полученному, а не guessed default. Код не принимает kiosk/fullscreen baseline. Два исходных текста берутся реальными getters.
Конфигуратор → Общие → Общие модули → УчебноеОкно85: Сервер/Вызов сервера=Да, Клиент/Привилегированный/Глобальный=Нет. Вставьте полный SERVER. ХранилищеСистемныхНастроек доступно серверу, не тонкому клиенту. Работа только с собственным объектным ключом Уч85Окно85_<marker> и ключом настройки СвойЦиклОкна85; ИмяПользователя не передается, поэтому native использует текущего пользователя.
Конфигуратор → Общие → Общие формы → УчебноеОкно85: управляемая форма. Создайте параметры формы МеткаБазы/Nonce (Строка36), реквизиты с теми же именами (Строка36) и Подтверждение (Строка100). Создайте команды ПроверитьОкно/ВернутьСвоиЗаголовки, разместите кнопки и поле подтверждения. Вставьте FORM целиком; событие ПриСозданииНаСервере имеет2параметра и переносит собственные startup parameters в реквизиты.
Конфигуратор → Конфигурация → Открыть модуль управляемого приложения: вставьте APPLICATION целиком. Native ПередНачаломРаботыСистемы(Отказ) настраивает окно до его появления; ПриНачалеРаботыСистемы() после открытия проверяет оформление, задает свои заголовки и открывает только свою общую форму. Не вызывайте эти процедуры вручную и не переносите window/OS setters в форму или обычный helper.
Первый ручной запуск выполните тонким клиентом этой своей базы, задав дополнительный параметр запуска /C"Уч85Окно|<ваш UUID>|ОПЫТ85". ПараметрЗапуска native получает именно /C. Без точных трех частей старт отклоняется; это осознанная учебная фаза, не автоизменение при любом открытии произвольной базы.
Первый BeforeStart сохраняет реально полученные Normal/Boolean OS/two captions в собственном ключе для actual IBUser, затем ставит РабочееМесто и противоположное отображение заголовкаОС. При существующем ключе опыт не повторяется и baseline не перезаписывается. Main-window mode и OS-caption setters оба разрешены только в этом событии.
В РабочемМесте скрываются системное меню и многие панели/горячие клавиши; поэтому ПриНачалеРаботыСистемы открывает заранее подготовленную общую форму, а не требует открыть внешнюю обработку через скрытое меню. Закрытие главного окна остается доступным. Это не киоск/forcefullscreen и не запрет на работу ОС.
После открытия окна native getters проверяют РабочееМесто/свое противоположное значение OS и исходные тексты. Затем задаются собственные заголовок Уч85Окно|Книга750|nonce и краткий Книга750|nonce, оба отдельно читаются. Краткий заголовок вставляется перед системным и отделяется точкой: getter возвращает свое значение, не весь нарисованный ОС-заголовок.
Откройте автоматически показанную свою форму, нажмите ПроверитьОкно и осмотрите настоящее окно вручную. Введите ВОЗВРАТ МОИХ ЗАГОЛОВКОВ85 и нажмите ВернутьСвоиЗаголовки один раз. Возврат разрешен лишь при exact own caption/short/mode/OS/nonce. Два текста возвращаются к real baseline и читаются; если кто-то изменил оформление, код не перезаписывает его.
После подтвержденной фазы ЗаголовкиВозвращены вручную закройте только собственное приложение. Не называйте это полным возвратом окна: Mode/OS нельзя изменить из формы. Сохраненная запись не удаляется. Не запускайте параллельные сеансы и не меняйте конфигурацию/пользователя/интерфейс между двумя стартами.
Второй ручной запуск той же базы/пользователя задайте с /C"Уч85Окно|<тот же UUID-marker пути>|ВОЗВРАТ85". Native BeforeStart проверяет сохраненный actualIBUserUUID реального текущего пользователя ИБ и nonce, фазу и исходные тексты. Режим окна может уже быть исходным из нового запуска либо оставаться нашим РабочимМестом; иные режимы отвергаются. Возвращаются сохраненные Normal/исходный Boolean OS, не guessed defaults.
Второй native OnStart после открытия проверяет фактические mode/OS/caption/short и только затем сохраняет Завершен. Пользователь отдельно осматривает окно. Font getter дает вариант шрифта, не пиксельный размер/имя установленного шрифта; ТипПриложения — настоящий тонкий клиент.
КлиентСИспользованиемАвтономногоСервера по точной native справке проверяет способность данного типа клиента работать с автономным сервером, не факт подключения. В этом fixture явно FileIB; значениеBoolean не объявляется живым соединением с автономным сервером, и сервер не запускается.
Любая ошибка/cancel может оставить собственный state/оформление частично измененными. Ключи/phase не являются общей транзакцией или доказательством скриншота; автоматического blindrestore/retry/deleteall нет. При неизвестном/частичном результате остановитесь и вручную проверьте только свой стенд. При авторстве реальные1С/настройкиБД/UI/процессы/сеть/файлы не изменялись, backup0.
Перем СвояМеткаОкна85;
Перем СвойСтартОкна85;
Перем СвойСнимокОкна85;
Процедура ПередНачаломРаботыСистемы(Отказ)
#Если ТонкийКлиент Тогда
Части = СтрРазделить(ПараметрЗапуска, "|", Ложь);
Если Части.Количество() <> 3 Или Части[0] <> "Уч85Окно"
Или (Части[2] <> "ОПЫТ85" И Части[2] <> "ВОЗВРАТ85") Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
СвояМеткаОкна85 = Части[1];
СвойСтартОкна85 = Части[2];
Если ТипЗнч(КлиентскоеПриложение) <> Тип("КлиентскоеПриложение")
Или КлиентскоеПриложение.ТипПриложения() <> ТипКлиентскогоПриложения.ТонкийКлиент
Или КлиентскоеПриложение.ТекущийВариантИнтерфейса() <> ВариантИнтерфейсаКлиентскогоПриложения.Такси
Или ТипЗнч(КлиентскоеПриложение.ПолучитьОтображениеЗаголовкаОС()) <> Тип("Булево") Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Если СвойСтартОкна85 = "ОПЫТ85" Тогда
СвойСнимокОкна85 = УчебноеОкно85.СохранитьПервоеСостояниеОкна85(СвояМеткаОкна85,
КлиентскоеПриложение.ПолучитьРежимОсновногоОкна(), КлиентскоеПриложение.ПолучитьОтображениеЗаголовкаОС(),
КлиентскоеПриложение.ПолучитьЗаголовок(), КлиентскоеПриложение.ПолучитьКраткийЗаголовок());
ТребуемоеОкно = РежимОсновногоОкнаКлиентскогоПриложения.РабочееМесто;
ТребуемыйОС = СвойСнимокОкна85.СвойЗаголовокОС;
Иначе
СвойСнимокОкна85 = УчебноеОкно85.ПолучитьСвоеСостояниеОкна85(СвояМеткаОкна85);
Если СвойСнимокОкна85.Фаза <> "ЗаголовкиВозвращены"
Или КлиентскоеПриложение.ПолучитьЗаголовок() <> СвойСнимокОкна85.Заголовок
Или КлиентскоеПриложение.ПолучитьКраткийЗаголовок() <> СвойСнимокОкна85.КраткийЗаголовок Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
ТекущееОкно = КлиентскоеПриложение.ПолучитьРежимОсновногоОкна();
Если ТекущееОкно <> СвойСнимокОкна85.РежимОкна
И ТекущееОкно <> РежимОсновногоОкнаКлиентскогоПриложения.РабочееМесто Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
СвойСнимокОкна85 = УчебноеОкно85.ПеревестиСвоюФазуОкна85(СвояМеткаОкна85, СвойСнимокОкна85.Nonce, "ЗаголовкиВозвращены", "ВозвратНачат");
ТребуемоеОкно = СвойСнимокОкна85.РежимОкна;
ТребуемыйОС = СвойСнимокОкна85.ЗаголовокОС;
КонецЕсли;
КлиентскоеПриложение.УстановитьРежимОсновногоОкна(ТребуемоеОкно);
КлиентскоеПриложение.УстановитьОтображениеЗаголовкаОС(ТребуемыйОС);
Если КлиентскоеПриложение.ПолучитьРежимОсновногоОкна() <> ТребуемоеОкно
Или КлиентскоеПриложение.ПолучитьОтображениеЗаголовкаОС() <> ТребуемыйОС Тогда
Отказ = Истина;
КонецЕсли;
#Иначе
Отказ = Истина;
#КонецЕсли
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
Если СвойСнимокОкна85 = Неопределено Тогда
ВызватьИсключение "Own native BeforeStart не подготовил настоящий сохраненный baseline";
КонецЕсли;
Свежий = УчебноеОкно85.ПолучитьСвоеСостояниеОкна85(СвояМеткаОкна85);
Если Свежий.Nonce <> СвойСнимокОкна85.Nonce Тогда
ВызватьИсключение "Собственный старт получил чужой nonce";
КонецЕсли;
Если СвойСтартОкна85 = "ОПЫТ85" Тогда
Если Свежий.Фаза <> "Подготовлен" Или КлиентскоеПриложение.ПолучитьРежимОсновногоОкна() <> РежимОсновногоОкнаКлиентскогоПриложения.РабочееМесто
Или КлиентскоеПриложение.ПолучитьОтображениеЗаголовкаОС() <> Свежий.СвойЗаголовокОС
Или КлиентскоеПриложение.ПолучитьЗаголовок() <> Свежий.Заголовок
Или КлиентскоеПриложение.ПолучитьКраткийЗаголовок() <> Свежий.КраткийЗаголовок Тогда
ВызватьИсключение "Actual own first main-window/baseline не подтвержден; не перезаписываем заголовки";
КонецЕсли;
КлиентскоеПриложение.УстановитьЗаголовок(Свежий.СвойЗаголовок);
КлиентскоеПриложение.УстановитьКраткийЗаголовок(Свежий.СвойКраткий);
Если КлиентскоеПриложение.ПолучитьЗаголовок() <> Свежий.СвойЗаголовок
Или КлиентскоеПриложение.ПолучитьКраткийЗаголовок() <> Свежий.СвойКраткий Тогда
ВызватьИсключение "Own заголовки могли измениться частично, но отдельно не подтверждены. Повтора/автоrestore нет";
КонецЕсли;
СвойСнимокОкна85 = УчебноеОкно85.ПеревестиСвоюФазуОкна85(СвояМеткаОкна85, Свежий.Nonce, "Подготовлен", "Показан");
Иначе
Если Свежий.Фаза <> "ВозвратНачат" Или КлиентскоеПриложение.ПолучитьРежимОсновногоОкна() <> Свежий.РежимОкна
Или КлиентскоеПриложение.ПолучитьОтображениеЗаголовкаОС() <> Свежий.ЗаголовокОС
Или КлиентскоеПриложение.ПолучитьЗаголовок() <> Свежий.Заголовок
Или КлиентскоеПриложение.ПолучитьКраткийЗаголовок() <> Свежий.КраткийЗаголовок Тогда
ВызватьИсключение "Исходный real saved own UI baseline после второго старта не подтвержден";
КонецЕсли;
СвойСнимокОкна85 = УчебноеОкно85.ПеревестиСвоюФазуОкна85(СвояМеткаОкна85, Свежий.Nonce, "ВозвратНачат", "Завершен");
КонецЕсли;
Шрифт = КлиентскоеПриложение.ТекущийВариантОсновногоШрифта();
ВозможенАвтономный = КлиентскоеПриложение.КлиентСИспользованиемАвтономногоСервера();
Если ТипЗнч(Шрифт) <> Тип("ВариантОсновногоШрифтаКлиентскогоПриложения") Или ТипЗнч(ВозможенАвтономный) <> Тип("Булево") Тогда
ВызватьИсключение "Native font/capability types не совпали";
КонецЕсли;
Сообщить("Свой thin-client: " + Строка(КлиентскоеПриложение.ТипПриложения()) + "; основной шрифт: " + Строка(Шрифт));
Сообщить("Способность этого типа клиента работать с автономным сервером: " + Строка(ВозможенАвтономный) + ". Это НЕ факт подключения: наш fixture использует FileIB");
Сообщить("Own phase: " + СвойСнимокОкна85.Фаза + "; nonce: " + СвойСнимокОкна85.Nonce);
ОткрытьФорму("ОбщаяФорма.УчебноеОкно85", Новый Структура("МеткаБазы,Nonce", СвояМеткаОкна85, СвойСнимокОкна85.Nonce));
КонецПроцедурыПолный серверный модуль собственного baseline/phase в одном current-user system-settings ключе
Конфигуратор → Общие → Общие модули → УчебноеОкно85 → Модуль.
Серверный server-call общий модуль; exact ownIB/current realuser и только own scoped native settings. Window/OS client setters здесь отсутствуют.
Функция СохранитьПервоеСостояниеОкна85(МеткаБазы, ИсходноеОкно, ИсходныйОС, ИсходныйЗаголовок, ИсходныйКраткий) Экспорт
Паспорт = ПроверитьСвоюБазуОкна85(МеткаБазы);
Если ХранилищеСистемныхНастроек.Загрузить(Паспорт.КлючОбъекта, "СвойЦиклОкна85") <> Неопределено Тогда
ВызватьИсключение "Own namespace уже содержит состояние; первый запуск не повторяется";
КонецЕсли;
Если ТипЗнч(ИсходноеОкно) <> Тип("РежимОсновногоОкнаКлиентскогоПриложения")
Или ИсходноеОкно <> РежимОсновногоОкнаКлиентскогоПриложения.Обычный
Или ТипЗнч(ИсходныйОС) <> Тип("Булево")
Или ТипЗнч(ИсходныйЗаголовок) <> Тип("Строка") Или СтрДлина(ИсходныйЗаголовок) > 512
Или ТипЗнч(ИсходныйКраткий) <> Тип("Строка") Или СтрДлина(ИсходныйКраткий) > 512 Тогда
ВызватьИсключение "Нужен реальный Normal/Boolean OScaption собственный baseline и две исходные строки";
КонецЕсли;
Nonce = Строка(Новый УникальныйИдентификатор);
Состояние = Новый Структура("База,Пользователь,Nonce,РежимОкна,ЗаголовокОС,СвойЗаголовокОС,Заголовок,КраткийЗаголовок,СвойЗаголовок,СвойКраткий,Фаза",
МеткаБазы, Паспорт.Пользователь, Nonce, ИсходноеОкно, ИсходныйОС, Не ИсходныйОС, ИсходныйЗаголовок, ИсходныйКраткий,
"Уч85Окно | Книга3×250=750 | " + Nonce, "Книга750 | " + Nonce, "Подготовлен");
ХранилищеСистемныхНастроек.Сохранить(Паспорт.КлючОбъекта, "СвойЦиклОкна85", Состояние);
Свежий = ПолучитьСвоеСостояниеОкна85(МеткаБазы);
Если Свежий.Nonce <> Nonce Или Свежий.Фаза <> "Подготовлен" Тогда
ВызватьИсключение "Запись своего baseline могла произойти, но отдельно не подтверждена; не повторяйте";
КонецЕсли;
Возврат Свежий;
КонецФункции
Функция ПолучитьСвоеСостояниеОкна85(МеткаБазы) Экспорт
Паспорт = ПроверитьСвоюБазуОкна85(МеткаБазы);
Состояние = ХранилищеСистемныхНастроек.Загрузить(Паспорт.КлючОбъекта, "СвойЦиклОкна85");
Если ТипЗнч(Состояние) <> Тип("Структура") Тогда
ВызватьИсключение "Собственный real saved baseline не найден";
КонецЕсли;
Если Состояние.База <> МеткаБазы Или Состояние.Пользователь <> Паспорт.Пользователь
Или ТипЗнч(Состояние.Nonce) <> Тип("Строка") Или СтрДлина(Состояние.Nonce) <> 36
Или Состояние.РежимОкна <> РежимОсновногоОкнаКлиентскогоПриложения.Обычный
Или ТипЗнч(Состояние.ЗаголовокОС) <> Тип("Булево") Или ТипЗнч(Состояние.СвойЗаголовокОС) <> Тип("Булево")
Или Состояние.СвойЗаголовокОС <> (Не Состояние.ЗаголовокОС) Или ТипЗнч(Состояние.Заголовок) <> Тип("Строка")
Или ТипЗнч(Состояние.КраткийЗаголовок) <> Тип("Строка") Или СтрДлина(Состояние.Заголовок) > 512
Или СтрДлина(Состояние.КраткийЗаголовок) > 512 Тогда
ВызватьИсключение "Own namespace/current actualIBUserUUID/baseline passport изменен";
КонецЕсли;
UUIDNonce = Новый УникальныйИдентификатор(Состояние.Nonce);
Если Состояние.Nonce <> Строка(UUIDNonce) Или UUIDNonce = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")
Или Состояние.СвойЗаголовок <> "Уч85Окно | Книга3×250=750 | " + Состояние.Nonce
Или Состояние.СвойКраткий <> "Книга750 | " + Состояние.Nonce Тогда
ВызватьИсключение "Собственная учебная строка/nonce не подтвердились";
КонецЕсли;
Возврат Состояние;
КонецФункции
Функция ПеревестиСвоюФазуОкна85(МеткаБазы, Nonce, ИзФазы, ВФазу) Экспорт
Паспорт = ПроверитьСвоюБазуОкна85(МеткаБазы);
Состояние = ПолучитьСвоеСостояниеОкна85(МеткаБазы);
Если Состояние.Nonce <> Nonce Или Состояние.Фаза <> ИзФазы Тогда
ВызватьИсключение "Чужой/старый nonce или повтор own phase не принимается";
КонецЕсли;
Допустимо = (ИзФазы = "Подготовлен" И ВФазу = "Показан")
Или (ИзФазы = "Показан" И ВФазу = "ЗаголовкиВозвращены")
Или (ИзФазы = "ЗаголовкиВозвращены" И ВФазу = "ВозвратНачат")
Или (ИзФазы = "ВозвратНачат" И ВФазу = "Завершен");
Если Не Допустимо Тогда
ВызватьИсключение "Переход не входит в собственный цикл двух ручных запусков";
КонецЕсли;
Состояние.Фаза = ВФазу;
ХранилищеСистемныхНастроек.Сохранить(Паспорт.КлючОбъекта, "СвойЦиклОкна85", Состояние);
Свежий = ПолучитьСвоеСостояниеОкна85(МеткаБазы);
Если Свежий.Фаза <> ВФазу Или Свежий.Nonce <> Nonce Тогда
ВызватьИсключение "Переход own phase мог сохраниться, но отдельно не подтвержден; автоматического повтора нет";
КонецЕсли;
Возврат Свежий;
КонецФункции
Функция ПроверитьСвоюБазуОкна85(МеткаБазы)
ПроверитьСвойПустойСтенд();
UUIDМетки = Новый УникальныйИдентификатор(МеткаБазы);
Если МеткаБазы <> Строка(UUIDМетки) Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
ВызватьИсключение "Own file-path marker должен быть canonical nonzero UUID; это метка пути, не UUID базы и не UUID реального пользователя ИБ";
КонецЕсли;
Соединение = "File=""C:\1c-labs\Уч85Окно_" + МеткаБазы + "\"";";
Если СтрокаСоединенияИнформационнойБазы() <> Соединение Или ПривилегированныйРежим() Тогда
ВызватьИсключение "Нужна только точная собственная новая FileIB без privileged. Connection string не выводится";
КонецЕсли;
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
ВызватьИсключение "Нужен единственный real ownIBUser";
КонецЕсли;
Если Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор
Или Текущий.Имя <> "Уч85Окно_" + МеткаБазы Или Метаданные.ОбщиеФормы.Количество() <> 1
Или Метаданные.ОбщиеФормы.УчебноеОкно85.Имя <> "УчебноеОкно85"
Или Метаданные.Боты.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0 Тогда
ВызватьИсключение "Own actual user/sole common form/empty metadata не подтверждены";
КонецЕсли;
Возврат Новый Структура("КлючОбъекта,Пользователь", "Уч85Окно85_" + МеткаБазы, Строка(Текущий.УникальныйИдентификатор));
КонецФункции
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыПолный модуль собственной общей управляемой формы: проверка и возврат только заголовков
Конфигуратор → Общие → Общие формы → УчебноеОкно85 → Модуль.
Клиент-серверный модуль actual общей управляемой формы. Прямые window/OS setters запрещены; settings остаются серверными.
Перем ВозвратЗаголовковНачат85;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МеткаБазы = Параметры.МеткаБазы;
Nonce = Параметры.Nonce;
Состояние = УчебноеОкно85.ПолучитьСвоеСостояниеОкна85(МеткаБазы);
Если Состояние.Nonce <> Nonce Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьОкно(Команда)
Состояние = ПолучитьСостояниеНаСервере85();
Если КлиентскоеПриложение.ТипПриложения() <> ТипКлиентскогоПриложения.ТонкийКлиент Тогда
ВызватьИсключение "Это не наш собственный тонкий клиент";
КонецЕсли;
Сообщить("Сохраненная own phase: " + Состояние.Фаза + "; actual window: " + Строка(КлиентскоеПриложение.ПолучитьРежимОсновногоОкна())
+ "; actual OS caption: " + Строка(КлиентскоеПриложение.ПолучитьОтображениеЗаголовкаОС()));
КонецПроцедуры
&НаКлиенте
Процедура ВернутьСвоиЗаголовки(Команда)
Если ВозвратЗаголовковНачат85 = Истина Или Подтверждение <> "ВОЗВРАТ МОИХ ЗАГОЛОВКОВ85" Тогда
ВызватьИсключение "Own возврат заголовков одноразовый и требует отдельной фразы";
КонецЕсли;
Состояние = ПолучитьСостояниеНаСервере85();
Если Состояние.Фаза <> "Показан" Или КлиентскоеПриложение.ТипПриложения() <> ТипКлиентскогоПриложения.ТонкийКлиент
Или КлиентскоеПриложение.ПолучитьЗаголовок() <> Состояние.СвойЗаголовок
Или КлиентскоеПриложение.ПолучитьКраткийЗаголовок() <> Состояние.СвойКраткий
Или КлиентскоеПриложение.ПолучитьРежимОсновногоОкна() <> РежимОсновногоОкнаКлиентскогоПриложения.РабочееМесто
Или КлиентскоеПриложение.ПолучитьОтображениеЗаголовкаОС() <> Состояние.СвойЗаголовокОС Тогда
ВызватьИсключение "Текущее оформление уже не наш checked snapshot; чужие/частичные значения не перезаписываются";
КонецЕсли;
ВозвратЗаголовковНачат85 = Истина;
КлиентскоеПриложение.УстановитьЗаголовок(Состояние.Заголовок);
КлиентскоеПриложение.УстановитьКраткийЗаголовок(Состояние.КраткийЗаголовок);
Если КлиентскоеПриложение.ПолучитьЗаголовок() <> Состояние.Заголовок
Или КлиентскоеПриложение.ПолучитьКраткийЗаголовок() <> Состояние.КраткийЗаголовок Тогда
ВызватьИсключение "Own возврат мог произойти частично, но отдельно не подтвержден; не повторяйте";
КонецЕсли;
ПодтвердитьЗаголовкиНаСервере85();
Сообщить("Только два own заголовка возвращены. Window-mode/OS-caption setters из формы запрещены: их восстановит следующий отдельный native BeforeStart с ВОЗВРАТ85");
КонецПроцедуры
&НаСервере
Функция ПолучитьСостояниеНаСервере85()
Состояние = УчебноеОкно85.ПолучитьСвоеСостояниеОкна85(МеткаБазы);
Если Состояние.Nonce <> Nonce Тогда
ВызватьИсключение "Own form nonce не совпал с actual saved state";
КонецЕсли;
Возврат Состояние;
КонецФункции
&НаСервере
Процедура ПодтвердитьЗаголовкиНаСервере85()
УчебноеОкно85.ПеревестиСвоюФазуОкна85(МеткаБазы, Nonce, "Показан", "ЗаголовкиВозвращены");
КонецПроцедурыРазбор по шагам
Native readonly globalfactory дает текущий КлиентскоеПриложение; startup guard требует Thin/Taxi и Boolean OS-caption, исключая неподдерживаемые clients/styles.
ПередНачаломРаботыСистемы имеет1параметр Отказ, OnStart0. Ни формы, ни сообщений/окон не создается до готовности главного окна; оба ограниченных setters находятся прямо в BeforeStart.
Первый baseline взят из реальных getters до изменения, ограничен Normal/Boolean OS и сохраняется только в собственном user-scoped ключе, который изначально отсутствует. Противоположный Boolean используется для видимого собственного опыта.
Сервер проверяет exact emptyFileIB/version/oneactualuser и сохраненный actualIBUserUUID реального пользователя ИБ. UUID самой базы не измеряется; ее поле База содержит marker пути. Settings.Load/Save без имени пользователя используют текущего; чужие ключи/пользователи/настройки не затрагиваются.
После реального открытия своего окна mode/OS и заголовки сверяются. Новые caption/short с own nonce устанавливаются и читаются, не заявляются нарисованными только по return setters.
Форма восстанавливает только два своих текста при совпадении текущего собственного оформления. Ее one-shot flag ставится до setters; partialfailure не запускает повтор или автоматический restore.
Второй настоящий запуск разрешен после возвращенных текстов и подтвержденного состояния. Перед стартом допустимы только original/own window mode; новый клиент не выдается за тот же ОС-процесс.
Восстановление Window/OS происходит только в новом native BeforeStart. OnStart отдельно читает весь original baseline и завершает own saved phase; запись сохраняется для ручной проверки.
Font/тип/standalone capability применяются к текущему реальному клиенту. CapabilityBoolean не доказывает actual autonomous connection или готовый запущенный сервер.
Как проверить результат
После первого старта свое приложение показывает РабочееМесто, противоположное собственному baseline отображение ОС-заголовка и два текста750; главный код не управляет чужими процессами.
Форма подтверждает exact own nonce/current appearance и возвращает исходные два текста; window/OS setters из нее отсутствуют.
После второго старта реальные mode/OS/caption/short совпали с сохраненным исходным baseline, а собственная запись отмечена Завершен.
Возврат не выполняется при другом пользователе/пути/фазе/nonce/измененном оформлении. Partial/cancel не объявляются успешным завершением.
Отчет о способности автономного сервера отделен от фактического FileIB connection. Шрифт прочитан как enum, не выдуманный Windows font.
Нужен ручной запуск и визуальная проверка владельца своего стенда. Здесь native/static проверки, а не runtime/UI/DB результат вашей базы.
Ожидаемый результат
При двух успешных ручных запусках своего подготовленного WindowsThinTaxi/FileIB стенда native startup события меняют и отдельно возвращают оформление текущего собственного клиента. Исходные значения действительно получены getters и сохранены только в своем ключе текущего пользователя. Здесь runtime0; реальное отображение/перезапуск/настройки вашей базы не выполнялись.
На что обратить внимание
КлиентскоеПриложение получается из readonly global property, не constructor и не неизвестный переданный объект. Тот же тип доступен на сервере, но конкретные window/OS methods имеют более узкую client availability.
УстановитьРежимОсновногоОкна и УстановитьОтображениеЗаголовкаОС разрешены исключительно в ПередНачаломРаботыСистемы. Нельзя восстановить их в форме/OnStart/обычном общему helper даже в thin-client.
OS setter реально действует только WindowsThin/ThickTaxi; другие clients/interfaces игнорируют вызов. Getter может вернуть Undefined. Нельзя трактовать игнорирование как успешную UI-операцию.
РабочееМесто скрывает меню, панели и горячие клавиши. Собственная заранее созданная общая форма открывается только после появления главного окна, поэтому опыт не зависит от скрытого пункта открытия EPF.
Краткий заголовок автоматически отделяется точкой и участвует в составном системном заголовке. Getter своего значения не является OCR/скриншотом полного заголовка ОС.
Settings storage scope — IB/имя пользователя. Переименование не загружает старые настройки, повторное использование имени может их наследовать; поэтому сохраненный actualIBUserUUID реального пользователя ИБ проверяется и не заменяется marker пути или UUID самой базы.
Save требует СохранениеДанныхПользователя. Thin не вызывает системное settings storage напрямую; отдельный серверный модуль использует только own keys/currentuser, не стороннюю управленческую базу.
Native startup отказ/exception может произойти после saved state или частичного UI изменения. Restore phase не является общей транзакцией. Не повторяйте первый старт поверх baseline и не удаляйте все system settings.
Между двумя стартами новый процесс может уже иметь часть defaults. Это допустимый original snapshot, не гарантия сохранения setters между процессами. Иные modes/тексты отвергаются, а не слепо перезаписываются.
Saved phase является журналом только собственного учебного цикла, не физической backup copy и не доказательством реального UI без manual inspection. No files/archives/backup APIs.
Название ClientUsesStandaloneServer неоднозначно; exact native описание — способность типа клиента. True не означает actual connection, False из регламентного задания не описывает ваше интерактивное окно.
В собственной VM нужны один реальный пользователь, неизмененная CF/Taxi и отсутствие параллельных сеансов. Автор не запускал1С/ОС/process/network/DB/settings/UI/files, а статические тесты не заменяют ваши runtime проверки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Посмотреть сохранённый профиль своего пользователя без перезаписи параметров
Читается известный ключ платформенных параметров из системного хранилища. Отсутствие записи не заменяется новым профилем и не считается ошибкой индекса.
Где и как запускать
Полный серверный общий модуль собственной учебной конфигурации. Не модуль запуска рабочей базы.
Подготовка
Создайте серверный общий модуль УчебныеНастройкиКлиента в отдельной своей конфигурации УчебнаяКонфигурацияСинтаксиса. Флаг Сервер включён. Вставьте весь код одного выбранного урока.
Из серверной команды собственной обработки вызовите УчебныеНастройкиКлиента.ВыполнитьПример(). Используйте платформу 8.5.1.1343: новые свойства 8.5 отсутствуют на старых релизах.
Для первого опыта вручную сохраните настройки клиентского приложения через его стандартное окно параметров и заново войдите своим учебным пользователем. Отсутствие сохранённой настройки тоже обрабатывается.
Во всех опытах имя другого пользователя не передаётся. Первый урок только читает системный ключ текущего пользователя; следующие не перезаписывают этот системный ключ.
Последний урок сохраняет один собственный профиль под учебным ключом в ХранилищеОбщихНастроек. Нужна роль с правом СохранениеДанныхПользователя; не включайте привилегированный режим ради опыта.
Проверка объекта и его сериализации не доказывает видимое применение темы, масштаба или расположения панелей. Эксперименты с внешним видом выполняйте только в собственной учебной базе.
Процедура ВыполнитьПример() Экспорт
Профиль = ХранилищеСистемныхНастроек.Загрузить("Общее/НастройкиКлиентскогоПриложения", "");
Если Профиль = Неопределено Тогда
Сообщить("У текущего учебного пользователя ещё нет сохранённого профиля; стандартные параметры не изменены");
Возврат;
КонецЕсли;
Снимок = СнимокСвоегоПрофиля(Профиль);
Сообщить(Снимок.Количество() = 10);
Для Каждого Настройка Из Снимок Цикл
Сообщить(Настройка.Ключ + ": " + Строка(Настройка.Значение));
КонецЦикла;
Сообщить("Это сохранённые параметры, а не измерение фактической раскладки открытого окна");
КонецПроцедуры
Функция СнимокСвоегоПрофиля(Профиль)
Если ТипЗнч(Профиль) <> Тип("НастройкиКлиентскогоПриложения") Тогда
ВызватьИсключение "Ожидался объект настроек клиентского приложения";
КонецЕсли;
Снимок = Новый Структура;
Снимок.Вставить("ВариантИнтерфейсаКлиентскогоПриложения", Профиль.ВариантИнтерфейсаКлиентскогоПриложения);
Снимок.Вставить("ВариантМасштабаКлиентскогоПриложения", Профиль.ВариантМасштабаКлиентскогоПриложения);
Снимок.Вставить("ВариантМасштабаФормКлиентскогоПриложения", Профиль.ВариантМасштабаФормКлиентскогоПриложения);
Снимок.Вставить("ВариантОткрытияОконКлиентскогоПриложения", Профиль.ВариантОткрытияОконКлиентскогоПриложения);
Снимок.Вставить("ВариантОтображенияОсновногоОкнаКлиентскогоПриложения", Профиль.ВариантОтображенияОсновногоОкнаКлиентскогоПриложения);
Снимок.Вставить("ОтображатьПанелиНавигацииИДействий", Профиль.ОтображатьПанелиНавигацииИДействий);
Снимок.Вставить("ОтображатьПанельРазделов", Профиль.ОтображатьПанельРазделов);
Снимок.Вставить("РежимОткрытияФормПриложения", Профиль.РежимОткрытияФормПриложения);
Снимок.Вставить("СкоростьКлиентскогоСоединения", Профиль.СкоростьКлиентскогоСоединения);
Снимок.Вставить("ТемаКлиентскогоПриложения", Профиль.ТемаКлиентскогоПриложения);
Возврат Снимок;
КонецФункцииРазбор по шагам
Загрузить только пустой ключ настройки объекта Общее/НастройкиКлиентскогоПриложения для текущего пользователя.
Если записи нет, вывести объяснение и закончить, не сохранять значения по умолчанию вместо отсутствующей записи.
При существующей записи проверить реальный тип и собрать десять параметров в обычную структуру.
Вывести имена и фактические значения; ВариантМасштабаКлиентскогоПриложения только читается.
Сопоставить с собственными сохранёнными параметрами. Режим запуска, клиент и параметры конфигурации также влияют на фактический внешний вид.
Как проверить результат
При наличии записи первая проверка Истина, затем десять строк с именами параметров.
При отсутствии записи — понятное сообщение; ни новый профиль, ни сохранение в системном хранилище не выполняются.
Ожидаемый результат
Получен реальный снимок сохранённых параметров своего пользователя без изменения профиля.
На что обратить внимание
Системный ключ подтверждён чтением кода КА2 Progress: CommonModules/ПользователиСлужебный/Ext/Module.bsl, процедура УстановитьНачальныеНастройки. БСП не вызывается, зависимости от этого общего модуля нет.
Не подставляйте имя чужого пользователя: это другая задача и потребует дополнительных прав.
Создание нового НастройкиКлиентскогоПриложения не заменяет загрузку существующей сохранённой записи.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.