МенеджерАгентаКлиентскогоПриложения.УстановитьНаименованиеПриложения

Методы · SetApplicationDescription

Устанавливает текущее наименование приложения.

Синтаксис

УстановитьНаименованиеПриложения(<НаименованиеПриложения>)
Полное описание, параметры и ограничения

МенеджерАгентаКлиентскогоПриложения.УстановитьНаименованиеПриложения (ClientApplicationAgentManager.SetApplicationDescription)

МенеджерАгентаКлиентскогоПриложения (ClientApplicationAgentManager)

УстановитьНаименованиеПриложения (SetApplicationDescription)

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

Синтаксис:
УстановитьНаименованиеПриложения(<НаименованиеПриложения>)
Параметры:

<НаименованиеПриложения> (обязательный)
Тип: Строка.
Наименование приложения в агенте клиентского приложения.
Описание:

Устанавливает текущее наименование приложения.

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

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

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

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

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

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

Свой агент тонкого клиента: реальное наблюдение, явное подключение, own description и отдельное отключение

Полный actual managed-form module с native factory/global readonly manager, StateChangeHandler2, optional installer phase и explicit own one-shot Connect/Disconnect. Настоящее состояние отдельно от returnBegin, Undefined отдельно отFalse, восстановление только собственного description перед отключением.

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

Основной код целиком в модуль собственной управляемой формы. Все agentcalls только &НаКлиенте/ТонкийКлиент. Supporting SERVER отдельно в server-call общий модуль УчебныйАгент85. Новая пустая своя FileIB, exact UUID-marker, один actual IBUser, отдельная OS-VM без чужих агентских приложений.

Подготовка

  1. Используйте отдельную собственную Windows VM/собственного OS-пользователя для нового опыта. В ней не должно быть других 1С-сеансов/подключенных к агенту приложений/сторонних handlers. Native API не предоставляет ownership proof OS-процесса: эта реальная изоляция обязательна; текст подтверждения ее не создает.

  2. Вручную создайте новый canonical nonzero UUIDmarker и новую пустую FileIB C:\1c-labs\Уч85Агент_<UUID>\, конфигурация УчебныйАгент85 на платформе8.5.1.1343. В списке баз тонкого клиента зарегистрируйте точную строку File="C:\1c-labs\Уч85Агент_<UUID>\";. Другие пути/порядок/лишние параметры отказываются, реальная строка не печатается. UUIDmarker пути не является realIBUUID.

  3. В конфигурации нет справочников/документов/регистров/общих реквизитов/разделителей/расширений/подписок/регламентных заданий/ботов/констант. Ничего не копируйте из production. Один realIBUser Уч85Агент_<UUID> с правами чтения списка пользователей в собственной учебной базе; входим только под ним. Имена/nonce не используются как fake ссылки/профили.

  4. Конфигуратор → Общие → Общие модули → УчебныйАгент85: Сервер/Вызов сервера=Да, Клиент/Привилегированный/Глобальный=Нет. Вставьте полный supporting SERVER. Он проверяет metadata/version/точную File connection/одного actual IBUser/безпривилегированного режима и ничего не создает/не записывает.

  5. В своей внешней обработке создайте управляемую форму с реквизитами МеткаСвоейБазы Строка36 и строковыми подтверждениями длиной100: ПодтверждениеСреды, ПодтверждениеУстановки, ПодтверждениеЗавершенияУстановки, ПодтверждениеПодключения, ПодтверждениеИмени, ПодтверждениеОтключения. Вставьте CLIENT целиком именно в модуль управляемой формы; ЭтотОбъект здесь настоящий экземпляр формы, не arbitrary callback module.

  6. Создайте команды с одноименными обработчиками ПодготовитьНаблюдение/ПроверитьСостояние/УстановитьСвойАгент/ПодтвердитьЗавершениеУстановки/ПодключитьСвойАгент/НазватьСвоеПриложение/ОтключитьСвоеПриложение/СнятьСвойНаблюдатель. Никакого автостарта/таймера/запускаприоткрытии/handler из сервера нет; всяagent работа толькоclient.

  7. Запустите свою базу только тонким клиентом. Макрос ТонкийКлиент ограничивает этот fixture. Web/thick native доступны, но их браузерные permissions/origins/installer preparation не выдаются здесь проверенными; отдельный сервер/PWA/provider не нужен.

  8. На своей VM заранее подготовьте официальный агент платформы8.5.1.1343 согласно документации установленной поставки. Альтернатива — отдельный необязательный BeginInstallation: он может показывать реальные запросы установки и менять ПО вашей VM. Урок не выдумывает URL загрузки, путь установщика, CLI или обход политик. При авторстве установка не выполнялась.

  9. Введите свой UUID-marker и МОЯ ОТДЕЛЬНАЯ VM И АГЕНТ85, нажмите ПодготовитьНаблюдение один раз. Уже подключенный агент отвергается; допускаются НеЗапущен/Отключен. Используется настоящий менеджер из глобального свойства, без конструктора. ОписаниеОповещения с этим экземпляром формы и своим nonce сохраняется для точного отключения обработчика.

  10. ПроверитьСостояние читает только текущий снимок. НеЗапущен не доказывает отсутствие установленного агента. Отключен означает, что агент запущен, но это приложение не подключено; Подключен — подключено. ВерсияАктуальна и описание могут быть Неопределено при незапущенном агенте: это не Ложь и не пустая строка.

  11. Если агент не запущен или неактуален, необязательная установка разрешается фразой УСТАНОВКА ТОЛЬКО В МОЕЙ VM85 и отдельной командой один раз. НачатьУстановку не принимает аргументов. Пока установка идет, подключение запрещено. Завершите либо отмените реальный установщик своей VM; возврат метода не является доказательством успеха.

  12. После вручную подтвержденного завершения установщика запустите свой агент официальным способом своей поставки, если требуется. Команда ПодтвердитьЗавершениеУстановки с фразой МОЙ INSTALLER ЗАВЕРШЕН85 дополнительно проверяет Отключен и актуальную версию. Это не автоматическая проверка состояния ОС-установщика. Если завершение неизвестно, следующее действие не запускайте.

  13. При состоянии Отключен и актуальной версии задайте ОДНО МОЕ ПОДКЛЮЧЕНИЕ85 и нажмите ПодключитьСвойАгент один раз. Фаза устанавливается до НачатьПодключение(). Платформа сама вызывает ПриИзмененииСвоегоАгента85(Состояние,Дополнительно). Готовность требует настоящего события Подключен и свежего такого же состояния, не прямого учебного вызова обработчика.

  14. После настоящего события подключения задайте ИМЯ ТОЛЬКО МОЕГО ПРИЛОЖЕНИЯ85 и нажмите НазватьСвоеПриложение. Сохраняется исходная строка описания; новое значение Книга750 со своим nonce задается и отдельно читается. Это описание текущего приложения в агенте, не заголовок ОС, имя IB или конфигурации. Исходное описание не выводится.

  15. Задайте ОДНО МОЕ ОТКЛЮЧЕНИЕ85 и нажмите ОтключитьСвоеПриложение. Сначала проверяется, что текущее описание все еще наше; только тогда возвращается исходная строка и проверяется чтением. Затем вызывается НачатьОтключение(). Если описание изменил кто-то другой, его не перезаписывают и отключение не запускают.

  16. Дождитесь настоящего события Отключен и текущего такого же состояния, затем нажмите СнятьСвойНаблюдатель. Передается именно сохраненное ОписаниеОповещения, не вызов без аргумента для всех обработчиков. Поздние события игнорируются. Агентский процесс и установщик не останавливаются этими действиями. Закрывайте форму после отдельно подтвержденного завершения цикла.

  17. Ошибка может оставить установку, подключение, описание или наблюдатель частично измененными. Не повторяйте фазы, не убивайте процесс и не отключайте чужие обработчики. На своем выделенном стенде проверяйте фактическое состояние вручную. Здесь только статические/native проверки: реальные UI, установка, сеть, файлы, ОС, БД и1С не запускались; backups0.

Перем СвойКонтекстАгента85;
Перем СвойОбработчикАгента85;
Перем ОбработчикПодключен85;
Перем ФазаАгента85;
Перем УстановкаНачата85;
Перем ПодключениеНачато85;
Перем ОтключениеНачато85;
Перем СвоеИмяЗадано85;
Перем ИсходноеИмяАгента85;

&НаКлиенте
Процедура ПодготовитьНаблюдение(Команда)
    ПроверитьТонкийКлиентАгента85();
    ПроверитьСтендНаСервере85();
    Если СвойКонтекстАгента85 <> Неопределено Тогда
        ВызватьИсключение "Подготовка одноразовая: используйте именно свои текущие handler/nonce";
    КонецЕсли;
    Если ПодтверждениеСреды <> "МОЯ ОТДЕЛЬНАЯ VM И АГЕНТ85" Тогда
        ВызватьИсключение "Нужна действительно отдельная собственная OS-среда без чужих приложений; native API не доказывает ownership агентского процесса";
    КонецЕсли;
    Если ТипЗнч(АгентКлиентскогоПриложения) <> Тип("МенеджерАгентаКлиентскогоПриложения") Тогда
        ВызватьИсключение "Нужен настоящий readonly global agent manager, не user-created object";
    КонецЕсли;
    Состояние = АгентКлиентскогоПриложения.ПолучитьТекущееСостояние();
    Если Состояние = СостояниеАгентаКлиентскогоПриложения.Подключен Тогда
        ВызватьИсключение "Не перехватываем уже подключенный agent: начните отдельный новый опыт в своей изолированной OS-среде";
    КонецЕсли;
    СвойКонтекстАгента85 = Новый Структура("Ключ", Строка(Новый УникальныйИдентификатор));
    ФазаАгента85 = "Наблюдение";
    ОбработчикПодключен85 = Ложь;
    УстановкаНачата85 = Ложь;
    ПодключениеНачато85 = Ложь;
    ОтключениеНачато85 = Ложь;
    СвоеИмяЗадано85 = Ложь;
    ИсходноеИмяАгента85 = Неопределено;
    СвойОбработчикАгента85 = Новый ОписаниеОповещения("ПриИзмененииСвоегоАгента85", ЭтотОбъект, СвойКонтекстАгента85);
    АгентКлиентскогоПриложения.ПодключитьОбработчикИзмененияСостояния(СвойОбработчикАгента85);
    ОбработчикПодключен85 = Истина;
    ПоказатьСнимокСвоегоАгента85();
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСостояние(Команда)
    ПроверитьСвойНаблюдательАгента85();
    ПоказатьСнимокСвоегоАгента85();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьСвойАгент(Команда)
    ПроверитьСвойНаблюдательАгента85();
    Если УстановкаНачата85 = Истина Или ФазаАгента85 <> "Наблюдение" Тогда
        ВызватьИсключение "Установка не повторяется/не запускается одновременно с подключением";
    КонецЕсли;
    Если ПодтверждениеУстановки <> "УСТАНОВКА ТОЛЬКО В МОЕЙ VM85" Тогда
        ВызватьИсключение "Native установка не начата: требуется осознанная отдельная фраза";
    КонецЕсли;
    Состояние = АгентКлиентскогоПриложения.ПолучитьТекущееСостояние();
    Версия = АгентКлиентскогоПриложения.ВерсияАктуальна();
    Если Состояние = СостояниеАгентаКлиентскогоПриложения.Подключен
        Или (Состояние <> СостояниеАгентаКлиентскогоПриложения.НеЗапущен И Версия <> Ложь) Тогда
        ВызватьИсключение "Native установка нужна только неподключенному not-started/неактуальному своему агенту";
    КонецЕсли;
    УстановкаНачата85 = Истина;
    ФазаАгента85 = "Установка";
    АгентКлиентскогоПриложения.НачатьУстановку();
    Сообщить("Native установка только начата. Нет синхронного success/адреса загрузки/выдуманного completion callback; проверяйте реальные prompts/состояние в своей VM");
КонецПроцедуры

&НаКлиенте
Процедура ПодтвердитьЗавершениеУстановки(Команда)
    ПроверитьСвойНаблюдательАгента85();
    Если ФазаАгента85 <> "Установка" Или ПодтверждениеЗавершенияУстановки <> "МОЙ INSTALLER ЗАВЕРШЕН85" Тогда
        ВызватьИсключение "Не подтверждены собственная фаза и ручное завершение installer. Следующее native действие не запускается";
    КонецЕсли;
    Состояние = АгентКлиентскогоПриложения.ПолучитьТекущееСостояние();
    Если Состояние <> СостояниеАгентаКлиентскогоПриложения.Отключен Или АгентКлиентскогоПриложения.ВерсияАктуальна() <> Истина Тогда
        ВызватьИсключение "Нужен актуальный запущенный неподключенный свой агент; недоказанную установку не называем successful";
    КонецЕсли;
    ФазаАгента85 = "Наблюдение";
    Сообщить("Отдельно проверен native disconnected/current-version snapshot после вручную завершенного installer; статус ОС-задания автоматически не измеряется");
КонецПроцедуры

&НаКлиенте
Процедура ПодключитьСвойАгент(Команда)
    ПроверитьСвойНаблюдательАгента85();
    Если ПодключениеНачато85 = Истина Или ФазаАгента85 <> "Наблюдение"
        Или ПодтверждениеПодключения <> "ОДНО МОЕ ПОДКЛЮЧЕНИЕ85" Тогда
        ВызватьИсключение "Не подтверждено отдельное одноразовое подключение";
    КонецЕсли;
    Если АгентКлиентскогоПриложения.ПолучитьТекущееСостояние() <> СостояниеАгентаКлиентскогоПриложения.Отключен
        Или АгентКлиентскогоПриложения.ВерсияАктуальна() <> Истина Тогда
        ВызватьИсключение "Для этого опыта нужен актуальный действительно запущенный неподключенный свой агент";
    КонецЕсли;
    ПодключениеНачато85 = Истина;
    ФазаАгента85 = "Подключение";
    АгентКлиентскогоПриложения.НачатьПодключение();
    Сообщить("Native BeginConnect только начат; ожидайте настоящий StateChangeHandler и текущий Connected. Автоповтор отсутствует");
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииСвоегоАгента85(Состояние, Дополнительно) Экспорт
    Если ОбработчикПодключен85 <> Истина Или СвойКонтекстАгента85 = Неопределено
        Или ТипЗнч(Дополнительно) <> Тип("Структура") Тогда
        Возврат;
    КонецЕсли;
    Если Дополнительно.Ключ <> СвойКонтекстАгента85.Ключ Тогда
        Возврат;
    КонецЕсли;
    ПроверитьТонкийКлиентАгента85();
    ПроверитьСтендНаСервере85();
    Если ТипЗнч(Состояние) <> Тип("СостояниеАгентаКлиентскогоПриложения") Тогда
        ВызватьИсключение "Native handler должен получить state enum и собственные extra параметры";
    КонецЕсли;
    Текущее = АгентКлиентскогоПриложения.ПолучитьТекущееСостояние();
    Если ФазаАгента85 = "Подключение" И Состояние = СостояниеАгентаКлиентскогоПриложения.Подключен
        И Текущее = СостояниеАгентаКлиентскогоПриложения.Подключен Тогда
        ФазаАгента85 = "Подключено";
    ИначеЕсли ФазаАгента85 = "Отключение" И Состояние = СостояниеАгентаКлиентскогоПриложения.Отключен
        И Текущее = СостояниеАгентаКлиентскогоПриложения.Отключен Тогда
        ФазаАгента85 = "Отключено";
    КонецЕсли;
    Сообщить("Настоящее native событие: " + Строка(Состояние) + "; свежий current-state: " + Строка(Текущее) + "; own phase: " + ФазаАгента85);
    Если Состояние <> Текущее Тогда
        Сообщить("Snapshot уже изменился после события; устаревшее событие не объявляется готовностью/отказом");
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НазватьСвоеПриложение(Команда)
    ПроверитьСвойНаблюдательАгента85();
    Если ФазаАгента85 <> "Подключено" Или СвоеИмяЗадано85 = Истина
        Или ПодтверждениеИмени <> "ИМЯ ТОЛЬКО МОЕГО ПРИЛОЖЕНИЯ85"
        Или АгентКлиентскогоПриложения.ПолучитьТекущееСостояние() <> СостояниеАгентаКлиентскогоПриложения.Подключен Тогда
        ВызватьИсключение "Сначала подтвердите actual own connected event; name изменение одноразовое";
    КонецЕсли;
    ИсходноеИмяАгента85 = АгентКлиентскогоПриложения.ПолучитьНаименованиеПриложения();
    Если ТипЗнч(ИсходноеИмяАгента85) <> Тип("Строка") Тогда
        ВызватьИсключение "Исходное реальное application description не получено. Undefined не превращается в пустую строку";
    КонецЕсли;
    СвоеИмяЗадано85 = Истина;
    НовоеИмя = "Уч85Агент | Книга3×250=750 | " + СвойКонтекстАгента85.Ключ;
    АгентКлиентскогоПриложения.УстановитьНаименованиеПриложения(НовоеИмя);
    Если АгентКлиентскогоПриложения.ПолучитьНаименованиеПриложения() <> НовоеИмя Тогда
        ВызватьИсключение "Own name мог измениться, но отдельно не подтвержден. Не повторяйте и не перезаписывайте чужое имя";
    КонецЕсли;
    Сообщить("Собственное agent application description750 с ownnonce отдельно прочитано. Это не заголовок окна ОС и не имяIB");
КонецПроцедуры

&НаКлиенте
Процедура ОтключитьСвоеПриложение(Команда)
    ПроверитьСвойНаблюдательАгента85();
    Если ОтключениеНачато85 = Истина Или ФазаАгента85 <> "Подключено"
        Или ПодтверждениеОтключения <> "ОДНО МОЕ ОТКЛЮЧЕНИЕ85"
        Или АгентКлиентскогоПриложения.ПолучитьТекущееСостояние() <> СостояниеАгентаКлиентскогоПриложения.Подключен Тогда
        ВызватьИсключение "Подтвердите только own current-connected одноразовое отключение";
    КонецЕсли;
    Если СвоеИмяЗадано85 <> Истина Или ТипЗнч(ИсходноеИмяАгента85) <> Тип("Строка") Тогда
        ВызватьИсключение "Сначала выполните own name опыт и сохраните реальное исходное описание";
    КонецЕсли;
    ОжидаемоеИмя = "Уч85Агент | Книга3×250=750 | " + СвойКонтекстАгента85.Ключ;
    Если АгентКлиентскогоПриложения.ПолучитьНаименованиеПриложения() <> ОжидаемоеИмя Тогда
        ВызватьИсключение "Description изменено другим действием: не восстанавливаем поверх него и не запускаем disconnect";
    КонецЕсли;
    ОтключениеНачато85 = Истина;
    АгентКлиентскогоПриложения.УстановитьНаименованиеПриложения(ИсходноеИмяАгента85);
    Если АгентКлиентскогоПриложения.ПолучитьНаименованиеПриложения() <> ИсходноеИмяАгента85 Тогда
        ВызватьИсключение "Возврат исходного own name не подтвержден; Disconnect не начат, автоматического повтора нет";
    КонецЕсли;
    ФазаАгента85 = "Отключение";
    АгентКлиентскогоПриложения.НачатьОтключение();
    Сообщить("Own description отдельно возвращено до BeginDisconnect. Ожидайте actual disconnected event; агентский процесс/installer не завершается этой командой");
КонецПроцедуры

&НаКлиенте
Процедура СнятьСвойНаблюдатель(Команда)
    ПроверитьСвойНаблюдательАгента85();
    Если ФазаАгента85 <> "Отключено" Или АгентКлиентскогоПриложения.ПолучитьТекущееСостояние() <> СостояниеАгентаКлиентскогоПриложения.Отключен Тогда
        ВызватьИсключение "Нужно actual native отключение, а не возврат BeginDisconnect";
    КонецЕсли;
    АгентКлиентскогоПриложения.ОтключитьОбработчикИзмененияСостояния(СвойОбработчикАгента85);
    ОбработчикПодключен85 = Ложь;
    ФазаАгента85 = "Завершено";
    Сообщить("Снят только свой точный handler данного экземпляра формы. Другие обработчики не трогаются; это не остановка/удаление агента ОС");
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьСнимокСвоегоАгента85()
    Состояние = АгентКлиентскогоПриложения.ПолучитьТекущееСостояние();
    Версия = АгентКлиентскогоПриложения.ВерсияАктуальна();
    Имя = АгентКлиентскогоПриложения.ПолучитьНаименованиеПриложения();
    Сообщить("Own native state: " + Строка(Состояние) + "; phase: " + ФазаАгента85);
    Если Версия = Неопределено Тогда
        Сообщить("VersionActual=Undefined: агент не запущен, это не доказательство отсутствия установленного агента");
    Иначе
        Сообщить("VersionActual: " + Строка(Версия));
    КонецЕсли;
    Если Имя = Неопределено Тогда
        Сообщить("Application description=Undefined: агент не запущен; сохранение исходного имени сейчас невозможно");
    Иначе
        Сообщить("Application description получено как строка; чужое/исходное имя не выводим");
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвойНаблюдательАгента85()
    ПроверитьТонкийКлиентАгента85();
    ПроверитьСтендНаСервере85();
    Если СвойКонтекстАгента85 = Неопределено Или СвойОбработчикАгента85 = Неопределено Или ОбработчикПодключен85 <> Истина Тогда
        ВызватьИсключение "Подготовьте собственный nonce и native observer в этом экземпляре формы";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьТонкийКлиентАгента85()
#Если ТонкийКлиент Тогда
    Возврат;
#Иначе
    ВызватьИсключение "Этот ownfixture разрешен только в тонком клиенте; native агент API доступен также web/thick, но они требуют отдельной подготовки";
#КонецЕсли
КонецПроцедуры

&НаСервере
Процедура ПроверитьСтендНаСервере85()
    УчебныйАгент85.ПроверитьСвойСтендАгента85(МеткаСвоейБазы);
КонецПроцедуры
Полный read-only guard собственного FileIB/actualuser/metadata стенда

Конфигуратор → Общие → Общие модули → УчебныйАгент85 → Модуль.

Только серверный server-call общий модуль: metadata/version/exactFile/current realIBUser, никаких agent/client API.

Процедура ПроверитьСвойСтендАгента85(МеткаСвоейБазы) Экспорт
    ПроверитьСвойПустойСтенд();
    UUIDМетки = Новый УникальныйИдентификатор(МеткаСвоейБазы);
    Если МеткаСвоейБазы <> Строка(UUIDМетки) Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        ВызватьИсключение "Нужен собственный canonical nonzero marker, не выдуманный realIBUUID";
    КонецЕсли;
    Соединение = "File=""C:\1c-labs\Уч85Агент_" + МеткаСвоейБазы + "\"";";
    Если СтрокаСоединенияИнформационнойБазы() <> Соединение Тогда
        ВызватьИсключение "Нужна только точная своя новая FileIB/тонкий клиент; соединение не выводится";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если ПривилегированныйРежим() Или Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
        ВызватьИсключение "Нужен свой непривилегированный единственный actual IBUser";
    КонецЕсли;
    Если Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор
        Или Текущий.Имя <> "Уч85Агент_" + МеткаСвоейБазы Или Метаданные.Боты.Количество() <> 0
        Или Метаданные.Константы.Количество() <> 0 Тогда
        ВызватьИсключение "Паспорт своего пустого стенда/реального пользователя не совпал";
    КонецЕсли;
КонецПроцедуры

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

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

  1. Серверный guard проверяет свою metadata, путь, версию и реального пользователя перед наблюдением и каждым действием. Текст подтверждения VM не считается доказательством владения агентским процессом.

  2. Readonly глобальное свойство дает настоящий менеджер. Его не создают конструктором, не присваивают глобальному свойству и не используют с сервера.

  3. Attach получает одно ОписаниеОповещения; настоящий handler получает два параметра: состояние и сохраненный extra. ЭтотОбъект — реальная форма. Чужой/старый nonce или уже снятый handler игнорируются.

  4. Три native состояния и Неопределено у версии/описания имеют разные значения. Нет выдуманного объекта ошибки или результата ОС-установщика. Порядок нескольких обработчиков не задан.

  5. Однократная необязательная установка и ее ручное завершение отделены от проверки Отключен/актуальной версии. Незавершенный установщик не разрешает параллельное подключение.

  6. Подключение запускается один раз; готовность подтверждается native событием и свежим состоянием. Устаревшее событие не считается готовностью либо ошибкой.

  7. После подключения исходное описание сохраняется как строка. Свое значение с nonce задается и читается; только оно разрешает вернуть исходную строку перед отключением.

  8. После отдельного подтверждения отключения снимается только свой сохраненный callback. Отключение приложения не завершает процесс агента и не удаляет ПО.

  9. Установка, описание и подключение не являются общей транзакцией. Частичная ошибка не запускает повтор или принудительную очистку. Закрытие формы в промежуточной фазе не является завершением цикла.

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

  1. На подготовленном своем стенде реальный обработчик вызывается платформой с двумя параметрами; возврат Begin не считается синхронным успехом.

  2. Исходное описание получено, новое прочитано, исходное отдельно возвращено при действующем своем подключении до BeginDisconnect. Чужое описание не перезаписывается.

  3. После установки подключение не разрешается без ее ручного завершения и свежих Отключен/актуальной версии.

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

  5. После настоящего отключения снят именно свой handler; поздний callback игнорируется. Прямого fake вызова события нет.

  6. Реальные ОС, сервис, файлы, сеть и БД при авторстве не проверялись. Статическая/native проверка отдельно от доступности и разрешений вашей среды.

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

При успешном ручном запуске своего подготовленного thin/VM стенда реальный callback фиксирует подключение/отключение, описание750 прочитано и возвращено, точный свой observer снят. Необязательная установка отдельно подтверждается владельцем. Здесь статическая проверка/runtime0, не свидетельство живой установки или работы вашего агента.

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

  1. У менеджера нет native конструктора; глобальная factory readonly. Доступность thin/web/thick не означает серверную доступность или готовность браузерных разрешений.

  2. File guard защищает свою IB, но ОС-процесс имеет отдельный scope. Собственная VM/OS-account без чужих приложений обязательна; native API не перечисляет доказательства их владения.

  3. НачатьУстановку может реально менять локальное ПО без немедленного Ready. Урок не скачивает установщик скрыто и не выдумывает адрес доставки.

  4. Три native состояния не содержат Installing/Connecting/Error. Строка ФазаАгента85 — местный учебный progress, не native enum и не доказанный статус ОС-задания.

  5. ВерсияАктуальна=Неопределено означает не запущен, не обязательно устарел/не установлен. Неопределенное описание нельзя заменять пустой строкой для восстановления.

  6. Несколько handlers допустимы, порядок не определен. Повтор равного заменяет его. Native равенство использует имена процедур, error procedures и модули, не extra nonce; сохраняем точный descriptor этого экземпляра формы.

  7. State callback имеет два параметра, три Begin-метода — ноль. Не передавайте callback в Begin и не вызывайте событие напрямую.

  8. Позднее событие и свежий снимок могут отличаться. Это не автоматическая native ошибка; при неподтвержденной готовности сценарий не продолжается.

  9. Описание приложения в агенте не является заголовком ОС, именем конфигурации или пользователя. Меняется только current application description своего стенда.

  10. Возврат описания не откатывает ОС-установку. Если текущая строка уже другая, отказываем в восстановлении; частичный результат не скрывается повтором.

  11. Detach своего description не отключает соединение и не останавливает процесс. Disconnect не удаляет ПО, ОС-сервис либо чужие приложения.

  12. Ошибки и промежуточные фазы не порождают retry, forcekill или all-handlers detach. Завершите полный ручной цикл до закрытия формы. Реальные runtime/UI/network/files0.

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

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

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

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

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