Синтаксис и применение ПараметрыВнешнегоПодключенияРаботыСРечью.По умолчанию в платформе 1С:Предприятие. Описание и примеры кода.
Синтаксис
Новый ПараметрыВнешнегоПодключенияРаботыСРечью(<Токен>, <АдресСервера>)Полное описание, параметры и ограничения
ПараметрыВнешнегоПодключенияРаботыСРечью.По умолчанию
ПараметрыВнешнегоПодключенияРаботыСРечью (SpeechProcessingExternalConnectionParameters)
По токену и адресу
Доступен, начиная с версии 8.3.23.
Синтаксис:
Новый ПараметрыВнешнегоПодключенияРаботыСРечью(<Токен>, <АдресСервера>)
Параметры:
<Токен> (необязательный)
Тип: Строка.
Заполняется, если требуется настройка внешнего распознавания для информационной базы.
<АдресСервера> (необязательный)
Тип: Строка.
Адрес внешней модели распознавания.
Использование в версии:
Доступен, начиная с версии 8.3.23.
Методическая информация
Практические примеры
Создать собственную регистрацию базы, проверить типизированное восстановление и отменить опыт
В заведомо пустой собственной базе создаём регистрацию, читаем реальные параметры и полный непрозрачный объект регистрации. Проверяем отключение, восстановление собственной типизированной копии в памяти и окончательную отмену — без записи секретных данных в файл.
Где и как запускать
Полный модуль обычной формы собственной обработки УчебноеПодключениеРечи85.Пульт; толстый клиент, новая пустая база без разделителей, только свой учебный пользователь с Администрированием данных.
Подготовка
Для каждого урока создайте отдельную новую пустую файловую базу с именем конфигурации УчебноеПодключениеРечи85, платформа8.5.1.1343. Не переименовывайте рабочую УТ/КА/УНФ/БП и не переносите туда служебные данные старой регистрации, модели, грамматики, обмены или задания.
Используйте толстый клиент, Обычное приложение. В конфигураторе: Обработки → УчебноеПодключениеРечи85 → Формы → Пульт, тип Обычная. Основной код — полный модуль этой формы, не код управляемой формы и не серверной команды браузера.
Заранее подготовьте отдельный настоящий аккаунт сервиса речи, его пароль, подтверждённый HTTPS-адрес вашего региона, разрешение на регистрацию и сведения о тарифе. Код не задаёт домен, логин, токен или пароль по умолчанию и не отключает проверку сертификата.
Свой учебный пользователь1С должен иметь Администрирование данных: в обоих уроках чтение настроек базы нужно для проверки границы между базой и сеансом. Не включайте привилегированный режим и не используйте production-аккаунт администратора.
Добавьте реквизиты Согласие типа Булево, УчетнаяЗапись, ПарольСервиса, АдресСервиса и Итог типа Строка неограниченной длины. Выведите флажок согласия и поля строк; многострочный Итог сделайте только для просмотра.
Поле ввода реквизита ПарольСервиса назовите ПолеПароля. ПриОткрытии программно включает его РежимПароля: символы скрываются звёздочками. Это маскировка экрана, не шифрование памяти; не сохраняйте пароль в настройках, файлах, журнале, скриншотах или скопированном коде.
Вставьте полный код своего выбранного урока в пустой модуль формы. ПриОткрытии назначьте соответствующему событию без параметров; ПередЗакрытием — событию обычной формы с параметрами Отказ и СтандартнаяОбработка. Не объединяйте два модуля с одинаковыми обработчиками.
Добавьте перечисленные для урока обычные кнопки. Событию Нажатие каждой назначьте одноимённую процедуру без параметров. Нажмите F7, обновите только новую учебную базу; F7 не доказывает подключение к облаку.
Откройте свою обработку в отдельном новом сеансе. При открытии все поля очищаются и Согласие=Ложь. Введите настоящий аккаунт и адрес вручную, проверьте адрес по своим официальным настройкам и только затем установите согласие.
Исходная база и текущий сеанс должны быть без регистрации. Перед первой записью код проверяет оба набора параметров, непрозрачные данные базы и флаг внешнего расположения. Если что-то уже есть, он отказывается: чужие настройки ради прохождения опыта не очищайте.
Во время опыта не открывайте второе окно, не меняйте разделители или учётную запись и не запускайте другие действия с сервисом. Адреса, токены и непрозрачные данные берутся только из фактических ответов менеджера; сюда не вставляется неизвестный входной объект.
Здесь примеры не запускались в1С, сеть и регистрация не выполнялись: runtimeVerifiedScenarios=0. Реальный доступ, тариф и корректность сертификатов проверяются отдельно пользователем; новые файлы, резервные копии и архивы код урока не создаёт.
Создайте обычные кнопки ПроверитьРегистрациюБазы и ОчиститьСвоюРегистрацию. В этой новой базе не должно быть данных других уроков: восстановление и отмена охватывают полный объект регистрации текущей области.
Непрозрачные данные включают сведения о моделях, дополнительные грамматики и доступ к облаку. Не добавляйте параллельно модели или грамматики: весь объект этого опыта должен принадлежать только текущему открытому окну и отдельной пустой базе.
Перем СвояГотовность;
Перем СвойОпытНачат;
Процедура ПриОткрытии()
СвояГотовность = Ложь;
СвойОпытНачат = Ложь;
Согласие = Ложь;
УчетнаяЗапись = "";
ПарольСервиса = "";
АдресСервиса = "";
Итог = "Подготовьте отдельный настоящий аккаунт и подтверждённый адрес собственного сервиса";
ЭлементыФормы.ПолеПароля.РежимПароля = Истина;
ПроверитьСвойСтенд();
СвояГотовность = Истина;
КонецПроцедуры
Процедура ПроверитьСвойСтенд()
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Не регистрируйте сервис внутри транзакции";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоеСогласие()
ПроверитьСвойСтенд();
Если Не СвояГотовность Или Не Согласие Тогда
ВызватьИсключение "Нужны открытое собственное окно и явное согласие на регистрацию";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойВвод()
ПроверитьСвоеСогласие();
Если Не ЗначениеЗаполнено(УчетнаяЗапись) Или Не ЗначениеЗаполнено(ПарольСервиса)
Или Не ЗначениеЗаполнено(АдресСервиса) Тогда
ВызватьИсключение "Введите реальные логин, пароль и подтверждённый адрес собственного сервиса";
КонецЕсли;
Если НРег(Лев(АдресСервиса, 8)) <> "https://" Тогда
ВызватьИсключение "Этот учебный облачный стенд допускает только заранее подтверждённый HTTPS-адрес";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоеПустоеПодключение()
Если РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияСеанса() <> Неопределено Тогда
ВызватьИсключение "В этом сеансе уже есть подключение: начните отдельный новый учебный сеанс, не очищайте чужое";
КонецЕсли;
Если РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияИнформационнойБазы() <> Неопределено
Или РаботаСРечью.ПолучитьДанныеРаботыСРечьюИнформационнойБазы() <> Неопределено
Или РаботаСРечью.ПоддерживаетсяИспользованиеВнешнегоРасположения() Тогда
ВызватьИсключение "В новой учебной базе не должно быть регистрации, моделей или грамматик предыдущего опыта";
КонецЕсли;
КонецПроцедуры
Функция СделатьСвоюКопиюПодключения(Параметры)
Если ТипЗнч(Параметры) <> Тип("ПараметрыВнешнегоПодключенияРаботыСРечью") Тогда
ВызватьИсключение "Нужны настоящие параметры, полученные от менеджера после регистрации";
КонецЕсли;
Если Не ЗначениеЗаполнено(Параметры.АдресСервера) Тогда
ВызватьИсключение "Сервис не вернул адрес: не заменяйте его придуманным endpoint";
КонецЕсли;
Копия = Новый ПараметрыВнешнегоПодключенияРаботыСРечью;
Копия.АдресСервера = Параметры.АдресСервера;
Копия.Токен = Параметры.Токен;
Возврат Копия;
КонецФункции
Процедура ПроверитьСвоиПараметры(Фактические, Ожидаемые)
Если ТипЗнч(Фактические) <> Тип("ПараметрыВнешнегоПодключенияРаботыСРечью") Тогда
ВызватьИсключение "Сохранённое подключение не вернуло типизированные параметры";
КонецЕсли;
Если Фактические.АдресСервера <> Ожидаемые.АдресСервера
Или Фактические.Токен <> Ожидаемые.Токен Тогда
ВызватьИсключение "Сохранённые параметры изменились; секретные значения в сообщение не включаются";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьРегистрациюБазы()
ПроверитьСвойВвод();
Если СвойОпытНачат Тогда
ВызватьИсключение "Сначала выполните ОчиститьСвоюРегистрацию; новую регистрацию автоматически не запускаем";
КонецЕсли;
ПроверитьСвоеПустоеПодключение();
Итог = "Опыт регистрации только собственной пустой базы; прошлый результат сброшен";
ПарольЗапроса = ПарольСервиса;
ПарольСервиса = "";
ТекстРегистрации = "";
СвойОпытНачат = Истина;
Попытка
РаботаСРечью.ВыполнитьРегистрациюИнформационнойБазы(УчетнаяЗапись, ПарольЗапроса, АдресСервиса);
ПарольЗапроса = "";
Параметры = СделатьСвоюКопиюПодключения(РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияИнформационнойБазы());
Если Не ЗначениеЗаполнено(Параметры.Токен) Тогда
ВызватьИсключение "Для настройки информационной базы нужны адрес и настоящий токен";
КонецЕсли;
РаботаСРечью.УстановитьПараметрыВнешнегоПодключенияИнформационнойБазы(Параметры);
ПроверитьСвоиПараметры(РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияИнформационнойБазы(), Параметры);
Если Не РаботаСРечью.ПоддерживаетсяИспользованиеВнешнегоРасположения() Тогда
ВызватьИсключение "Регистрация базы ещё не подтверждена флагом её внешнего расположения";
КонецЕсли;
СвояРегистрация = РаботаСРечью.ПолучитьДанныеРаботыСРечьюИнформационнойБазы();
Если ТипЗнч(СвояРегистрация) <> Тип("ДанныеИнформационнойБазыРаботыСРечью") Тогда
ВызватьИсключение "Нужны настоящие непрозрачные данные только собственной регистрации";
КонецЕсли;
ТекстРегистрации = СвоюРегистрациюВСтроку(СвояРегистрация);
Если СтрДлина(ТекстРегистрации) > 262144 Тогда
ВызватьИсключение "Для опыта допустим только небольшой собственный объект регистрации";
КонецЕсли;
КопияРегистрации = СвоюРегистрациюИзСтроки(ТекстРегистрации, Тип("ДанныеИнформационнойБазыРаботыСРечью"));
РаботаСРечью.УстановитьПараметрыВнешнегоПодключенияИнформационнойБазы(Неопределено);
Если РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияИнформационнойБазы() <> Неопределено
Или РаботаСРечью.ПоддерживаетсяИспользованиеВнешнегоРасположения() Тогда
ВызватьИсключение "Отключение внешнего доступа собственной базы ещё не подтверждено";
КонецЕсли;
РаботаСРечью.УстановитьДанныеРаботыСРечьюИнформационнойБазы(Неопределено);
Если РаботаСРечью.ПолучитьДанныеРаботыСРечьюИнформационнойБазы() <> Неопределено Тогда
ВызватьИсключение "Отмена собственной настройки базы ещё не подтверждена";
КонецЕсли;
РаботаСРечью.УстановитьДанныеРаботыСРечьюИнформационнойБазы(КопияРегистрации);
Восстановленные = РаботаСРечью.ПолучитьДанныеРаботыСРечьюИнформационнойБазы();
Если ТипЗнч(Восстановленные) <> Тип("ДанныеИнформационнойБазыРаботыСРечью") Тогда
ВызватьИсключение "Восстановлена не типизированная собственная регистрация";
КонецЕсли;
Если СвоюРегистрациюВСтроку(Восстановленные) <> ТекстРегистрации Тогда
ВызватьИсключение "Полные данные изменились; содержимое секретного XML не выводится";
КонецЕсли;
ПроверитьСвоиПараметры(РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияИнформационнойБазы(), Параметры);
Если Не РаботаСРечью.ПоддерживаетсяИспользованиеВнешнегоРасположения()
Или РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияСеанса() <> Неопределено Тогда
ВызватьИсключение "Восстановление базы не должно создать отдельную регистрацию сеанса";
КонецЕсли;
ТекстРегистрации = "";
ОчиститьТолькоСвоюРегистрацию();
Итог = "Своя регистрация создана, отключена, восстановлена и окончательно отменена. Настройки базы и сеанса снова отсутствуют; секреты не выводились и файл не создавался";
Исключение
ПарольЗапроса = "";
ТекстРегистрации = "";
Итог = "Опыт не завершён. Настройка могла сохраниться только в собственной выделенной базе; после восстановления связи вручную нажмите ОчиститьСвоюРегистрацию в этом же окне";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ОчиститьСвоюРегистрацию()
ПроверитьСвоеСогласие();
ПарольСервиса = "";
Если Не СвойОпытНачат Тогда
Итог = "Нет собственного незавершённого опыта; настройки не менялись";
Возврат;
КонецЕсли;
Итог = "Отмена только собственной регистрации в выделенной учебной базе";
Попытка
ОчиститьТолькоСвоюРегистрацию();
Итог = "Отсутствие собственной регистрации подтверждено; закрытие обычного окна разрешено";
Исключение
Итог = "Отсутствие собственной регистрации ещё не подтверждено. Новый опыт запрещён; повторите только ручную очистку после восстановления связи";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ОчиститьТолькоСвоюРегистрацию()
Если Не СвойОпытНачат Тогда
ВызватьИсключение "Этот открытый опыт не регистрировал собственную пустую базу: отмена запрещена";
КонецЕсли;
РаботаСРечью.УстановитьДанныеРаботыСРечьюИнформационнойБазы(Неопределено);
ПроверитьСвоеПустоеПодключение();
СвойОпытНачат = Ложь;
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
СтандартнаяОбработка = Истина;
ПарольСервиса = "";
Если СвойОпытНачат Тогда
Отказ = Истина;
Сообщить("Сначала выполните ОчиститьСвоюРегистрацию в этом же учебном окне");
Возврат;
КонецЕсли;
СвояГотовность = Ложь;
КонецПроцедуры
Функция СвоюРегистрациюВСтроку(Объект)
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Запись, Объект);
Возврат Запись.Закрыть();
КонецФункции
Функция СвоюРегистрациюИзСтроки(СтрокаXML, ТребуемыйТип)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXML);
Попытка
Объект = СериализаторXDTO.ПрочитатьXML(Чтение, ТребуемыйТип);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ТипЗнч(Объект) <> ТребуемыйТип Тогда
ВызватьИсключение "Нужен полный собственный типизированный объект, не кусок ссылок";
КонецЕсли;
Возврат Объект;
КонецФункцииРазбор по шагам
Начало требует права Администрирование данных, пустую новую базу и новый сеанс без подключения. В чужом или ранее настроенном состоянии опыт отказывается до регистрационной записи.
Флаг владения попыткой ставится только после всех проверок пустоты, но до ВыполнитьРегистрациюИнформационнойБазы. Он сохраняется и при потере ответа, чтобы неизвестное состояние не выдавалось за отсутствие записи.
Реальная регистрация сохраняется в базе или текущей области. Getter даёт настоящий типизированный объект подключения; mutable-копия фактических адреса и токена используется setter базы и проверяется повторным чтением.
ПоддерживаетсяИспользованиеВнешнегоРасположения проверяет настройку базы, не доступность сети. После подтверждённой регистрации её флаг ожидается Истина, но урок не утверждает, что модель уже выполняет распознавание.
ПолучитьДанныеРаботыСРечьюИнформационнойБазы возвращает реальный непрозрачный объект. Только его собственный тип разрешён для полной XDTO-копии; строка остаётся локальной переменной памяти и не передаётся в поля формы, Сообщить или файл.
Setter внешних параметров с Неопределено отключает внешнее подключение базы; getters проверяют именно этот результат. Затем setter полных данных с Неопределено отменяет настройку. Эти разные операции не подменяются чисткой сеанса.
УстановитьДанные получает типизированный объект, восстановленный из собственного полного XML. Повторный полный объект должен иметь правильный тип и тот же XML в этом контексте; адрес, токен и флаг подключения также проверяются, а регистрация сеанса остаётся отсутствующей.
В конце окончательно отменяем только собственную регистрацию и проверяем все начальные признаки отсутствия. Флаг владения снимается только после успешной проверки. Ошибка оставляет ручную кнопку очистки, но не выполняет автоматически новую регистрацию.
Как проверить результат
При наличии исходной регистрации, параметров сеанса, моделей или грамматик первого опыта процедура должна отказать до регистрации. Не очищайте это состояние вручную ради прохождения урока в чужой базе.
Для своего реального аккаунта после регистрации ожидается типизированный объект подключения с непустыми адресом и токеном, полный объект ДанныеИнформационнойБазыРаботыСРечью и включённый флаг настройки базы.
После отключения внешних параметров ожидаются Неопределено и выключенный флаг внешнего расположения; не приписывайте этому getter автоматическое чтение или удаление всех дополнительных грамматик.
После восстановления полного объекта проверяются его тип, целый XML текущего контекста и реальные два поля подключения. Токен не появляется в успехе или ошибке формы, файл не создаётся.
После финальной отмены начальные getters базы и сеанса снова должны вернуть Неопределено, а флаг базы — Ложь. Только тогда СвойОпытНачат снимается и нормальное закрытие разрешено.
При потерянном ответе восстановите связь и используйте ОчиститьСвоюРегистрацию только в том же собственном окне. При отсутствии собственного незавершённого опыта эта кнопка не меняет настройки.
Ожидаемый результат
В успешном собственном ручном опыте регистрация базы создана, отключена, восстановлена через полный типизированный объект и окончательно отменена. Сеанс не регистрируется отдельно; секретные строки не выводятся и не записываются.
На что обратить внимание
УстановитьДанные принимает Произвольный, но это не разрешение передавать произвольный JSON или структуру: здесь используются только реальный собственный тип и документированный Неопределено.
Полный объект содержит доступ к облаку и другие служебные сведения. Не экспортируйте его как общедоступный учебный JSON и не применяйте к чужой базе. В этом опыте XDTO-копия существует только в памяти собственного окна.
Код сброса допустим только после подтверждённой исходной пустоты и начала собственной попытки. Он не является универсальной административной кнопкой отмены чужой регистрации.
Наличие настройки базы не доказывает доступность сервера, авторизацию в конкретной модели или квоту. Отмена настройки также не обещает удаление аккаунта, отзыв токена на стороне сервиса или отмену тарифа.
Сравнение полного XML — строгая проверка одного собственного объекта, версии и контекста. Это не криптографическая канонизация XML, не проверка импортированного внешнего XML и не гарантия стабильного порядка сериализации любого чужого объекта.
Предел262144символа проверяется после создания строки, а не до аллокации. Не загружайте в этот опыт неизвестные выгрузки, массовые модели или чужие грамматики.
Обычный ПередЗакрытием может запретить закрытие формы, пока результат отмены не подтверждён, но не защищает от падения процесса или выключения ОС. После потери окна администратор должен проверять именно собственную выделенную базу; массовая отмена в production запрещена.
Если параллельно изменить область, регистрацию или собственный объект, строгая проверка может завершиться ошибкой. Чужие изменения автоматически не восстанавливаются. Здесь регистрации и сетевых вызовов не было, runtimeVerifiedScenarios=0.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Зарегистрировать только свой сеанс и проверить настоящие параметры без вывода токена
Пустой собственный сеанс регистрируется настоящим аккаунтом. Полученные параметры копируются в отдельный изменяемый объект и действуют только в этом сеансе; проверки подтверждают отсутствие сохраняемой регистрации базы.
Где и как запускать
Полный модуль обычной формы собственной обработки УчебноеПодключениеРечи85.Пульт; толстый клиент, новая отдельная база УчебноеПодключениеРечи85.
Подготовка
Для каждого урока создайте отдельную новую пустую файловую базу с именем конфигурации УчебноеПодключениеРечи85, платформа8.5.1.1343. Не переименовывайте рабочую УТ/КА/УНФ/БП и не переносите туда служебные данные старой регистрации, модели, грамматики, обмены или задания.
Используйте толстый клиент, Обычное приложение. В конфигураторе: Обработки → УчебноеПодключениеРечи85 → Формы → Пульт, тип Обычная. Основной код — полный модуль этой формы, не код управляемой формы и не серверной команды браузера.
Заранее подготовьте отдельный настоящий аккаунт сервиса речи, его пароль, подтверждённый HTTPS-адрес вашего региона, разрешение на регистрацию и сведения о тарифе. Код не задаёт домен, логин, токен или пароль по умолчанию и не отключает проверку сертификата.
Свой учебный пользователь1С должен иметь Администрирование данных: в обоих уроках чтение настроек базы нужно для проверки границы между базой и сеансом. Не включайте привилегированный режим и не используйте production-аккаунт администратора.
Добавьте реквизиты Согласие типа Булево, УчетнаяЗапись, ПарольСервиса, АдресСервиса и Итог типа Строка неограниченной длины. Выведите флажок согласия и поля строк; многострочный Итог сделайте только для просмотра.
Поле ввода реквизита ПарольСервиса назовите ПолеПароля. ПриОткрытии программно включает его РежимПароля: символы скрываются звёздочками. Это маскировка экрана, не шифрование памяти; не сохраняйте пароль в настройках, файлах, журнале, скриншотах или скопированном коде.
Вставьте полный код своего выбранного урока в пустой модуль формы. ПриОткрытии назначьте соответствующему событию без параметров; ПередЗакрытием — событию обычной формы с параметрами Отказ и СтандартнаяОбработка. Не объединяйте два модуля с одинаковыми обработчиками.
Добавьте перечисленные для урока обычные кнопки. Событию Нажатие каждой назначьте одноимённую процедуру без параметров. Нажмите F7, обновите только новую учебную базу; F7 не доказывает подключение к облаку.
Откройте свою обработку в отдельном новом сеансе. При открытии все поля очищаются и Согласие=Ложь. Введите настоящий аккаунт и адрес вручную, проверьте адрес по своим официальным настройкам и только затем установите согласие.
Исходная база и текущий сеанс должны быть без регистрации. Перед первой записью код проверяет оба набора параметров, непрозрачные данные базы и флаг внешнего расположения. Если что-то уже есть, он отказывается: чужие настройки ради прохождения опыта не очищайте.
Во время опыта не открывайте второе окно, не меняйте разделители или учётную запись и не запускайте другие действия с сервисом. Адреса, токены и непрозрачные данные берутся только из фактических ответов менеджера; сюда не вставляется неизвестный входной объект.
Здесь примеры не запускались в1С, сеть и регистрация не выполнялись: runtimeVerifiedScenarios=0. Реальный доступ, тариф и корректность сертификатов проверяются отдельно пользователем; новые файлы, резервные копии и архивы код урока не создаёт.
Создайте одну обычную кнопку ЗарегистрироватьСеанс. После успешного или неопределённого по ошибке результата повторную регистрацию этот открытый опыт не делает: для нового опыта завершите весь собственный клиент1С и начните новый сеанс.
Перем СвояГотовность;
Перем СвойОпытНачат;
Процедура ПриОткрытии()
СвояГотовность = Ложь;
СвойОпытНачат = Ложь;
Согласие = Ложь;
УчетнаяЗапись = "";
ПарольСервиса = "";
АдресСервиса = "";
Итог = "Подготовьте отдельный настоящий аккаунт и подтверждённый адрес собственного сервиса";
ЭлементыФормы.ПолеПароля.РежимПароля = Истина;
ПроверитьСвойСтенд();
СвояГотовность = Истина;
КонецПроцедуры
Процедура ПроверитьСвойСтенд()
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Не регистрируйте сервис внутри транзакции";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоеСогласие()
ПроверитьСвойСтенд();
Если Не СвояГотовность Или Не Согласие Тогда
ВызватьИсключение "Нужны открытое собственное окно и явное согласие на регистрацию";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойВвод()
ПроверитьСвоеСогласие();
Если Не ЗначениеЗаполнено(УчетнаяЗапись) Или Не ЗначениеЗаполнено(ПарольСервиса)
Или Не ЗначениеЗаполнено(АдресСервиса) Тогда
ВызватьИсключение "Введите реальные логин, пароль и подтверждённый адрес собственного сервиса";
КонецЕсли;
Если НРег(Лев(АдресСервиса, 8)) <> "https://" Тогда
ВызватьИсключение "Этот учебный облачный стенд допускает только заранее подтверждённый HTTPS-адрес";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоеПустоеПодключение()
Если РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияСеанса() <> Неопределено Тогда
ВызватьИсключение "В этом сеансе уже есть подключение: начните отдельный новый учебный сеанс, не очищайте чужое";
КонецЕсли;
Если РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияИнформационнойБазы() <> Неопределено
Или РаботаСРечью.ПолучитьДанныеРаботыСРечьюИнформационнойБазы() <> Неопределено
Или РаботаСРечью.ПоддерживаетсяИспользованиеВнешнегоРасположения() Тогда
ВызватьИсключение "В новой учебной базе не должно быть регистрации, моделей или грамматик предыдущего опыта";
КонецЕсли;
КонецПроцедуры
Функция СделатьСвоюКопиюПодключения(Параметры)
Если ТипЗнч(Параметры) <> Тип("ПараметрыВнешнегоПодключенияРаботыСРечью") Тогда
ВызватьИсключение "Нужны настоящие параметры, полученные от менеджера после регистрации";
КонецЕсли;
Если Не ЗначениеЗаполнено(Параметры.АдресСервера) Тогда
ВызватьИсключение "Сервис не вернул адрес: не заменяйте его придуманным endpoint";
КонецЕсли;
Копия = Новый ПараметрыВнешнегоПодключенияРаботыСРечью;
Копия.АдресСервера = Параметры.АдресСервера;
Копия.Токен = Параметры.Токен;
Возврат Копия;
КонецФункции
Процедура ПроверитьСвоиПараметры(Фактические, Ожидаемые)
Если ТипЗнч(Фактические) <> Тип("ПараметрыВнешнегоПодключенияРаботыСРечью") Тогда
ВызватьИсключение "Сохранённое подключение не вернуло типизированные параметры";
КонецЕсли;
Если Фактические.АдресСервера <> Ожидаемые.АдресСервера
Или Фактические.Токен <> Ожидаемые.Токен Тогда
ВызватьИсключение "Сохранённые параметры изменились; секретные значения в сообщение не включаются";
КонецЕсли;
КонецПроцедуры
Процедура ЗарегистрироватьСеанс()
ПроверитьСвойВвод();
Если СвойОпытНачат Тогда
ВызватьИсключение "Этот опыт уже пытался зарегистрировать сеанс. Завершите весь учебный клиент и начните отдельный новый сеанс";
КонецЕсли;
ПроверитьСвоеПустоеПодключение();
Итог = "Регистрация собственного сеанса; прошлый результат сброшен";
ПарольЗапроса = ПарольСервиса;
ПарольСервиса = "";
СвойОпытНачат = Истина;
Попытка
РаботаСРечью.ВыполнитьРегистрациюСеанса(УчетнаяЗапись, ПарольЗапроса, АдресСервиса);
ПарольЗапроса = "";
Параметры = РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияСеанса();
Если Параметры = Неопределено Тогда
ВызватьИсключение "Регистрация не дала параметры текущего сеанса";
КонецЕсли;
Копия = СделатьСвоюКопиюПодключения(Параметры);
РаботаСРечью.УстановитьПараметрыВнешнегоПодключенияСеанса(Копия);
ПроверитьСвоиПараметры(РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияСеанса(), Копия);
Если РаботаСРечью.ПолучитьПараметрыВнешнегоПодключенияИнформационнойБазы() <> Неопределено
Или РаботаСРечью.ПолучитьДанныеРаботыСРечьюИнформационнойБазы() <> Неопределено
Или РаботаСРечью.ПоддерживаетсяИспользованиеВнешнегоРасположения() Тогда
ВызватьИсключение "Сеансовый опыт не должен зарегистрировать информационную базу";
КонецЕсли;
Итог = "Получены и пересохранены настоящие параметры текущего сеанса. База осталась без регистрации; токен не показан. Закрытие формы не завершает сеанс";
Исключение
ПарольЗапроса = "";
Итог = "Регистрация или проверка не завершена. Возможное подключение действует только в собственном текущем сеансе; автоматического повторного запроса или сброса через Неопределено нет";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
СтандартнаяОбработка = Истина;
ПарольСервиса = "";
СвояГотовность = Ложь;
КонецПроцедурыРазбор по шагам
Сначала проверяются собственный стенд, версия, согласие и три реальные непустые строки. В этом облачном учебном опыте нужен HTTPS; сам префикс не подтверждает, что домен принадлежит вашему сервису.
Чтение начальных настроек должно подтвердить отсутствие подключения сеанса и базы. Администрирование данных здесь требуется для контрольного чтения базы, хотя сама регистрация сеанса не помечена этим требованием.
Пароль копируется только в локальную строковую переменную вызова, а поле сразу очищается. Флаг попытки ставится до регистрации: при потере ответа неизвестно, сохранилось ли подключение.
ВыполнитьРегистрациюСеанса вызывается с фактическими логином, паролем и региональным адресом. Метод не возвращает булево подтверждение; результат проверяем отдельным getter, а не выдуманным Истина.
Getter может вернуть Неопределено. Только после этой проверки и проверки типа читаем АдресСервера и Токен; ни одно секретное значение не выводим пользователю.
Новый ПараметрыВнешнегоПодключенияРаботыСРечью создаёт отдельный объект. Два изменяемых поля заполняются фактическими значениями ответа, не выдуманным URL и токеном; копия реально передаётся setter текущего сеанса.
Повторный getter проверяет фактические адрес и токен после сохранения. Отдельные чтения данных базы должны по-прежнему возвращать отсутствие регистрации, а флаг внешнего расположения базы — Ложь.
В успехе и исключении локальная переменная пароля очищается. Повторный платный запрос и недокументированный сброс сеанса через Неопределено не выполняются; закрытие формы очищает лишь поле пароля, не завершает сеанс.
Как проверить результат
Без согласия, заполненного настоящего адреса, аккаунта или пароля регистрации быть не должно. При неправильной базе, версии, активной транзакции или существующем подключении код должен отказать.
С реальным разрешённым аккаунтом ожидаются параметры текущего сеанса правильного типа и повторное равенство двух фактических полей после setter. Никакого заранее заданного токена нет.
После сеансового опыта параметры и непрозрачные данные базы должны оставаться Неопределено. Ложь флага внешнего расположения базы не означает ошибку регистрации отдельного сеанса.
ПарольСервиса должен очищаться до вызова регистрации и оставаться пустым при исключении внутри опыта. Токен и XML регистрации не должны появляться в поле Итог или Сообщить.
Повторное нажатие после начала попытки отклоняется. Для нового независимого опыта завершайте именно собственный сеанс клиента, не рабочую базу другого пользователя.
Полученные параметры ещё не доказывают доступ к закрытой модели, тариф, качество распознавания или успешный сетевой вызов к модели; здесь микрофон, распознавание и синтез не используются.
Ожидаемый результат
Текущий собственный сеанс имеет настоящие проверенные параметры подключения; пустая информационная база не получила сохраняемой регистрации. Секреты не выводятся, завершение сеанса остаётся отдельным действием пользователя.
На что обратить внимание
Завершение обычной формы и завершение сеанса — разные вещи. Зарегистрированный сеанс не обещается отключённым по закрытию этого окна.
Сеансовый setter требует заполненный адрес. Неопределено как его аргумент очистки не документировано; не переносите на него способ отключения базы.
Без токена сеансовое подключение допускает публичные модели. Наличие или отсутствие токена само по себе не доказывает авторизацию в частной модели или действительность тарифа.
РежимПароля скрывает экранные символы, но не шифрует строки в памяти. Обнуление переменной в1С не является гарантированным криптографическим стиранием памяти; не оставляйте дампы, диагностические выгрузки или записи экрана с секретами.
Исключение платформы или сервиса может иметь свои диагностические подробности. Пример не пишет их в файл и не добавляет секреты к сообщению; перед отправкой внешней диагностики пользователь должен проверить её на чувствительные данные.
Настройки текущего сеанса не являются регистрацией всей базы. В разделённой системе контекст области и сеанса должен совпадать; для этого первого опыта используется отдельная база без разделителей.
Идентичное пересохранение собственной копии — работа с реальным типизированным объектом, не проверка сети и не смена аккаунта. Все значения берутся из фактического getter; runtimeVerifiedScenarios=0.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.