Записывает нового пользователя или сохраняет изменения для существующего. Запись нового возможна только в привилегированном режиме.
Синтаксис
Записать()Полное описание, параметры и ограничения
ПользовательСистемыВзаимодействия.Записать (CollaborationSystemUser.Write)
ПользовательСистемыВзаимодействия (CollaborationSystemUser)
Записать (Write)
Доступен, начиная с версии 8.3.10.
Синтаксис:
Записать()
Описание:
Записывает нового пользователя или сохраняет изменения для существующего.
Запись нового возможна только в привилегированном режиме.
Доступность:
Мобильный клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.10.
Методическая информация
Практические примеры
Проверить свою учетную запись взаимодействия и сохранить учебный псевдоним
Реальный паспорт текущего внутреннего участника сверяется с UUID пользователя базы. Точный отбор и пустая следующая страница проверены до сохранения одного собственного псевдонима; никакие чужие контакты не выводятся.
Где и как запускать
Полный серверный общий модуль УчебноеВзаимодействие своей пустой конфигурации УчебноеВзаимодействие85, отдельная локальная VM/сервер взаимодействия. Не клиентский обработчик формы.
Подготовка
Нужны только ваша изолированная VM, новая пустая база8.5.1.1343 и отдельный локальный сервер взаимодействия, не связанный с рабочими абонентами/серверами. Имя конфигурации УчебноеВзаимодействие85, русский язык, совместимость Не использовать, управляемый интерфейс. Пустоту предметных объектов, фоновых заданий, подписок и отсутствие расширений проверяет код. Реальные API здесь не выполнялись.
Разверните собственный учебный сервер взаимодействия в той же VM с локальным адресом http://localhost:9094, без публичной публикации, SMTP, внешних интеграций, совместного использования приложений и чужих учетных записей. Его установку и настройку выполняйте вручную по документации своей серверной поставки. Эта программа не устанавливает сервер и не меняет маршрут localhost. Если фактически зарегистрированный адрес отличается, образец намеренно отказывает; не подставляйте рабочий адрес.
В конфигураторе вручную создайте единственного пользователя с именем Уч85Связь_ и добавленным вашим новым ненулевым UUID в каноническом строковом формате; полное имя Учебный участник. Назначьте только в этом стенде необходимые права Администрирование данных/администрирование пользователей и системы взаимодействия. Войдите под ним. Учетные записи/права этим кодом не создаются и не расширяются.
Вручную зарегистрируйте только эту пустую базу на своем отдельном сервере взаимодействия; наименование приложения задайте УчебноеВзаимодействие85. Синхронизируйте своего внутреннего пользователя базы: имя/полное имя совпадают, учетная запись не внешняя, не заблокирована, без почты/телефона/аутентификационной почты/ключа сопоставления. Для урока профиля псевдоним должен быть пустым. Не используйте персональные сведения, действительные адреса или контакты.
Создайте серверный общий модуль УчебноеВзаимодействие с флагом Сервер, без флагов Клиент и Привилегированный. Вставьте полный код выбранного урока целиком, не одновременно оба варианта модуля. Все вызываемые внутренние функции включены. Нельзя вставлять серверные методы в клиентский модуль формы: thin/web для этих синхронных методов не объявлены в native-справке.
Создайте свою внешнюю обработку с одной управляемой формой, командой Выполнить и строковым реквизитом Подтверждение длиной100. Обработчик команды клиента вызывает ВыполнитьНаСервере(); серверная процедура вызывает УчебноеВзаимодействие.ВыполнитьПример(Подтверждение). Эти две короткие процедуры даны отдельным поддерживающим модулем. Кнопка должна быть нажата сознательно только после чтения предупреждений; автоматического запуска при открытии нет.
В VM оставьте только свой сеанс, не включайте ботов, обработчики сообщений, сторонние клиенты или задания, способные менять свои объекты параллельно. Защитные маркеры/ID уменьшают риск чужого доступа, но не являются криптографическим доказательством собственника сервера и не заменяют вашу проверку выделенного стенда. Профиль и сообщения — настоящие изменения на своем сервере при вашем ручном запуске.
Сначала оставьте подтверждение пустым: программа должна остановиться до изменения профиля/создания обсуждения. Затем введите только фразу выбранного урока. После исключения никакие автоматические повторы/откаты/удаления не выполняются. Сохраните показанный собственный кандидат 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 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыМодуль своей управляемой формы: команда и серверный вызов
Своя внешняя обработка → основная управляемая форма → модуль формы
Полный клиентский обработчик команды и серверная процедура этой формы; общий модуль отдельно. Не вставляйте общий модуль внутрь обработчика.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
УчебноеВзаимодействие.ВыполнитьПример(Подтверждение);
КонецПроцедурыРазбор по шагам
Пустой стенд, единственный пользователь, регистрация, точный локальный адрес и непустая версия проверяются отдельно. ИспользованиеДоступно проверяет регистрацию, а не доступность транспорта; успешный ответ от ВерсияСервера/других методов не обещает доступность дальнейших вызовов.
Реальный ИдентификаторТекущегоПользователя сравнивается с прямым преобразованием UUID базы и обратным преобразованием. Если соответствие отсутствует/иной пользователь, опыт прекращается, его паспорт не выводится.
ПолучитьПользователя возвращает живой собственный объект. Код проверяет имя, полное имя, UUID базы, внутренний/незаблокированный режим и пустые контакты/внешние привязки. Readonly Имя и ПолноеИмя читаются, не назначаются; псевдоним не является изменением этих свойств.
СтандартныеПользователи.ВсеПользователиПриложения и пустой ИдентификаторПользователя — специальные адресаты, не конкретный участник. Они отсекаются. Конструктор по строке получает только Строка реального текущего ID, и результат отдельно подтверждается через ПолучитьПользователя.
ИдентификаторТекущегоПриложения передается ПолучитьПриложение. Его readonly ID и Наименование связывают опыт с вручную подготовленным отдельным приложением, а не с любой базой на этом сервере.
Создается реальный ОтборПользователейСистемыВзаимодействия. Имя и ПолноеИмя взяты из подтвержденного собственного паспорта, Внешний/Заблокирован=false и признак администратора совпадают с ним. Пустые контактные поля не объявляются фильтром только пустых значений: ограничение собственного UUID-имени и последующая проверка ID остаются обязательными.
Количество=2 позволяет обнаружить неожиданную вторую запись, не читать все250. НаправлениеСортировки=Возр и После=Неопределено задают первую страницу. ПолучитьПользователей требует Администрирование данных либо привилегированный режим; урок использует заранее выданное право и не повышает привилегии.
Сначала ожидается ровно один свой ID. Затем После устанавливается в этот полученный ID и проверяется пустая следующая страница. После сбрасывается, а UUID-имя меняется на новый заведомо учебный несуществующий маркер: результат должен быть пустым. Отбор не выполняет поиск по префиксу, строковые имена сопоставляются полностью без учета регистра.
Только после проверок и подтверждения СВОЙ ПУСТОЙ СЕРВЕР И ПРОФИЛЬ пустой Псевдоним заменяется на новый собственный UUID-маркер. Кандидат выводится до Записать. Новый ПолучитьПользователя отдельно подтверждает точное значение; изменение лишь объекта в памяти не объявляется сохранением.
Как проверить результат
В корректном стенде первая страница содержит только свой ID; следующий и отрицательный точный отборы пусты. Чужие ФИО/контакты/профили не выводятся.
Без точного подтверждения или при занятом псевдониме вызов Записать отсутствует. Измените только в своем стенде регистрационный адрес/наименование приложения или добавьте второго пользователя: guard должен отказать.
После единственного ручного успешного запуска свежий ПолучитьПользователя возвращает точно показанный UUID-псевдоним. Повторный запуск отказывает, а не перезаписывает его новым.
При ошибке прав или потерянном ответе после Записать сохранение не доказано. Кандидат нужен для собственной ручной сверки, никакого автоматического повторения/возврата старого профиля нет.
Ожидаемый результат
Собственный внутренний пользователь и приложение подтверждены реальными идентификаторами; точный отбор/пагинация проверены и один собственный псевдоним отдельно прочитан после записи либо честно зафиксирован отказ.
На что обратить внимание
Псевдоним отображается во внешних системах интеграции и не используется в ОтборПользователей; в штатном интерфейсе клиентов1С имя этим уроком не меняется. Внешние интеграции здесь отсутствуют, поэтому видимость в них не проверена.
Конструкторы идентификаторов по строке не проверяют реальность объекта. Своя исходная строка ID и успешное получение именно собственного паспорта обязательны; новый произвольный UUID не используется как серверный ID.
Администратор абонента, право Администрирование данных и привилегированный режим — разные условия. Совпадение флага администратора не подменяет права. Отказ прав не обходится УстановитьПривилегированныйРежим.
Пустая конфигурация и localhost сами по себе не доказывают, что сервер ваш. Нужна отдельная VM/отдельный сервер без рабочего абонента, объединений приложений или персональных данных. Не меняйте hardcoded guard на production.
Нет транзакционного отката сервера взаимодействия, атомарного compare-and-swap и защиты от параллельных собственных клиентов. При неизвестном результате повторная запись не выполняется автоматически; сохраненный псевдоним остается учебным артефактом.
Код не запускался в1С, сеть и профили не менялись. Проверены установленные сигнатуры8.5.1.1343, readonly, серверный контекст и статические пути. RuntimeVerifiedScenarios=0.
В установленной справке8.5 страница конструктора отсутствует у ОтборПользователейСистемыВзаимодействия, хотя тип/свойства и метод ПолучитьПользователей документированы. Безаргументный Новый подтверждается сохраненным исходником УНФ source-fb69813a25e0760459e1, но не считается подтвержденной native-сигнатурой и не проверялся запуском. Общий strict constructor-checker показывает ровно этот известный пробел; остальные конструкторы урока подтверждены установленными страницами.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.