ПользовательСистемыВзаимодействия

Типы · CollaborationSystemUser

Предоставляет доступ к свойствам и методам пользователя системы взаимодействия.

Полное описание, параметры и ограничения

ПользовательСистемыВзаимодействия (CollaborationSystemUser)

ПользовательСистемыВзаимодействия (CollaborationSystemUser)

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

Свойства:
АдминистраторАбонента (SubscriberAdministrator)
АдресЭлектроннойПочты (Email)
АдресЭлектроннойПочтыДляАутентификации (AuthenticationEmail)
Внешний (External)
Заблокирован (IsLocked)
Идентификатор (ID)
ИдентификаторПользователяВнешнейСистемы (ExternalSystemUserID)
ИдентификаторПользователяИнформационнойБазы (InfoBaseUserID)
Имя (Name)
Картинка (Picture)
КлючСопоставления (MatchingKey)
НомерТелефона (PhoneNumber)
ПолноеИмя (FullName)
Псевдоним (Nickname)
ТипВнешнейСистемы (ExternalSystemType)

Методы:
Записать (Write)

Описание:

Предоставляет доступ к свойствам и методам пользователя системы взаимодействия.

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

Мобильный клиент, сервер, толстый клиент, внешнее соединение.

См. также:
МенеджерСистемыВзаимодействия, метод ПолучитьПользователя
МенеджерСистемыВзаимодействия, метод СоздатьПользователя

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

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

Описание изменено в версии 8.3.25.

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

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

Создать свое обсуждение с двумя сообщениями, проверить ответ и обновить собственную карточку

Полный цикл начинается с нового собственного UUID-ключа и реального текущего участника. Создает обсуждение, выключает собственные оповещения, отправляет две учебные карточки, проверяет их IDs/данные/ответ, точную выборку и обновление.

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

Полный серверный общий модуль УчебноеВзаимодействие своей пустой конфигурации УчебноеВзаимодействие85. Реальная работа системы взаимодействия только после вашего ручного запуска в отдельной локальной VM.

Подготовка

  1. Нужны только ваша изолированная VM, новая пустая база8.5.1.1343 и отдельный локальный сервер взаимодействия, не связанный с рабочими абонентами/серверами. Имя конфигурации УчебноеВзаимодействие85, русский язык, совместимость Не использовать, управляемый интерфейс. Пустоту предметных объектов, фоновых заданий, подписок и отсутствие расширений проверяет код. Реальные API здесь не выполнялись.

  2. Разверните собственный учебный сервер взаимодействия в той же VM с локальным адресом http://localhost:9094, без публичной публикации, SMTP, внешних интеграций, совместного использования приложений и чужих учетных записей. Его установку и настройку выполняйте вручную по документации своей серверной поставки. Эта программа не устанавливает сервер и не меняет маршрут localhost. Если фактически зарегистрированный адрес отличается, образец намеренно отказывает; не подставляйте рабочий адрес.

  3. В конфигураторе вручную создайте единственного пользователя с именем Уч85Связь_ и добавленным вашим новым ненулевым UUID в каноническом строковом формате; полное имя Учебный участник. Назначьте только в этом стенде необходимые права Администрирование данных/администрирование пользователей и системы взаимодействия. Войдите под ним. Учетные записи/права этим кодом не создаются и не расширяются.

  4. Вручную зарегистрируйте только эту пустую базу на своем отдельном сервере взаимодействия; наименование приложения задайте УчебноеВзаимодействие85. Синхронизируйте своего внутреннего пользователя базы: имя/полное имя совпадают, учетная запись не внешняя, не заблокирована, без почты/телефона/аутентификационной почты/ключа сопоставления. Для урока профиля псевдоним должен быть пустым. Не используйте персональные сведения, действительные адреса или контакты.

  5. Создайте серверный общий модуль УчебноеВзаимодействие с флагом Сервер, без флагов Клиент и Привилегированный. Вставьте полный код выбранного урока целиком, не одновременно оба варианта модуля. Все вызываемые внутренние функции включены. Нельзя вставлять серверные методы в клиентский модуль формы: thin/web для этих синхронных методов не объявлены в native-справке.

  6. Создайте свою внешнюю обработку с одной управляемой формой, командой Выполнить и строковым реквизитом Подтверждение длиной100. Обработчик команды клиента вызывает ВыполнитьНаСервере(); серверная процедура вызывает УчебноеВзаимодействие.ВыполнитьПример(Подтверждение). Эти две короткие процедуры даны отдельным поддерживающим модулем. Кнопка должна быть нажата сознательно только после чтения предупреждений; автоматического запуска при открытии нет.

  7. В VM оставьте только свой сеанс, не включайте ботов, обработчики сообщений, сторонние клиенты или задания, способные менять свои объекты параллельно. Защитные маркеры/ID уменьшают риск чужого доступа, но не являются криптографическим доказательством собственника сервера и не заменяют вашу проверку выделенного стенда. Профиль и сообщения — настоящие изменения на своем сервере при вашем ручном запуске.

  8. Сначала оставьте подтверждение пустым: программа должна остановиться до изменения профиля/создания обсуждения. Затем введите только фразу выбранного урока. После исключения никакие автоматические повторы/откаты/удаления не выполняются. Сохраните показанный собственный кандидат UUID-ключа/псевдонима и проверяйте возможный частичный результат вручную только в своем сервере. Новые резервные копии не создаются.

Процедура ВыполнитьПример(Подтверждение = "") Экспорт
    Пользователь = ПроверитьСвоегоПользователя85();
    Если Подтверждение <> "СВОЕ ОБСУЖДЕНИЕ И ДВА СООБЩЕНИЯ" Тогда
        ВызватьИсключение "Сначала прочитайте подготовку. Обсуждение не создано";
    КонецЕсли;
    ИДПользователя = Пользователь.Идентификатор;
    Ключ = "Уч85Обсуждение_" + Строка(Новый УникальныйИдентификатор);
    Сообщить("Собственный кандидат ключа: " + Ключ);
    Если СистемаВзаимодействия.ПолучитьОбсуждение(Ключ) <> Неопределено Тогда
        ВызватьИсключение "Коллизия ключа: существующее обсуждение не меняется";
    КонецЕсли;
    Выбор = Новый КоллекцияИдентификаторовПользователейСистемыВзаимодействия;
    Выбор.Добавить(ИДПользователя);
    Если Выбор.Количество() <> 1 Или Не Выбор.Содержит(ИДПользователя) Тогда
        ВызватьИсключение "Состав своего участника не собран";
    КонецЕсли;
    Выбор.Удалить(ИДПользователя);
    Если Выбор.Количество() <> 0 Или Выбор.Содержит(ИДПользователя) Тогда
        ВызватьИсключение "Удаление из локального подбора не подтверждено";
    КонецЕсли;
    Выбор.Добавить(ИДПользователя);
    Выбор.Очистить();
    Если Выбор.Количество() <> 0 Тогда
        ВызватьИсключение "Локальный подбор не очищен";
    КонецЕсли;
    Выбор.Добавить(ИДПользователя);
    Обсуждение = СистемаВзаимодействия.СоздатьОбсуждение();
    Обсуждение.Ключ = Ключ;
    Обсуждение.Заголовок = Ключ + " | Проверка карточки книги";
    Обсуждение.Групповое = Истина;
    Обсуждение.Отображаемое = Истина;
    Обсуждение.ТолькоПросмотр = Ложь;
    Обсуждение.КонтекстОбсуждения = Неопределено;
    Обсуждение.Интеграция = Неопределено;
    Обсуждение.ВнешнийИдентификатор = "";
    Для Каждого Участник Из Выбор Цикл
        Обсуждение.Участники.Добавить(Участник);
    КонецЦикла;
    Обсуждение.Записать();
    ИДОбсуждения = Обсуждение.Идентификатор;
    Если ТипЗнч(ИДОбсуждения) <> Тип("ИдентификаторОбсужденияСистемыВзаимодействия") Тогда
        ВызватьИсключение "Запись могла произойти, но реальный ID обсуждения не получен";
    КонецЕсли;
    Сообщить("Свой ID обсуждения: " + Строка(ИДОбсуждения));
    Восстановленное = Новый ИдентификаторОбсужденияСистемыВзаимодействия(Строка(ИДОбсуждения));
    ПроверитьСвоеОбсуждение85(Восстановленное, Ключ, ИДПользователя);
    Отбор = Новый ОтборОбсужденийСистемыВзаимодействия;
    Отбор.Ключ = Ключ;
    Отбор.Групповое = Истина;
    Отбор.Отображаемое = Истина;
    Отбор.КонтекстноеОбсуждение = Ложь;
    Отбор.КонтекстОбсуждения = Неопределено;
    Отбор.ТекущийПользовательЯвляетсяУчастником = Истина;
    Отбор.Количество = 2;
    Отбор.НаправлениеСортировки = НаправлениеСортировки.Возр;
    Отбор.ДатаНачала = Неопределено;
    Отбор.ВнешнийИдентификатор = "";
    Если Отбор.Интеграция <> Неопределено Тогда
        ВызватьИсключение "Новый отбор не должен выбирать внешнюю интеграцию";
    КонецЕсли;
    Список = СистемаВзаимодействия.ПолучитьОбсуждения(Отбор);
    Если Список.Количество() <> 1 Или Список[0].Идентификатор <> ИДОбсуждения Тогда
        ВызватьИсключение "Точный отбор собственного обсуждения не совпал";
    КонецЕсли;
    СистемаВзаимодействия.УстановитьРежимНаблюдения(ИДОбсуждения, Ложь, ИДПользователя);
    СистемаВзаимодействия.УстановитьОтображениеОповещенийОбсуждения(ИДОбсуждения,
        ОтображениеОповещенийСистемыВзаимодействия.НеБеспокоить, ИДПользователя);
    Если СистемаВзаимодействия.ПолучитьРежимНаблюдения(ИДОбсуждения, ИДПользователя)
        Или СистемаВзаимодействия.ПолучитьОтображениеОповещенийОбсуждения(ИДОбсуждения, ИДПользователя)
        <> ОтображениеОповещенийСистемыВзаимодействия.НеБеспокоить Тогда
        ВызватьИсключение "Собственные настройки оповещений не подтверждены";
    КонецЕсли;
    ПроверитьСвоеОбсуждение85(ИДОбсуждения, Ключ, ИДПользователя);
    ОтборДоЗаписи = Новый ОтборСообщенийСистемыВзаимодействия;
    ОтборДоЗаписи.Обсуждение = ИДОбсуждения;
    ОтборДоЗаписи.Количество = 2;
    ОтборДоЗаписи.НаправлениеСортировки = НаправлениеСортировки.Возр;
    ОтборДоЗаписи.После = Неопределено;
    Если СистемаВзаимодействия.ПолучитьСообщения(ОтборДоЗаписи).Количество() <> 0 Тогда
        ВызватьИсключение "Перед первой своей записью обсуждение должно быть пусто";
    КонецЕсли;
    Исходное = СистемаВзаимодействия.СоздатьСообщение(ИДОбсуждения);
    Исходное.Текст = Новый ФорматированнаяСтрока(Ключ + " | Книга: количество 3, цена 250");
    Исходное.Данные = Ключ + "|Книга|3|250";
    Исходное.ФорматДанныхСтроки = "text/plain";
    Исходное.Получатели.Добавить(Новый ИдентификаторПользователяСистемыВзаимодействия);
    ПроверитьСвойЧерновик85(Исходное);
    Исходное.Записать();
    ИДИсходного = Исходное.Идентификатор;
    Сообщить("Свой ID первого сообщения: " + Строка(ИДИсходного));
    ПервыйФакт = СистемаВзаимодействия.ПолучитьСообщение(
        Новый ИдентификаторСообщенияСистемыВзаимодействия(Строка(ИДИсходного)));
    ПроверитьСвоеСообщение85(ПервыйФакт, ИДИсходного, ИДОбсуждения, ИДПользователя, Ключ,
        Ключ + " | Книга: количество 3, цена 250", Неопределено);
    ПроверитьСвоеОбсуждение85(ИДОбсуждения, Ключ, ИДПользователя);
    ДоВторойЗаписи = СистемаВзаимодействия.ПолучитьСообщения(ОтборДоЗаписи);
    Если ДоВторойЗаписи.Количество() <> 1 Или ДоВторойЗаписи[0].Идентификатор <> ИДИсходного Тогда
        ВызватьИсключение "Перед второй своей записью ожидается только подтвержденное первое сообщение";
    КонецЕсли;
    Второе = СистемаВзаимодействия.СоздатьСообщение(ИДОбсуждения);
    Второе.Текст = Новый ФорматированнаяСтрока(Ключ + " | Проверка: сумма 750");
    Второе.Данные = Ключ + "|Книга|3|250";
    Второе.ФорматДанныхСтроки = "text/plain";
    Второе.ИсходноеСообщение = ИДИсходного;
    Второе.Получатели.Добавить(Новый ИдентификаторПользователяСистемыВзаимодействия);
    ПроверитьСвойЧерновик85(Второе);
    Второе.Записать();
    ИДВторого = Второе.Идентификатор;
    Сообщить("Свой ID второго сообщения: " + Строка(ИДВторого));
    ВторойФакт = СистемаВзаимодействия.ПолучитьСообщение(ИДВторого);
    ПроверитьСвоеСообщение85(ВторойФакт, ИДВторого, ИДОбсуждения, ИДПользователя, Ключ,
        Ключ + " | Проверка: сумма 750", ИДИсходного);
    ПроверитьСвойСписок85(ИДОбсуждения, ИДИсходного, ИДВторого);
    ПроверитьСвоеОбсуждение85(ИДОбсуждения, Ключ, ИДПользователя);
    ВторойФакт = СистемаВзаимодействия.ПолучитьСообщение(ИДВторого);
    ПроверитьСвоеСообщение85(ВторойФакт, ИДВторого, ИДОбсуждения, ИДПользователя, Ключ,
        Ключ + " | Проверка: сумма 750", ИДИсходного);
    ВторойФакт.Текст = Новый ФорматированнаяСтрока(Ключ + " | Проверка подтверждена: 750");
    ВторойФакт.Записать();
    ПроверитьСвоеСообщение85(СистемаВзаимодействия.ПолучитьСообщение(ИДВторого),
        ИДВторого, ИДОбсуждения, ИДПользователя, Ключ,
        Ключ + " | Проверка подтверждена: 750", ИДИсходного);
    Сообщить("Два своих сообщения сохранены, отобраны и одно обновлено. Удаление не выполняется автоматически");
КонецПроцедуры

Процедура ПроверитьСвойЧерновик85(Сообщение)
    Если Сообщение.Вложения.Количество() <> 0 Или Сообщение.Действия.Количество() <> 0
        Или Сообщение.ПанельКнопок.РядыКнопок.Количество() <> 0
        Или Сообщение.ЗначенияПодстановокШаблонаСообщения.Количество() <> 0
        Или Сообщение.ШаблонСообщения <> Неопределено Тогда
        ВызватьИсключение "Новый собственный черновик содержит неподготовленные вложения или шаблон";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвоеОбсуждение85(Идентификатор, Ключ, Участник)
    Факт = СистемаВзаимодействия.ПолучитьОбсуждение(Идентификатор);
    Если Факт.Идентификатор <> Идентификатор Или Факт.Ключ <> Ключ
        Или Факт.Заголовок <> Ключ + " | Проверка карточки книги"
        Или Не Факт.Групповое Или Не Факт.Отображаемое Или Факт.ТолькоПросмотр
        Или Факт.КонтекстОбсуждения <> Неопределено Или Факт.Интеграция <> Неопределено
        Или Факт.ВнешнийИдентификатор <> ""
        Или Факт.Участники.Количество() <> 1 Или Не Факт.Участники.Содержит(Участник) Тогда
        ВызватьИсключение "Полный собственный паспорт обсуждения изменен или не совпал";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвоеСообщение85(Факт, Идентификатор, Обсуждение, Автор, Ключ, Текст, Исходное)
    Если Факт.Идентификатор <> Идентификатор Или Факт.Обсуждение <> Обсуждение
        Или Факт.Автор <> Автор Или Строка(Факт.Текст) <> Текст
        Или Факт.Данные <> Ключ + "|Книга|3|250" Или Факт.ФорматДанныхСтроки <> "text/plain"
        Или Факт.ИсходноеСообщение <> Исходное Или ТипЗнч(Факт.Дата) <> Тип("Дата")
        Или Факт.Дата = Дата(1, 1, 1) Тогда
        ВызватьИсключение "Полное собственное сообщение не подтверждено. Чужое содержимое не выводится";
    КонецЕсли;
    ПроверитьСвойЧерновик85(Факт);
КонецПроцедуры

Процедура ПроверитьСвойСписок85(Обсуждение, Первый, Второй)
    Отбор = Новый ОтборСообщенийСистемыВзаимодействия;
    Отбор.Обсуждение = Обсуждение;
    Отбор.Количество = 3;
    Отбор.НаправлениеСортировки = НаправлениеСортировки.Возр;
    Отбор.После = Неопределено;
    Список = СистемаВзаимодействия.ПолучитьСообщения(Отбор);
    Если Список.Количество() <> 2 Тогда
        ВызватьИсключение "В собственном обсуждении должно быть ровно два собственных сообщения";
    КонецЕсли;
    Для Каждого СтрокаСообщения Из Список Цикл
        Если СтрокаСообщения.Обсуждение <> Обсуждение
            Или СтрокаСообщения.Идентификатор <> Первый И СтрокаСообщения.Идентификатор <> Второй Тогда
            ВызватьИсключение "В список попало неподтвержденное сообщение";
        КонецЕсли;
    КонецЦикла;
    Отбор.После = Второй;
    Если СистемаВзаимодействия.ПолучитьСообщения(Отбор).Количество() <> 0 Тогда
        ВызватьИсключение "После второго собственного сообщения не ожидаются записи";
    КонецЕсли;
КонецПроцедуры

Функция ПроверитьСвоегоПользователя85()
    ПроверитьСвойПустойСтенд();
    Если ПривилегированныйРежим() Тогда
        ВызватьИсключение "Входной привилегированный режим не допускается";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
        ВызватьИсключение "Нужен единственный собственный учебный пользователь";
    КонецЕсли;
    Если Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор
        Или Лев(Текущий.Имя, СтрДлина("Уч85Связь_")) <> "Уч85Связь_" Тогда
        ВызватьИсключение "Учебный пользователь не подтвержден";
    КонецЕсли;
    UUIDМетки = Новый УникальныйИдентификатор(Сред(Текущий.Имя, СтрДлина("Уч85Связь_") + 1));
    Если Текущий.Имя <> "Уч85Связь_" + Строка(UUIDМетки)
        Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        ВызватьИсключение "Имя должно содержать собственный канонический ненулевой UUID";
    КонецЕсли;
    Если Не СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована()
        Или Не СистемаВзаимодействия.ИспользованиеДоступно() Тогда
        ВызватьИсключение "Вручную подготовьте регистрацию собственной учебной базы";
    КонецЕсли;
    Если СистемаВзаимодействия.АдресСервера() <> "http://localhost:9094" Тогда
        ВызватьИсключение "Разрешен только отдельно подготовленный сервер localhost:9094 в своей VM";
    КонецЕсли;
    Версия = СистемаВзаимодействия.ВерсияСервера();
    Если ТипЗнч(Версия) <> Тип("Строка") Или Не ЗначениеЗаполнено(Версия) Тогда
        ВызватьИсключение "Версия своего сервера не получена";
    КонецЕсли;
    ИД = СистемаВзаимодействия.ИдентификаторТекущегоПользователя();
    Если ТипЗнч(ИД) <> Тип("ИдентификаторПользователяСистемыВзаимодействия") Тогда
        ВызватьИсключение "Не получен реальный идентификатор собственного участника";
    КонецЕсли;
    Если СистемаВзаимодействия.ПолучитьИдентификаторПользователя(Текущий.УникальныйИдентификатор) <> ИД
        Или СистемаВзаимодействия.ПолучитьИдентификаторПользователяИнформационнойБазы(ИД) <> Текущий.УникальныйИдентификатор Тогда
        ВызватьИсключение "Двустороннее соответствие своей учетной записи неверно";
    КонецЕсли;
    Пользователь = СистемаВзаимодействия.ПолучитьПользователя(ИД);
    Если Пользователь.Идентификатор <> ИД Или Пользователь.Имя <> Текущий.Имя
        Или Пользователь.ПолноеИмя <> Текущий.ПолноеИмя
        Или Пользователь.ИдентификаторПользователяИнформационнойБазы <> Текущий.УникальныйИдентификатор Тогда
        ВызватьИсключение "Паспорт своего пользователя не совпал с информационной базой";
    КонецЕсли;
    Если Пользователь.Внешний Или Пользователь.Заблокирован
        Или Пользователь.ТипВнешнейСистемы <> ""
        Или Пользователь.ИдентификаторПользователяВнешнейСистемы <> Неопределено
        Или Пользователь.АдресЭлектроннойПочты <> ""
        Или Пользователь.АдресЭлектроннойПочтыДляАутентификации <> ""
        Или Пользователь.НомерТелефона <> ""
        Или Пользователь.КлючСопоставления <> "" Тогда
        ВызватьИсключение "Нужен чистый внутренний пользователь без персональных контактов и объединений";
    КонецЕсли;
    Если Пользователь.АдминистраторАбонента <> СистемаВзаимодействия.ТекущийПользовательЯвляетсяАдминистраторомАбонента() Тогда
        ВызватьИсключение "Признак администратора абонента не согласован";
    КонецЕсли;
    ВсеПользователи = СистемаВзаимодействия.СтандартныеПользователи.ВсеПользователиПриложения;
    Если ИД = ВсеПользователи Или ИД = Новый ИдентификаторПользователяСистемыВзаимодействия Тогда
        ВызватьИсключение "Стандартный адресат и Никого не оповещать не являются своей учетной записью";
    КонецЕсли;
    ВосстановленныйИД = Новый ИдентификаторПользователяСистемыВзаимодействия(Строка(ИД));
    Если СистемаВзаимодействия.ПолучитьПользователя(ВосстановленныйИД).Идентификатор <> ИД Тогда
        ВызватьИсключение "Восстановленный из строки реальный ID не подтвержден сервером";
    КонецЕсли;
    Приложение = СистемаВзаимодействия.ПолучитьПриложение(СистемаВзаимодействия.ИдентификаторТекущегоПриложения());
    Если Приложение.Идентификатор <> СистемаВзаимодействия.ИдентификаторТекущегоПриложения()
        Или Приложение.Наименование <> "УчебноеВзаимодействие85" Тогда
        ВызватьИсключение "Нужно свое приложение с точным учебным наименованием";
    КонецЕсли;
    Возврат Пользователь;
КонецФункции

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

Своя внешняя обработка → основная управляемая форма → модуль формы

Полный клиентский обработчик команды и серверная процедура этой формы; общий модуль отдельно. Не вставляйте общий модуль внутрь обработчика.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьНаСервере()
    УчебноеВзаимодействие.ВыполнитьПример(Подтверждение);
КонецПроцедуры

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

  1. Сначала повторяется полный паспорт своего стенда/участника/приложения. Подтверждение СВОЕ ОБСУЖДЕНИЕ И ДВА СООБЩЕНИЯ обязательно. Новый Ключ из UUID выводится до первой серверной записи; ПолучитьОбсуждение(Ключ) должен вернуть Неопределено, существующий чат не переиспользуется.

  2. Отдельная локальная КоллекцияИдентификаторовПользователей демонстрирует Добавить/Содержит/Количество/Удалить/Очистить с настоящим своим участником. Это подбор в памяти, не удаление серверной учетной записи. В окончательном составе снова ровно один свой ID.

  3. СоздатьОбсуждение возвращает объект еще до серверного создания. Только новому объекту задаются Ключ, Групповое, ТолькоПросмотр, КонтекстОбсуждения, Интеграция и ВнешнийИдентификатор. Никакой внешней интеграции нет, контекст пуст, заголовок содержит свою метку; readonly Участники не заменяются массивом, а наполняются Добавить.

  4. После Записать получен реальный readonly ID, выводится только он. Конструктор ID обсуждения принимает Строка этого фактического ID. Новый ПолучитьОбсуждение проверяет весь паспорт: ключ/заголовок/флаги/пустые внешние значения/ровно свой участник.

  5. ОтборОбсуждений ограничивается своим точным Ключом, групповым видимым неконтекстным режимом и текущим участником; Количество=2 обнаруживает неожиданные записи. ДатаНачала=Неопределено не гадает часовой пояс/время первого сообщения. Readonly Интеграция только проверяется на отсутствие, не назначается.

  6. УстановитьРежимНаблюдения(false) и УстановитьОтображениеОповещенийОбсуждения(НеБеспокоить) применяются только к новому своему обсуждению/текущему участнику. Оба значения читаются заново. Это два разных состояния, не блокировка доставки сообщений или серверной записи.

  7. СоздатьСообщение требует реальный ИдентификаторОбсуждения, не строковый UUID и не объект обсуждения. Текст — настоящий Новый ФорматированнаяСтрока, Данные — небольшая собственная строка, MIME text/plain. В Получатели добавлен пустой ID со специальной семантикой Никого не оповещать, не все пользователи приложения.

  8. Черновик должен не иметь непредусмотренных вложений/действий/кнопок/шаблона/подстановок. После Записать первый реальный ID сохраняется и читается через собственный строковый roundtrip. Паспорт включает обсуждение, автора, точный текст, небольшие данные, MIME, отсутствие исходного ответа и ненулевую серверную дату; чужое содержимое не выводится.

  9. Вторая карточка с суммой750 создается в том же собственном обсуждении, а ИсходноеСообщение получает реальный ID первой. Fresh read подтверждает именно эту связь. ШаблонСообщения не устанавливается: шаблонный режим иначе игнорировал бы обычные Текст/Данные/Действия.

  10. ОтборСообщений ограничен собственным обсуждением, Количество=3 позволяет обнаружить лишнюю третью запись. Получено ровно два допустимых собственных ID; никаких чужих ID/текстов не печатается. После второго ID в Возр ожидается пустая страница.

  11. Перед обновлением заново проверяются обсуждение и свежая вторая карточка с исходным текстом/данными/автором. Только её Текст меняется на Проверка подтверждена:750 и Записать. Повторное ПолучитьСообщение подтверждает измененный текст при том же реальном ID/данных/ответе.

  12. Удаления и отката нет. Новый чат, два сообщения и настройки остаются учебными артефактами для вашей ручной проверки. При исключении программа не посылает карточки заново и не удаляет что-либо в catch; показанный ключ и полученные IDs служат только собственной ручной сверке частичного состояния.

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

  1. Без правильной фразы, при втором пользователе, внешних данных, неверном приложении/адресе, коллизии или неподготовленных правах Записать не должен выполняться до соответствующего guard.

  2. В собственном интерфейсе после положительного ручного опыта новый UUID-чат содержит карточку Книги и ответ с подтвержденной суммой750. Список участников — только ваш пользователь, подключенных внешних интеграций/контекстного объекта нет.

  3. Fresh read первого/второго IDs проверяет точные Текст, Данные, text/plain, автора и связь ответа. Строковое восстановление идентификаторов не является доказательством существования до этих real reads.

  4. Первый отбор обсуждений возвращает ровно один свой чат, отбор сообщений — ровно два своих ID, следующая страница после второго пуста. Лишняя третья карточка или посторонний ID должны остановить урок до изменения второй.

  5. У своего обсуждения РежимНаблюдения=false и ОтображениеОповещений=НеБеспокоить. Отсутствие визуального оповещения не используется как доказательство, что сообщения не записаны или не доставлены.

  6. Второй ID после изменения тот же, ИсходноеСообщение равно первому ID, Текст изменен и отдельно прочитан. После ошибки/потери ответа проверьте частичный результат вручную по своему ключу; автоматического повтора/удаления нет.

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

На отдельном своем сервере создан собственный UUID-чат, две реальные карточки с проверенной связью ответа и одна подтвержденная правка; отборы и собственные настройки оповещений проверены либо зафиксирован конкретный отказ. Никакой сетевой опыт здесь не выполнялся.

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

  1. Синхронные СоздатьОбсуждение/СоздатьСообщение/ПолучитьСообщения/Записать доступны на сервере, не в тонком клиентском обработчике. Асинхронные методы не имитируются синхронными; неоднозначная native-страница ПолучитьОбсуждениеАсинх здесь не используется.

  2. Идентификаторы обсуждения/сообщения конструктором по строке не валидируются. Ввод пользовательского произвольного ID не разрешен: только ID объектов, созданных этим опытом, и свежее подтверждение их паспорта.

  3. Ключ уникален в пределах базы с учетом независимых разделителей, а не глобально по всем серверам. UUID не гарантирует владение чужим сервером; требуется отдельная VM и вручную проверенная регистрация своего приложения.

  4. Групповое, ТолькоПросмотр, Ключ, КонтекстОбсуждения, Интеграция и ВнешнийИдентификатор могут назначаться только новому обсуждению. Заголовок на клиенте readonly. Участники/Получатели readonly как свойства, но методы их коллекций изменяют состав.

  5. Данные сериализуются сервером в JSON с ограничением100Кб и требованиями XDTO. Урок посылает маленькую строку со своей меткой; он не демонстрирует передачу ссылок базы/секретов/объектов с неподдерживаемой сериализацией. Серверную Дата и Автор код только читает, не подменяет.

  6. Пустой ID адресата означает Никого не оповещать; это не конкретный пользователь и не запрет серверной записи/чтения. РежимНеБеспокоить и РежимНаблюдения тоже не являются настройками безопасности или запретом доставки.

  7. Пагинация После задает относительное положение по серверной сортировке. Два сообщения иногда имеют одинаковую дату, поэтому урок не требует различия секунд или самодельной сортировки ID. Отказ пустой следующей страницы требует ручной сверки, не догадки об успехе.

  8. Проверка/обновление не атомарны, нет транзакционного отката внешнего сервера и автоматического удаления созданного чата. Не запускайте параллельных клиентов/ботов. При потере ответа запись могла выполниться; список/ключ/ID сверяйте вручную только на своем сервере.

  9. Права Администрирование данных на новом стенде заранее нужны для ТолькоПросмотр и получения списка пользователей; privilege не включается программой. Сервер/аккаунты/права/сообщения реально не создавались и сеть не вызывалась. RuntimeVerifiedScenarios=0.

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

Проверить свою учетную запись взаимодействия и сохранить учебный псевдоним

Реальный паспорт текущего внутреннего участника сверяется с UUID пользователя базы. Точный отбор и пустая следующая страница проверены до сохранения одного собственного псевдонима; никакие чужие контакты не выводятся.

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

Полный серверный общий модуль УчебноеВзаимодействие своей пустой конфигурации УчебноеВзаимодействие85, отдельная локальная VM/сервер взаимодействия. Не клиентский обработчик формы.

Подготовка

  1. Нужны только ваша изолированная VM, новая пустая база8.5.1.1343 и отдельный локальный сервер взаимодействия, не связанный с рабочими абонентами/серверами. Имя конфигурации УчебноеВзаимодействие85, русский язык, совместимость Не использовать, управляемый интерфейс. Пустоту предметных объектов, фоновых заданий, подписок и отсутствие расширений проверяет код. Реальные API здесь не выполнялись.

  2. Разверните собственный учебный сервер взаимодействия в той же VM с локальным адресом http://localhost:9094, без публичной публикации, SMTP, внешних интеграций, совместного использования приложений и чужих учетных записей. Его установку и настройку выполняйте вручную по документации своей серверной поставки. Эта программа не устанавливает сервер и не меняет маршрут localhost. Если фактически зарегистрированный адрес отличается, образец намеренно отказывает; не подставляйте рабочий адрес.

  3. В конфигураторе вручную создайте единственного пользователя с именем Уч85Связь_ и добавленным вашим новым ненулевым UUID в каноническом строковом формате; полное имя Учебный участник. Назначьте только в этом стенде необходимые права Администрирование данных/администрирование пользователей и системы взаимодействия. Войдите под ним. Учетные записи/права этим кодом не создаются и не расширяются.

  4. Вручную зарегистрируйте только эту пустую базу на своем отдельном сервере взаимодействия; наименование приложения задайте УчебноеВзаимодействие85. Синхронизируйте своего внутреннего пользователя базы: имя/полное имя совпадают, учетная запись не внешняя, не заблокирована, без почты/телефона/аутентификационной почты/ключа сопоставления. Для урока профиля псевдоним должен быть пустым. Не используйте персональные сведения, действительные адреса или контакты.

  5. Создайте серверный общий модуль УчебноеВзаимодействие с флагом Сервер, без флагов Клиент и Привилегированный. Вставьте полный код выбранного урока целиком, не одновременно оба варианта модуля. Все вызываемые внутренние функции включены. Нельзя вставлять серверные методы в клиентский модуль формы: thin/web для этих синхронных методов не объявлены в native-справке.

  6. Создайте свою внешнюю обработку с одной управляемой формой, командой Выполнить и строковым реквизитом Подтверждение длиной100. Обработчик команды клиента вызывает ВыполнитьНаСервере(); серверная процедура вызывает УчебноеВзаимодействие.ВыполнитьПример(Подтверждение). Эти две короткие процедуры даны отдельным поддерживающим модулем. Кнопка должна быть нажата сознательно только после чтения предупреждений; автоматического запуска при открытии нет.

  7. В VM оставьте только свой сеанс, не включайте ботов, обработчики сообщений, сторонние клиенты или задания, способные менять свои объекты параллельно. Защитные маркеры/ID уменьшают риск чужого доступа, но не являются криптографическим доказательством собственника сервера и не заменяют вашу проверку выделенного стенда. Профиль и сообщения — настоящие изменения на своем сервере при вашем ручном запуске.

  8. Сначала оставьте подтверждение пустым: программа должна остановиться до изменения профиля/создания обсуждения. Затем введите только фразу выбранного урока. После исключения никакие автоматические повторы/откаты/удаления не выполняются. Сохраните показанный собственный кандидат UUID-ключа/псевдонима и проверяйте возможный частичный результат вручную только в своем сервере. Новые резервные копии не создаются.

Процедура ВыполнитьПример(Подтверждение = "") Экспорт
    Пользователь = ПроверитьСвоегоПользователя85();
    Если Подтверждение <> "СВОЙ ПУСТОЙ СЕРВЕР И ПРОФИЛЬ" Тогда
        ВызватьИсключение "Сначала прочитайте подготовку. Профиль не изменен";
    КонецЕсли;
    Если Пользователь.Псевдоним <> "" Тогда
        ВызватьИсключение "Псевдоним уже занят. Урок не перезаписывает прежнее значение";
    КонецЕсли;
    Отбор = Новый ОтборПользователейСистемыВзаимодействия;
    Отбор.Имя = Пользователь.Имя;
    Отбор.ПолноеИмя = Пользователь.ПолноеИмя;
    Отбор.Внешний = Ложь;
    Отбор.Заблокирован = Ложь;
    Отбор.АдминистраторАбонента = Пользователь.АдминистраторАбонента;
    Отбор.АдресЭлектроннойПочты = "";
    Отбор.АдресЭлектроннойПочтыДляАутентификации = "";
    Отбор.НомерТелефона = "";
    Отбор.КлючСопоставления = "";
    Отбор.ТипВнешнейСистемы = "";
    Отбор.Количество = 2;
    Отбор.НаправлениеСортировки = НаправлениеСортировки.Возр;
    Отбор.После = Неопределено;
    Найденные = СистемаВзаимодействия.ПолучитьПользователей(Отбор);
    Если ТипЗнч(Найденные) <> Тип("Массив") Или Найденные.Количество() <> 1
        Или Найденные[0].Идентификатор <> Пользователь.Идентификатор Тогда
        ВызватьИсключение "Отбор собственного паспорта не вернул ровно свою учетную запись";
    КонецЕсли;
    Отбор.После = Пользователь.Идентификатор;
    Если СистемаВзаимодействия.ПолучитьПользователей(Отбор).Количество() <> 0 Тогда
        ВызватьИсключение "После последней своей строки остались результаты";
    КонецЕсли;
    Отбор.После = Неопределено;
    Отбор.Имя = "Уч85Несуществующий_" + Строка(Новый УникальныйИдентификатор);
    Если СистемаВзаимодействия.ПолучитьПользователей(Отбор).Количество() <> 0 Тогда
        ВызватьИсключение "Отрицательный точный отбор не пуст";
    КонецЕсли;
    Псевдоним = "Уч85Профиль_" + Строка(Новый УникальныйИдентификатор);
    Сообщить("Кандидат собственного изменения: " + Псевдоним);
    Пользователь.Псевдоним = Псевдоним;
    Пользователь.Записать();
    Факт = СистемаВзаимодействия.ПолучитьПользователя(Пользователь.Идентификатор);
    Если Факт.Псевдоним <> Псевдоним Тогда
        ВызватьИсключение "Запись могла произойти, но собственный псевдоним не подтвержден";
    КонецЕсли;
    Сообщить("Собственный псевдоним сохранен и отдельно прочитан. Это не смена имени в интерфейсе 1С");
КонецПроцедуры

Функция ПроверитьСвоегоПользователя85()
    ПроверитьСвойПустойСтенд();
    Если ПривилегированныйРежим() Тогда
        ВызватьИсключение "Входной привилегированный режим не допускается";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
        ВызватьИсключение "Нужен единственный собственный учебный пользователь";
    КонецЕсли;
    Если Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор
        Или Лев(Текущий.Имя, СтрДлина("Уч85Связь_")) <> "Уч85Связь_" Тогда
        ВызватьИсключение "Учебный пользователь не подтвержден";
    КонецЕсли;
    UUIDМетки = Новый УникальныйИдентификатор(Сред(Текущий.Имя, СтрДлина("Уч85Связь_") + 1));
    Если Текущий.Имя <> "Уч85Связь_" + Строка(UUIDМетки)
        Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        ВызватьИсключение "Имя должно содержать собственный канонический ненулевой UUID";
    КонецЕсли;
    Если Не СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована()
        Или Не СистемаВзаимодействия.ИспользованиеДоступно() Тогда
        ВызватьИсключение "Вручную подготовьте регистрацию собственной учебной базы";
    КонецЕсли;
    Если СистемаВзаимодействия.АдресСервера() <> "http://localhost:9094" Тогда
        ВызватьИсключение "Разрешен только отдельно подготовленный сервер localhost:9094 в своей VM";
    КонецЕсли;
    Версия = СистемаВзаимодействия.ВерсияСервера();
    Если ТипЗнч(Версия) <> Тип("Строка") Или Не ЗначениеЗаполнено(Версия) Тогда
        ВызватьИсключение "Версия своего сервера не получена";
    КонецЕсли;
    ИД = СистемаВзаимодействия.ИдентификаторТекущегоПользователя();
    Если ТипЗнч(ИД) <> Тип("ИдентификаторПользователяСистемыВзаимодействия") Тогда
        ВызватьИсключение "Не получен реальный идентификатор собственного участника";
    КонецЕсли;
    Если СистемаВзаимодействия.ПолучитьИдентификаторПользователя(Текущий.УникальныйИдентификатор) <> ИД
        Или СистемаВзаимодействия.ПолучитьИдентификаторПользователяИнформационнойБазы(ИД) <> Текущий.УникальныйИдентификатор Тогда
        ВызватьИсключение "Двустороннее соответствие своей учетной записи неверно";
    КонецЕсли;
    Пользователь = СистемаВзаимодействия.ПолучитьПользователя(ИД);
    Если Пользователь.Идентификатор <> ИД Или Пользователь.Имя <> Текущий.Имя
        Или Пользователь.ПолноеИмя <> Текущий.ПолноеИмя
        Или Пользователь.ИдентификаторПользователяИнформационнойБазы <> Текущий.УникальныйИдентификатор Тогда
        ВызватьИсключение "Паспорт своего пользователя не совпал с информационной базой";
    КонецЕсли;
    Если Пользователь.Внешний Или Пользователь.Заблокирован
        Или Пользователь.ТипВнешнейСистемы <> ""
        Или Пользователь.ИдентификаторПользователяВнешнейСистемы <> Неопределено
        Или Пользователь.АдресЭлектроннойПочты <> ""
        Или Пользователь.АдресЭлектроннойПочтыДляАутентификации <> ""
        Или Пользователь.НомерТелефона <> ""
        Или Пользователь.КлючСопоставления <> "" Тогда
        ВызватьИсключение "Нужен чистый внутренний пользователь без персональных контактов и объединений";
    КонецЕсли;
    Если Пользователь.АдминистраторАбонента <> СистемаВзаимодействия.ТекущийПользовательЯвляетсяАдминистраторомАбонента() Тогда
        ВызватьИсключение "Признак администратора абонента не согласован";
    КонецЕсли;
    ВсеПользователи = СистемаВзаимодействия.СтандартныеПользователи.ВсеПользователиПриложения;
    Если ИД = ВсеПользователи Или ИД = Новый ИдентификаторПользователяСистемыВзаимодействия Тогда
        ВызватьИсключение "Стандартный адресат и Никого не оповещать не являются своей учетной записью";
    КонецЕсли;
    ВосстановленныйИД = Новый ИдентификаторПользователяСистемыВзаимодействия(Строка(ИД));
    Если СистемаВзаимодействия.ПолучитьПользователя(ВосстановленныйИД).Идентификатор <> ИД Тогда
        ВызватьИсключение "Восстановленный из строки реальный ID не подтвержден сервером";
    КонецЕсли;
    Приложение = СистемаВзаимодействия.ПолучитьПриложение(СистемаВзаимодействия.ИдентификаторТекущегоПриложения());
    Если Приложение.Идентификатор <> СистемаВзаимодействия.ИдентификаторТекущегоПриложения()
        Или Приложение.Наименование <> "УчебноеВзаимодействие85" Тогда
        ВызватьИсключение "Нужно свое приложение с точным учебным наименованием";
    КонецЕсли;
    Возврат Пользователь;
КонецФункции

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

Своя внешняя обработка → основная управляемая форма → модуль формы

Полный клиентский обработчик команды и серверная процедура этой формы; общий модуль отдельно. Не вставляйте общий модуль внутрь обработчика.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьНаСервере()
    УчебноеВзаимодействие.ВыполнитьПример(Подтверждение);
КонецПроцедуры

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

  1. Пустой стенд, единственный пользователь, регистрация, точный локальный адрес и непустая версия проверяются отдельно. ИспользованиеДоступно проверяет регистрацию, а не доступность транспорта; успешный ответ от ВерсияСервера/других методов не обещает доступность дальнейших вызовов.

  2. Реальный ИдентификаторТекущегоПользователя сравнивается с прямым преобразованием UUID базы и обратным преобразованием. Если соответствие отсутствует/иной пользователь, опыт прекращается, его паспорт не выводится.

  3. ПолучитьПользователя возвращает живой собственный объект. Код проверяет имя, полное имя, UUID базы, внутренний/незаблокированный режим и пустые контакты/внешние привязки. Readonly Имя и ПолноеИмя читаются, не назначаются; псевдоним не является изменением этих свойств.

  4. СтандартныеПользователи.ВсеПользователиПриложения и пустой ИдентификаторПользователя — специальные адресаты, не конкретный участник. Они отсекаются. Конструктор по строке получает только Строка реального текущего ID, и результат отдельно подтверждается через ПолучитьПользователя.

  5. ИдентификаторТекущегоПриложения передается ПолучитьПриложение. Его readonly ID и Наименование связывают опыт с вручную подготовленным отдельным приложением, а не с любой базой на этом сервере.

  6. Создается реальный ОтборПользователейСистемыВзаимодействия. Имя и ПолноеИмя взяты из подтвержденного собственного паспорта, Внешний/Заблокирован=false и признак администратора совпадают с ним. Пустые контактные поля не объявляются фильтром только пустых значений: ограничение собственного UUID-имени и последующая проверка ID остаются обязательными.

  7. Количество=2 позволяет обнаружить неожиданную вторую запись, не читать все250. НаправлениеСортировки=Возр и После=Неопределено задают первую страницу. ПолучитьПользователей требует Администрирование данных либо привилегированный режим; урок использует заранее выданное право и не повышает привилегии.

  8. Сначала ожидается ровно один свой ID. Затем После устанавливается в этот полученный ID и проверяется пустая следующая страница. После сбрасывается, а UUID-имя меняется на новый заведомо учебный несуществующий маркер: результат должен быть пустым. Отбор не выполняет поиск по префиксу, строковые имена сопоставляются полностью без учета регистра.

  9. Только после проверок и подтверждения СВОЙ ПУСТОЙ СЕРВЕР И ПРОФИЛЬ пустой Псевдоним заменяется на новый собственный UUID-маркер. Кандидат выводится до Записать. Новый ПолучитьПользователя отдельно подтверждает точное значение; изменение лишь объекта в памяти не объявляется сохранением.

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

  1. В корректном стенде первая страница содержит только свой ID; следующий и отрицательный точный отборы пусты. Чужие ФИО/контакты/профили не выводятся.

  2. Без точного подтверждения или при занятом псевдониме вызов Записать отсутствует. Измените только в своем стенде регистрационный адрес/наименование приложения или добавьте второго пользователя: guard должен отказать.

  3. После единственного ручного успешного запуска свежий ПолучитьПользователя возвращает точно показанный UUID-псевдоним. Повторный запуск отказывает, а не перезаписывает его новым.

  4. При ошибке прав или потерянном ответе после Записать сохранение не доказано. Кандидат нужен для собственной ручной сверки, никакого автоматического повторения/возврата старого профиля нет.

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

Собственный внутренний пользователь и приложение подтверждены реальными идентификаторами; точный отбор/пагинация проверены и один собственный псевдоним отдельно прочитан после записи либо честно зафиксирован отказ.

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

  1. Псевдоним отображается во внешних системах интеграции и не используется в ОтборПользователей; в штатном интерфейсе клиентов1С имя этим уроком не меняется. Внешние интеграции здесь отсутствуют, поэтому видимость в них не проверена.

  2. Конструкторы идентификаторов по строке не проверяют реальность объекта. Своя исходная строка ID и успешное получение именно собственного паспорта обязательны; новый произвольный UUID не используется как серверный ID.

  3. Администратор абонента, право Администрирование данных и привилегированный режим — разные условия. Совпадение флага администратора не подменяет права. Отказ прав не обходится УстановитьПривилегированныйРежим.

  4. Пустая конфигурация и localhost сами по себе не доказывают, что сервер ваш. Нужна отдельная VM/отдельный сервер без рабочего абонента, объединений приложений или персональных данных. Не меняйте hardcoded guard на production.

  5. Нет транзакционного отката сервера взаимодействия, атомарного compare-and-swap и защиты от параллельных собственных клиентов. При неизвестном результате повторная запись не выполняется автоматически; сохраненный псевдоним остается учебным артефактом.

  6. Код не запускался в1С, сеть и профили не менялись. Проверены установленные сигнатуры8.5.1.1343, readonly, серверный контекст и статические пути. RuntimeVerifiedScenarios=0.

  7. В установленной справке8.5 страница конструктора отсутствует у ОтборПользователейСистемыВзаимодействия, хотя тип/свойства и метод ПолучитьПользователей документированы. Безаргументный Новый подтверждается сохраненным исходником УНФ source-fb69813a25e0760459e1, но не считается подтвержденной native-сигнатурой и не проверялся запуском. Общий strict constructor-checker показывает ровно этот известный пробел; остальные конструкторы урока подтверждены установленными страницами.

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

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

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

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

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