Возникает на сервере при создании формы.
Синтаксис
ПриСозданииНаСервере(<Отказ>, <СтандартнаяОбработка>)Полное описание, параметры и ограничения
ФормаКлиентскогоПриложения.ПриСозданииНаСервере (ClientApplicationForm.OnCreateAtServer)
ФормаКлиентскогоПриложения (ClientApplicationForm)
ПриСозданииНаСервере (OnCreateAtServer)
Доступен, начиная с версии 8.2.
Синтаксис:
ПриСозданииНаСервере(<Отказ>, <СтандартнаяОбработка>)
Параметры:
<Отказ>
Тип: Булево.
Признак отказа от создания формы. Если в теле процедуры-обработчика установить данному параметру значение Истина, то форма создана не будет.
Значение по умолчанию: Ложь.
<СтандартнаяОбработка>
Тип: Булево.
В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет.
Значение по умолчанию: Истина.
Описание:
Возникает на сервере при создании формы.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Заполнить строку таблицы управляемой формы
Реквизит формы типа ТаблицаЗначений представлен данными формы; его строки получают свойства из колонок.
Где и как запускать
Серверный модуль управляемой формы внешней обработки, обработчик ПриСозданииНаСервере.
Подготовка
Создайте внешнюю обработку с управляемой формой и реквизитом Товары типа ТаблицаЗначений.
В дереве реквизитов добавьте колонки Наименование (Строка), Количество (Число), Цена (Число), затем перетащите таблицу на форму.
Свяжите код с событием формы ПриСозданииНаСервере.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СтрокаТовара = Товары.Добавить();
СтрокаТовара.Наименование = "Тетрадь";
СтрокаТовара.Количество = 3;
СтрокаТовара.Цена = 150;
Сообщить(СтрокаТовара.Количество * СтрокаТовара.Цена);
КонецПроцедурыРазбор по шагам
Товары — коллекция данных формы, а не локальная таблица из конструктора.
Добавить возвращает элемент этой коллекции.
Имена его свойств соответствуют заданным колонкам формы.
Как проверить результат
Открытая форма содержит одну строку Тетрадь, 3, 150.
Сообщение показывает 450; новый экземпляр формы снова имеет одну строку.
Ожидаемый результат
Заполнена строка данных формы без записи документа.
На что обратить внимание
Не создавайте отдельную ТаблицаЗначений вместо реквизита формы на клиенте.
Этот обработчик запускается при создании экземпляра, а не при каждом показе уже открытой формы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Свое клиентское приложение: учебное окно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 проверки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.