Асинхронная функция. Выполняет регистрацию информационной базы в системе взаимодействия. Требуется наличие у текущего пользователя права "РегистрацияИнформационнойБазыСистемыВзаимодействия".
Синтаксис
ВыполнитьРегистрациюИнформационнойБазыАсинх(<ПараметрыРегистрации>)Полное описание, параметры и ограничения
МенеджерСистемыВзаимодействия.ВыполнитьРегистрациюИнформационнойБазыАсинх (CollaborationSystemManager.RegisterInfoBaseAsync)
МенеджерСистемыВзаимодействия (CollaborationSystemManager)
ВыполнитьРегистрациюИнформационнойБазыАсинх (RegisterInfoBaseAsync)
Доступен, начиная с версии 8.3.18.
Синтаксис:
ВыполнитьРегистрациюИнформационнойБазыАсинх(<ПараметрыРегистрации>)
Параметры:
<ПараметрыРегистрации> (обязательный)
Тип: ПараметрыРегистрацииИнформационнойБазыСистемыВзаимодействия.
Параметры регистрации базы в системе взаимодействия.
Параметры АдресСервера и АдресЭлектроннойПочты являются обязательными.
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - РезультатРегистрацииИнформационнойБазыСистемыВзаимодействия.
Описание:
Асинхронная функция. Выполняет регистрацию информационной базы в системе взаимодействия.
Требуется наличие у текущего пользователя права "РегистрацияИнформационнойБазыСистемыВзаимодействия".
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент.
Примечание:
Если в параметрах регистрации не указан АдресЭлектроннойПочты и в информационной базе нет объекта ДанныеРегистрацииИнформационнойБазыСистемыВзаимодействия, при вызове данного метода будет сгенерировано исключение.
См. также:
МенеджерСистемыВзаимодействия, метод ВыполнитьРегистрациюИнформационнойБазы
МенеджерСистемыВзаимодействия, метод НачатьРегистрациюИнформационнойБазы
Использование в версии:
Доступен, начиная с версии 8.3.18.
Описание изменено в версии 8.3.20.
Методическая информация
Практические примеры
Зарегистрировать только свою новую локальную базу тремя способами и проверить отмену
Полный пульт сравнивает синхронный серверный вызов, клиентское Ждать и настоящее оповещение. Проверяет объект результата и свое приложение, отдельно учит отмене и возврату только своих непрозрачных ключей в одной серверной операции.
Где и как запускать
Полный модуль управляемой формы своей внешней обработки в новой пустой УчебнаяРегистрацияСВ85. Серверные синхронные ветви, клиентские Ждать/ОписаниеОповещения и полный собственный guard включены.
Подготовка
Только новая собственная VM и новый отдельный локальный сервер взаимодействия http://localhost:9094, не сервис1С:Диалог, не рабочий абонент и не рабочий сервер. SMTP/внешние интеграции/общие приложения не подключайте. Этот файл ничего не устанавливает и не запускался. Локальный сервер должен поддерживать регистрацию учебного абонента без доставки реальной почты; если ваша версия требует подтверждение, выясните ее штатный локальный порядок у администратора своего стенда, не угадывайте код.
Создайте новую пустую базу8.5.1.1343, имя конфигурации УчебнаяРегистрацияСВ85, русский язык, совместимость Не использовать, управляемый интерфейс. Предметные объекты, разделители, задания, подписки и расширения не нужны. База еще никогда не регистрировалась: при создании формы и зарегистрированное состояние, и непрозрачные данные регистрации должны отсутствовать.
Вручную создайте единственного пользователя Уч85Рег_ с добавленным вашим новым ненулевым UUID в каноническом формате. Назначьте в этой новой базе права РегистрацияИнформационнойБазыСистемыВзаимодействия и АдминистрированиеДанных, необходимые для чтения пользователей/регистрации. Код не создает пользователей/абонента вне данного явного опыта, не меняет роли и не включает привилегированный режим.
Создайте внешнюю обработку УчебнаяРегистрация85 с одной управляемой формой. Строковые реквизиты: Метка85 длиной36, Режим85 длиной20, Фаза85 длиной30, ИмяПриложения85 длиной100, СвояПочта85 длиной100, КодАктивации85 длиной100, Подтверждение85 длиной100, Статус85 длиной0. Булево НеизвестныйИсход85. Фаза, метка, имя приложения, почта, статус и флаг только для просмотра/скрыты. Для поля кода включите защищенное отображение, не журналируйте его.
Создайте три команды Зарегистрировать85, Отменить85, ПроверитьСвойСброс85 с действием ВыполнитьОперацию85; добавьте кнопки. Назначьте ПриСозданииНаСервере и вставьте весь модуль формы. Оповещения экспортны и находятся в том же объекте формы, никаких неизвестных общих модулей нет. Положительный учебный путь — thin/thick управляемый клиент своей VM; веб/mobile этим опытом не проверены.
Режим выбирайте один на весь опыт: Сервер, Ждать или Оповещение. Для каждого следующего режима нужна другая новая пустая база/отдельный свежий сервер со своим UUID-пользователем. Имя приложения и формальный абонентский адрес lab-<реальныйUUIDпользователяБазы>@example.invalid строятся кодом, а не вводятся произвольно. Это идентификатор только собственного локального абонента; домен.invalid не является действительным адресом доставки, на1С:Диалог такой опыт недопустим.
Сначала оставьте Подтверждение85 пустым: изменений быть не должно. После собственной проверки VM введите СВОЯ VM И НОВЫЙ ЛОКАЛЬНЫЙ АБОНЕНТ. Зарегистрировать85 выполняет только один запрос. Если результат не завершил регистрацию, это может быть ошибка или реальное требование кода — не автоматический успех. Изучите причину только локально. Если свой сервер действительно выдал собственный код через штатный локальный интерфейс, введите только его и явно повторите подтверждающий этап.
После подтвержденной регистрации сначала по желанию нажмите ПроверитьСвойСброс85: в одном серверном вызове получаются только свои ключи, настройки сбрасываются и возвращаются из того же собственного объекта в памяти. Никакого сохранения ключей в HTML/файл/клиент/лог нет. Это риск потери собственной регистрации при сбое, не резервная копия; не используйте реальную базу. Затем отдельно нажмите Отменить85 для сознательной отмены своего опыта.
Если ответ потерялся/исключение возникло после начала, НеизвестныйИсход85 сохраняется и пульт блокирует дальнейшие записи. При аварийном закрытии он может исчезнуть, поэтому закрытие не является разрешением повторить регистрацию/отмену. Проверяйте только свою VM вручную. Никаких автоматических откатов, повтора, экспорта ключей, резервных копий и удаления серверной истории нет.
&НаКлиенте
Перем ОжидаемаяОперация85;
&НаКлиенте
Перем МеткаОперации85;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Паспорт = ПроверитьСвойЛокальныйСтенд85();
Если СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована()
Или СистемаВзаимодействия.ПолучитьДанныеРегистрацииИнформационнойБазы() <> Неопределено Тогда
ВызватьИсключение "Нужна свежая собственная база без регистрационных данных";
КонецЕсли;
Метка85 = Строка(Новый УникальныйИдентификатор);
Режим85 = "Сервер";
Фаза85 = "Новая";
ИмяПриложения85 = Паспорт.ИмяПриложения;
СвояПочта85 = Паспорт.Почта;
КодАктивации85 = "";
Подтверждение85 = "";
НеизвестныйИсход85 = Ложь;
Статус85 = "Свой сервер localhost:9094 должен быть отдельным и не отправлять почту";
КонецПроцедуры
&НаКлиенте
Асинх Процедура ВыполнитьОперацию85(Команда)
Если ОжидаемаяОперация85 <> Неопределено Или НеизвестныйИсход85 Тогда
ВызватьИсключение "Ранее начатая операция не подтверждена. Автоматический повтор запрещен";
КонецЕсли;
Если Фаза85 = "Завершено" Тогда
ВызватьИсключение "Свой опыт завершен. Откройте новую собственную пустую базу для другого режима";
КонецЕсли;
Если Режим85 <> "Сервер" И Режим85 <> "Ждать" И Режим85 <> "Оповещение" Тогда
ВызватьИсключение "Выберите Сервер, Ждать или Оповещение";
КонецЕсли;
Если Подтверждение85 <> "СВОЯ VM И НОВЫЙ ЛОКАЛЬНЫЙ АБОНЕНТ" Тогда
ВызватьИсключение "Подтвердите только свой отдельный стенд";
КонецЕсли;
Операция = Команда.Имя;
Если Операция <> "Зарегистрировать85" И Операция <> "Отменить85" И Операция <> "ПроверитьСвойСброс85" Тогда
ВызватьИсключение "Неизвестная команда регистрации";
КонецЕсли;
ПроверитьПередОперациейНаСервере85(Операция);
Если Операция = "Зарегистрировать85" И Фаза85 <> "Новая" И Фаза85 <> "ОжидаетсяКод" Тогда
ВызватьИсключение "Регистрация не допускается в текущей фазе";
КонецЕсли;
Если Операция <> "Зарегистрировать85" И Фаза85 <> "Зарегистрирована" Тогда
ВызватьИсключение "Отмена/сброс допускаются только для подтвержденной своей регистрации";
КонецЕсли;
Если Фаза85 = "ОжидаетсяКод" И Не ЗначениеЗаполнено(КодАктивации85) Тогда
ВызватьИсключение "Код нужен только если его действительно требует ваш отдельный сервер. Не угадывайте код";
КонецЕсли;
ОжидаемаяОперация85 = Операция;
МеткаОперации85 = Строка(Новый УникальныйИдентификатор);
НеизвестныйИсход85 = Истина;
Статус85 = "Операция начата, результат еще не подтвержден: " + Операция;
Попытка
Если Операция = "Зарегистрировать85" Тогда
Параметры = СобратьСвоиПараметры85();
Если Режим85 = "Сервер" Тогда
Результат = ВыполнитьСинхроннуюРегистрацию85(КодАктивации85);
ПринятьСвойРезультатРегистрации85(Результат);
ИначеЕсли Режим85 = "Ждать" Тогда
Результат = Ждать СистемаВзаимодействия.ВыполнитьРегистрациюИнформационнойБазыАсинх(Параметры);
ПринятьСвойРезультатРегистрации85(Результат);
Иначе
ДанныеОповещения = Новый Структура("Операция,Метка,МеткаОперации", Операция, Метка85, МеткаОперации85);
Оповещение = Новый ОписаниеОповещения("РегистрацияЗавершена85", ЭтотОбъект, ДанныеОповещения);
СистемаВзаимодействия.НачатьРегистрациюИнформационнойБазы(Оповещение, Параметры);
КонецЕсли;
ИначеЕсли Операция = "Отменить85" Тогда
Если Режим85 = "Сервер" Тогда
ВыполнитьСинхроннуюОтмену85();
ПринятьСвоюОтмену85();
ИначеЕсли Режим85 = "Ждать" Тогда
РезультатОтмены = Ждать СистемаВзаимодействия.ОтменитьРегистрациюИнформационнойБазыАсинх();
Если РезультатОтмены <> Неопределено Тогда
ВызватьИсключение "У обещания отмены native-результат должен быть Неопределено";
КонецЕсли;
ПринятьСвоюОтмену85();
Иначе
ДанныеОповещения = Новый Структура("Операция,Метка,МеткаОперации", Операция, Метка85, МеткаОперации85);
Оповещение = Новый ОписаниеОповещения("ОтменаЗавершена85", ЭтотОбъект, ДанныеОповещения);
СистемаВзаимодействия.НачатьОтменуРегистрацииИнформационнойБазы(Оповещение);
КонецЕсли;
Иначе
ПроверитьСбросИВозвратСвоихДанных85();
НеизвестныйИсход85 = Ложь;
ОжидаемаяОперация85 = Неопределено;
МеткаОперации85 = Неопределено;
Статус85 = "Свои регистрационные данные сброшены и возвращены только из собственного объекта в памяти";
КонецЕсли;
Исключение
КодАктивации85 = "";
Статус85 = "Исход не подтвержден. Не повторяйте запись и проверьте только свою VM вручную";
ВызватьИсключение "Операция прервана; ключи, код и полный ответ сервера в журнал не выводятся";
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция СобратьСвоиПараметры85()
Паспорт = ПолучитьСвоиПараметрыНаСервере85();
Если СвояПочта85 <> Паспорт.Почта Или ИмяПриложения85 <> Паспорт.ИмяПриложения Тогда
ВызватьИсключение "Показанные параметры собственной базы изменены";
КонецЕсли;
Параметры = Новый ПараметрыРегистрацииИнформационнойБазыСистемыВзаимодействия;
Параметры.АдресСервера = "http://localhost:9094";
Параметры.АдресЭлектроннойПочты = Паспорт.Почта;
Параметры.ИмяИнформационнойБазы = Паспорт.ИмяПриложения;
Параметры.КодАктивации = КодАктивации85;
Возврат Параметры;
КонецФункции
&НаКлиенте
Процедура РегистрацияЗавершена85(РезультатРегистрации, ДополнительныеПараметры) Экспорт
ПроверитьСвоеОповещение85(ДополнительныеПараметры, "Зарегистрировать85");
Попытка
ПринятьСвойРезультатРегистрации85(РезультатРегистрации);
Исключение
КодАктивации85 = "";
Статус85 = "Оповещение регистрации не подтвердило результат. Автоматического повтора нет";
ВызватьИсключение "Результат своей регистрации не подтвержден";
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОтменаЗавершена85(ДополнительныеПараметры) Экспорт
ПроверитьСвоеОповещение85(ДополнительныеПараметры, "Отменить85");
Попытка
ПринятьСвоюОтмену85();
Исключение
Статус85 = "Оповещение отмены не подтвердило состояние собственной базы";
ВызватьИсключение "Отмена своей регистрации не подтверждена";
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвоеОповещение85(Данные, Операция)
Если ТипЗнч(Данные) <> Тип("Структура") Или Не Данные.Свойство("Операция", ПереданнаяОперация)
Или Не Данные.Свойство("Метка", ПереданнаяМетка)
Или Не Данные.Свойство("МеткаОперации", ПереданнаяМеткаОперации) Тогда
ВызватьИсключение "Нет собственных параметров оповещения";
КонецЕсли;
Если ПереданнаяОперация <> Операция Или ПереданнаяМетка <> Метка85
Или ПереданнаяМеткаОперации <> МеткаОперации85 Или МеткаОперации85 = Неопределено
Или ОжидаемаяОперация85 <> Операция Или Не НеизвестныйИсход85 Тогда
ВызватьИсключение "Просроченное, повторное или чужое оповещение не принимается";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПринятьСвойРезультатРегистрации85(Результат)
КодАктивации85 = "";
Если ТипЗнч(Результат) <> Тип("РезультатРегистрацииИнформационнойБазыСистемыВзаимодействия") Тогда
ВызватьИсключение "Нужен native-объект результата, не Обещание и не Булево";
КонецЕсли;
Если ТипЗнч(Результат.ТекстСообщения) <> Тип("Строка") Тогда
ВызватьИсключение "Текст результата должен иметь тип Строка";
КонецЕсли;
Если Результат.РегистрацияВыполнена Тогда
ПроверитьСвоюГотовуюРегистрацию85();
Фаза85 = "Зарегистрирована";
Статус85 = "Собственная регистрация подтверждена объектом результата и свежим серверным паспортом";
Иначе
Если ПроверитьСостояниеНаСервере85() Тогда
ВызватьИсключение "Результат false не согласован с зарегистрированным состоянием";
КонецЕсли;
Фаза85 = "ОжидаетсяКод";
Статус85 = "Регистрация не выполнена. ТекстСообщения содержит " + Строка(СтрДлина(Результат.ТекстСообщения))
+ " символов; ошибка и требование кода проверяются вручную только в собственном сервере";
КонецЕсли;
НеизвестныйИсход85 = Ложь;
ОжидаемаяОперация85 = Неопределено;
МеткаОперации85 = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура ПринятьСвоюОтмену85()
Если ПроверитьСостояниеНаСервере85() Тогда
ВызватьИсключение "Своя база все еще зарегистрирована";
КонецЕсли;
Фаза85 = "Завершено";
НеизвестныйИсход85 = Ложь;
ОжидаемаяОперация85 = Неопределено;
МеткаОперации85 = Неопределено;
Статус85 = "Отмена подтверждена. Это не удаление истории сервера или идентификатора базы";
КонецПроцедуры
&НаСервере
Функция ВыполнитьСинхроннуюРегистрацию85(Код)
ПроверитьПередОперациейНаСервере85("Зарегистрировать85");
Паспорт = ПроверитьСвойЛокальныйСтенд85();
Параметры = Новый ПараметрыРегистрацииИнформационнойБазыСистемыВзаимодействия;
Параметры.АдресСервера = "http://localhost:9094";
Параметры.АдресЭлектроннойПочты = Паспорт.Почта;
Параметры.ИмяИнформационнойБазы = Паспорт.ИмяПриложения;
Параметры.КодАктивации = Код;
Возврат СистемаВзаимодействия.ВыполнитьРегистрациюИнформационнойБазы(Параметры);
КонецФункции
&НаСервере
Процедура ВыполнитьСинхроннуюОтмену85()
ПроверитьСвоюГотовуюРегистрацию85();
СистемаВзаимодействия.ОтменитьРегистрациюИнформационнойБазы();
КонецПроцедуры
&НаСервере
Функция ПолучитьСвоиПараметрыНаСервере85()
Возврат ПроверитьСвойЛокальныйСтенд85();
КонецФункции
&НаСервере
Функция ПроверитьСостояниеНаСервере85()
ПроверитьСвойЛокальныйСтенд85();
Возврат СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована();
КонецФункции
&НаСервере
Процедура ПроверитьПередОперациейНаСервере85(Операция)
ПроверитьСвойЛокальныйСтенд85();
Если Операция = "Зарегистрировать85" Тогда
Если СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована() Тогда
ВызватьИсключение "Повторная регистрация уже зарегистрированной базы запрещена";
КонецЕсли;
Адрес = СистемаВзаимодействия.АдресСервера();
Если Адрес <> "" И Адрес <> "http://localhost:9094" Тогда
ВызватьИсключение "Следы чужого адреса запрещены";
КонецЕсли;
Иначе
ПроверитьСвоюГотовуюРегистрацию85();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПроверитьСвоюГотовуюРегистрацию85()
Паспорт = ПроверитьСвойЛокальныйСтенд85();
Если Не СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована()
Или СистемаВзаимодействия.АдресСервера() <> "http://localhost:9094" Тогда
ВызватьИсключение "Своя локальная регистрация не подтверждена";
КонецЕсли;
Приложение = СистемаВзаимодействия.ПолучитьПриложение(СистемаВзаимодействия.ИдентификаторТекущегоПриложения());
Если Приложение.Наименование <> Паспорт.ИмяПриложения Тогда
ВызватьИсключение "На своем сервере найдено не собственное UUID-приложение";
КонецЕсли;
Данные = СистемаВзаимодействия.ПолучитьДанныеРегистрацииИнформационнойБазы();
Если ТипЗнч(Данные) <> Тип("ДанныеРегистрацииИнформационнойБазыСистемыВзаимодействия") Тогда
ВызватьИсключение "Не получен собственный непрозрачный регистрационный объект";
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПроверитьСбросИВозвратСвоихДанных85()
ПроверитьСвоюГотовуюРегистрацию85();
Если Фаза85 <> "Зарегистрирована" Или Не НеизвестныйИсход85
Или Подтверждение85 <> "СВОЯ VM И НОВЫЙ ЛОКАЛЬНЫЙ АБОНЕНТ" Тогда
ВызватьИсключение "Нет явного собственного состояния эксперимента";
КонецЕсли;
СобственныеДанные = СистемаВзаимодействия.ПолучитьДанныеРегистрацииИнформационнойБазы();
Если ТипЗнч(СобственныеДанные) <> Тип("ДанныеРегистрацииИнформационнойБазыСистемыВзаимодействия") Тогда
ВызватьИсключение "Нет собственного объекта с ключами в памяти";
КонецЕсли;
ИДСвоегоПриложения = СистемаВзаимодействия.ИдентификаторТекущегоПриложения();
СистемаВзаимодействия.УстановитьДанныеРегистрацииИнформационнойБазы(Неопределено);
Если СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована()
Или СистемаВзаимодействия.ПолучитьДанныеРегистрацииИнформационнойБазы() <> Неопределено Тогда
ВызватьИсключение "Сброс своего состояния не подтвержден. Автоматического возврата ключей нет";
КонецЕсли;
СистемаВзаимодействия.УстановитьДанныеРегистрацииИнформационнойБазы(СобственныеДанные);
ПроверитьСвоюГотовуюРегистрацию85();
Если СистемаВзаимодействия.ИдентификаторТекущегоПриложения() <> ИДСвоегоПриложения Тогда
ВызватьИсключение "Вернувшиеся ключи не подтвердили собственное приложение";
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПроверитьСвойЛокальныйСтенд85()
ПроверитьСвойПустойСтенд();
Если ПривилегированныйРежим() Тогда
ВызватьИсключение "Входные повышенные привилегии не допускаются";
КонецЕсли;
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Пользователи.Количество() <> 1 Или Текущий = Неопределено
Или Текущий.УникальныйИдентификатор <> Пользователи[0].УникальныйИдентификатор
Или Лев(Текущий.Имя, СтрДлина("Уч85Рег_")) <> "Уч85Рег_" Тогда
ВызватьИсключение "Нужен единственный собственный UUID-пользователь регистрации";
КонецЕсли;
UUIDМетки = Новый УникальныйИдентификатор(Сред(Текущий.Имя, СтрДлина("Уч85Рег_") + 1));
Если Текущий.Имя <> "Уч85Рег_" + Строка(UUIDМетки)
Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
ВызватьИсключение "Учебное UUID-имя не подтверждено";
КонецЕсли;
Возврат Новый Структура("ИмяПриложения,Почта",
"УчебнаяРегистрацияСВ85_" + Строка(Текущий.УникальныйИдентификатор),
"lab-" + Строка(Текущий.УникальныйИдентификатор) + "@example.invalid");
КонецФункции
&НаСервере
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
ПриСозданииНаСервере проверяет пустоту/отсутствие расширений, единственного UUID-пользователя и отсутствие прежних регистрационных данных. Параметры создаются конкретным конструктором, адрес всегда exact http://localhost:9094, почта/имя выводятся из реального UUID пользователя базы.
Перед командой проверяются фаза/подтверждение/режим, отсутствие предыдущего ожидания и собственный серверный guard. НеизвестныйИсход устанавливается до первого потенциального изменения. Это состояние неизвестного результата, а не таймер готовности или возможность безопасно повторить запрос.
В режиме Сервер процедура формы вызывает собственную серверную функцию. Она еще раз проверяет контекст, создает настоящий ПараметрыРегистрации и вызывает ВыполнитьРегистрациюИнформационнойБазы. Синхронный метод не запускается в thin-клиентском обработчике.
В режиме Ждать создаются такие же подтвержденные параметры на клиенте; Ждать ВыполнитьРегистрациюИнформационнойБазыАсинх получает именно РезультатРегистрации, не Обещание. Сервера ждут только отдельно через RPC-процедуры, promise-API не вызывается на сервере.
В режиме Оповещение ОписаниеОповещения содержит свою операцию, UUID-метку формы и отдельный новый UUID этого конкретного запроса. НачатьРегистрациюИнформационнойБазы возвращает управление до окончания; только экспортная РегистрацияЗавершена85(РезультатРегистрации,ДополнительныеПараметры) принимает итог. Чужая/повторная/поздняя метка или иной тип дополнительных данных отклоняются, включая поздний первый callback во время второго этапа регистрации.
ПринятьСвойРезультат проверяет настоящий тип результата и readonly ТекстСообщения. Полный ответ не логируется, только его длина для диагностики наличия текста. РегистрацияВыполнена=true требует свежего зарегистрированного состояния, точного локального адреса, собственного UUID-наименования приложения и существования непрозрачного объекта ключей.
РегистрацияВыполнена=false не означает исключительно неправильный код. Код признает отсутствие регистрации и ожидающий этап, но причину пользователь обязан выяснить в своем локальном сервере. Если сервер фактически зарегистрирован при false, состояние противоречиво и повтор запрещается. Полученный/введенный код очищается после результата или исключения.
ПроверитьСвойСброс85 не получает данные из чужого клиента или файла: СобственныеДанные получены в этой же своей серверной операции. Сохраняется только ID своего приложения. УстановитьДанные(Неопределено) должен убрать свою регистрацию, затем УстановитьДанные(СобственныеДанные) возвращает именно собственный opaque-объект. Fresh passport и тот же ID подтверждают результат; секретные внутренние поля не выдумываются.
Отменить85 требует готовую свою регистрацию. Сервер вызывает синхронную ОтменитьРегистрациюИнформационнойБазы; Ждать-вариант проверяет native-результат Неопределено. Это не Булево успеха. Обе ветви отдельно проверяют, что своя база больше не зарегистрирована.
Callback отмены — ОтменаЗавершена85(ДополнительныеПараметры), у нее нет параметра результата регистрации. Перед своим fresh read проверяются операция и UUID-метка. После подтвержденной отмены фаза Завершено запрещает продолжение опытов этой формы.
Отмена штатным методом удаляет ключи, но не идентификатор базы/историю сервиса; повторная регистрация с прежней почтой может восстановить данные. УстановитьДанные(Неопределено) — иной путь: при обычной новой регистрации восстановление прежних данных не обещается. Внутренний возврат уже полученного своего объекта не является новой регистрацией по почте.
Как проверить результат
Без явной фразы никакого регистрационного вызова/отмены/сброса нет. Уже зарегистрированная база или существующие opaque-данные должны быть отклонены при создании формы.
В каждом из трех отдельно подготовленных опытов успех требует правильного native результата и собственного свежего серверного паспорта, а не только возврата метода/Ждать/вызова callback.
При false пульт не показывает успех. Неверный тип, неожиданный callback, иной адрес/приложение или неизвестный исход блокируют продолжение. В коде нет1С:Диалог, действительных email, guessed activation codes и произвольного URL.
Для своего сброса оба set-вызова выполняются в одной собственной серверной операции; после возврата совпадает прежний реальный ID приложения. При сбое не утверждается восстановление ключей и нет автоматического повторения в catch.
После отмены ИнформационнаяБазаЗарегистрирована=false и Фаза85=Завершено. Серверная история/UUID приложения этим не считаются удаленными; их наличие проверьте вручную только в своем выделенном сервере.
Закройте только учебную форму во время ожидания как отрицательный ручной опыт: это не доказательство отсутствия регистрации. Потерянный callback/серверный ответ может оставить изменения; требуются собственная ручная сверка и новый отдельный стенд, а не повтор в рабочей базе.
Ожидаемый результат
Свой полный цикл регистрации/проверки/явной отмены показан в трех настоящих стилях. Непрозрачные регистрационные данные возвращаются только из собственного объекта в памяти; история сервера и неизвестные результаты не выданы за удаленные/успешные.
На что обратить внимание
Доступность методов разная: синхронные registration/unregister на сервере/thick/external, promise/callback client-only. Callback регистрации имеет два параметра, callback отмены — один. Оба результата readonly; ни РегистрацияВыполнена, ни ТекстСообщения не назначаются.
Свой локальный сервер,1С:Диалог и почтовый абонент — разные среды. На1С:Диалог первый этап посылает письмо с кодом; согласно native-справке на ином сервере письмо не отправляется. Урок только для своего отдельного сервера, но конкретная версия сервера может иметь собственные дополнительные условия. Их готовность не выдается за проверенную.
РегистрацияВыполнена=false может означать ошибку, не только запрос кода. Урок не парсит локализованный ТекстСообщения и не угадывает код. Успех первой стадии без второго вызова возможен только если так действительно ответил ваш сервер и его состояние отдельно совпало.
ДанныеРегистрации содержат криптографические ключи, но у opaque-типа нет открытых свойств. Не обращайтесь к выдуманным Ключи/Идентификатор/Адрес и не сериализуйте данные для пересылки. В образце объект остается локальной серверной переменной.
Сброс регистрационных настроек может лишить собственную базу возможности соединения. Между сбросом и возвращением нет транзакции внешнего сервера; при сбое объект в памяти потеряется. Это изолированная демонстрация возможного собственного ремонта, не универсальная стратегия восстановления и не безопасный production-инструмент.
Штатная ОтменитьРегистрацию и УстановитьДанные(Неопределено) имеют разные последствия повторной регистрации. Отмена не стирает все данные сервера. Код не соединяет эти два способа в обещание восстановления чужого/старого сервиса.
Проверки callback-метки защищают только от перепутанного опыта одной формы; закрытие формы/сбой сети/другой процесс не делает запись атомарной. Нет автоматических повторов, таймера или catch-cleanup. Возврат из native метода еще не доказательство завершенного состояния.
Статические проверки не являются реальной регистрацией. Сервер, абонент, почта, ключи и базы реально не менялись. Пример сверяется с установленной справкой8.5.1.1343; runtimeVerifiedScenarios=0.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.