Создаем только собственную учебную запись без способов входа, пароля и ролей. По выданному платформой UUID заново читаем все 13 выбранных значений; удаление — отдельная явная команда.
Где и как запускать
Новая собственная Windows VM, пустая File CF и толстый управляемый клиент 8.5.1.1343. Реальные создание/удаление предусмотрены только для будущего ручного опыта; сейчас runtime операций нет.
Подготовка
Это два независимых самостоятельных модуля формы. Для выбранной карточки подготовьте НОВУЮ целиком собственную Windows VM, новый профиль и новую пустую файловую базу, а не рабочую конфигурацию или копию с пользователями. Здесь 1С, VM и изменения базы не запускались.
Будущая ручная база находится в C:\1c-labs\OwnNoLoginUser85_5d80d6bf-0ba3-4b39-b479-556e626b6bc0\IB. Если каталог, база или регистрация уже существуют, их не используйте и не очищайте. Строка регистрации строго File="C:\1c-labs\OwnNoLoginUser85_5d80d6bf-0ba3-4b39-b479-556e626b6bc0\IB";. Это ограничение подготовки, не доказательство владения базой.
Конфигуратор: Имя=УчебнаяЗаписьПользователя85, Версия=5d80d6bf-0ba3-4b39-b479-556e626b6bc0, Режим совместимости=Не использовать, Основной режим запуска=Управляемое приложение. Запуск только толстым управляемым клиентом 8.5.1.1343.
Общие → Роли: создайте АдминистраторУчебныхЗаписей85, через Действия установите все права, включая Администрирование. Не устанавливайте основные роли конфигурации и автоматическое назначение ролей новым пользователям. Код не выдает права и не очищает роли.
Администрирование → Пользователи: вручную создайте СВОЕГО учебного администратора OwnAdministration85Admin, назначьте ему эту роль и выберите личный пароль вне примера. Войдите под ним. Пустой список пользователей не подходит; имя и настоящий идентификатор администратора проверяются, но его пароль не читается.
Общие → Общие формы: создайте управляемую УчебнаяЗапись85, разместите в рабочей области начальной страницы. Вставьте весь код выбранной карточки в её модуль. Не объединяйте две карточки и не вызывайте обработчики вручную.
Две команды формы: СоздатьИПроверитьЗапись85 и УдалитьСвоюЗапись85. Для каждой назначьте Действие одноимённой процедуре с параметром Команда и создайте кнопку с соответствующим ИмяКоманды.
Реквизиты формы: СогласенНаСозданиеЗаписи85 и СогласенНаУдалениеЗаписи85 — Булево, исходно Ложь, два ручных флажка. Состояние85 — Строка, исходно Не запускалось, поле ТолькоПросмотр=Да. Внутренние имя, снимок и идентификатор не делайте редактируемыми реквизитами.
Один спокойный собственный сеанс, без других писателей. Урок действительно создаёт запись в своей базе; она остаётся до отдельной команды удаления. Проверки имени и снимка не атомарное резервирование или блокировка.
Поставьте только флажок создания и нажмите соответствующую кнопку один раз. Согласие расходуется ДО менеджеров, проверки администратора и чтения записей. После подтверждённого создания решите отдельно, нужно ли удаление; новое согласие обязательно.
Новая запись получает вымышленное имя OwnNoLogin85_ с собственной случайной меткой и учебное полное имя. Все семь флагов входа явно устанавливаются в Ложь. Не назначаются пароль, хранимый пароль, роли или политика; под этой записью не выполняют вход.
У настоящего нового описания UUID должен быть нулевым. После записи UUID назначает сама платформа: именно он сохраняется и передаётся поиску. Случайная метка в имени — НЕ идентификатор пользователя.
Проверяются имя, полное имя, настоящий UUID, пустое имя политики, ПарольУстановлен=Ложь, семь флагов входа и фактическое число назначенных ролей. Для ролей используется документированный обход, а не выдуманный метод Количество(). Это 13 значений данного опыта, не все свойства пользователя.
&НаКлиенте
Перем Фаза85, СобственноеИмя85, ОжидаемыйСнимок85, Идентификатор85, АдминистраторИД85;
&НаКлиенте
Функция МенеджерКоманды85(Команда, Удаление85)
Если Удаление85 Тогда
Если Фаза85 <> "ПОДТВЕРЖДЕНО" Тогда
ВызватьИсключение "Удаление разрешено только после подтвержденного создания в этой форме";
КонецЕсли;
ИмяКоманды85 = "УдалитьСвоюЗапись85";
Согласие85 = СогласенНаУдалениеЗаписи85;
Иначе
Если Фаза85 <> Неопределено Тогда
ВызватьИсключение "Повтор этого опыта в той же форме запрещен";
КонецЕсли;
ИмяКоманды85 = "СоздатьИПроверитьЗапись85";
Согласие85 = СогласенНаСозданиеЗаписи85;
КонецЕсли;
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnNoLoginUser85_5d80d6bf-0ba3-4b39-b479-556e626b6bc0\IB"";" Тогда
ВызватьИсключение "Нужны точно подготовленные собственная новая база и толстый клиент 8.5.1.1343";
КонецЕсли;
Если ТипЗнч(Команда) <> Тип("КомандаФормы")
Или Команда <> Команды.Найти(ИмяКоманды85)
Или ТипЗнч(Согласие85) <> Тип("Булево") Или Согласие85 <> Истина Тогда
ВызватьИсключение "Нажмите настоящую команду после отдельного ручного согласия";
КонецЕсли;
Если Удаление85 Тогда
СогласенНаУдалениеЗаписи85 = Ложь;
Иначе
СогласенНаСозданиеЗаписи85 = Ложь;
КонецЕсли;
Фаза85 = "НЕИЗВЕСТНО";
Состояние85 = "НЕИЗВЕСТНО: действие еще не подтверждено";
Доступ85 = РольДоступна("АдминистраторУчебныхЗаписей85");
Если ТипЗнч(Доступ85) <> Тип("Булево") Или Доступ85 <> Истина Тогда
ВызватьИсключение "Вручную подготовьте свою роль с административными правами";
КонецЕсли;
Пользователи85 = ПользователиИнформационнойБазы;
Если ТипЗнч(Пользователи85) <> Тип("МенеджерПользователейИнформационнойБазы") Тогда
ВызватьИсключение "Не получен настоящий менеджер пользователей";
КонецЕсли;
Администратор85 = Пользователи85.ТекущийПользователь();
Если ТипЗнч(Администратор85) <> Тип("ПользовательИнформационнойБазы")
Или Администратор85.Имя <> "OwnAdministration85Admin"
Или ТипЗнч(Администратор85.УникальныйИдентификатор) <> Тип("УникальныйИдентификатор")
Или Администратор85.УникальныйИдентификатор = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
ВызватьИсключение "Нужен собственный вручную созданный администратор этого сеанса";
КонецЕсли;
АдминистраторИД85 = Администратор85.УникальныйИдентификатор;
Возврат Пользователи85;
#Иначе
ВызватьИсключение "Этот опыт предназначен только для толстого управляемого клиента";
#КонецЕсли
КонецФункции
&НаКлиенте
Процедура ДобавитьПоле85(Снимок85, Имя85, Значение85, ТребуемыйТип85)
Если ТипЗнч(Значение85) <> ТребуемыйТип85 Или Снимок85.Свойство(Имя85) Тогда
ВызватьИсключение "Неверный тип или повтор поля учебного снимка";
КонецЕсли;
Снимок85.Вставить(Имя85, Значение85);
КонецПроцедуры
&НаКлиенте
Процедура СверитьСнимки85(Текущий85, Ожидаемый85)
Если ТипЗнч(Текущий85) <> Тип("Структура") Или ТипЗнч(Ожидаемый85) <> Тип("Структура")
Или Текущий85.Количество() <> Ожидаемый85.Количество() Тогда
ВызватьИсключение "Изменился полный состав учебного снимка";
КонецЕсли;
Для Каждого Поле85 Из Текущий85 Цикл
Если Не Ожидаемый85.Свойство(Поле85.Ключ, ОжидаемоеЗначение85)
Или ТипЗнч(Поле85.Значение) <> ТипЗнч(ОжидаемоеЗначение85)
Или Поле85.Значение <> ОжидаемоеЗначение85 Тогда
ВызватьИсключение "Не совпало фактическое значение учебного снимка";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьИПроверитьЗапись85(Команда)
Попытка
Менеджер85 = МенеджерКоманды85(Команда, Ложь);
СобственноеИмя85 = "OwnNoLogin85_" + Строка(Новый УникальныйИдентификатор);
Если Менеджер85.НайтиПоИмени(СобственноеИмя85) <> Неопределено Тогда
ВызватьИсключение "Совпало имя; найденная запись не используется";
КонецЕсли;
Пользователь85 = Менеджер85.СоздатьПользователя();
Если ТипЗнч(Пользователь85) <> Тип("ПользовательИнформационнойБазы")
Или Пользователь85.УникальныйИдентификатор <> Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
ВызватьИсключение "Не получено новое описание пользователя";
КонецЕсли;
Пользователь85.Имя = СобственноеИмя85;
Пользователь85.ПолноеИмя = "Учебная запись без входа: " + СобственноеИмя85;
Пользователь85.АутентификацияOpenID = Ложь;
Пользователь85.АутентификацияOpenIDConnect = Ложь;
Пользователь85.АутентификацияQRКодом = Ложь;
Пользователь85.АутентификацияОС = Ложь;
Пользователь85.АутентификацияСтандартная = Ложь;
Пользователь85.АутентификацияТокеномДоступа = Ложь;
Пользователь85.АутентификацияЧерезЭлектроннуюПочту = Ложь;
ОжидаемыйСнимок85 = СнимокПользователя85(Пользователь85);
Фаза85 = "НЕИЗВЕСТНО";
Состояние85 = "НЕИЗВЕСТНО: запись пользователя еще не подтверждена";
Пользователь85.Записать();
Идентификатор85 = Пользователь85.УникальныйИдентификатор;
Если ТипЗнч(Идентификатор85) <> Тип("УникальныйИдентификатор")
Или Идентификатор85 = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")
Или Идентификатор85 = АдминистраторИД85 Тогда
ВызватьИсключение "Платформа не вернула допустимый собственный идентификатор";
КонецЕсли;
ОжидаемыйСнимок85.УникальныйИдентификатор = Идентификатор85;
Прочитанный85 = Менеджер85.НайтиПоУникальномуИдентификатору(Идентификатор85);
ФактическийСнимок85 = СнимокПользователя85(Прочитанный85);
СверитьСнимки85(ФактическийСнимок85, ОжидаемыйСнимок85);
Фаза85 = "ПОДТВЕРЖДЕНО";
Состояние85 = "Проверено: " + ФактическийСнимок85.Имя
+ "; UUID " + Строка(ФактическийСнимок85.УникальныйИдентификатор)
+ "; ролей " + Строка(ФактическийСнимок85.КоличествоНазначенныхРолей85)
+ "; пароль установлен: " + Строка(ФактическийСнимок85.ПарольУстановлен);
Исключение
Фаза85 = "STOP";
СогласенНаСозданиеЗаписи85 = Ложь;
Состояние85 = "STOP: исход не подтвержден; автоматического удаления и повторов нет";
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура УдалитьСвоюЗапись85(Команда)
Попытка
Менеджер85 = МенеджерКоманды85(Команда, Истина);
Если ТипЗнч(Идентификатор85) <> Тип("УникальныйИдентификатор")
Или Идентификатор85 = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")
Или Идентификатор85 = АдминистраторИД85 Тогда
ВызватьИсключение "Удалять текущего администратора или неизвестную запись нельзя";
КонецЕсли;
Прочитанный85 = Менеджер85.НайтиПоУникальномуИдентификатору(Идентификатор85);
ФактическийСнимок85 = СнимокПользователя85(Прочитанный85);
СверитьСнимки85(ФактическийСнимок85, ОжидаемыйСнимок85);
Фаза85 = "НЕИЗВЕСТНО";
Состояние85 = "НЕИЗВЕСТНО: удаление пользователя еще не подтверждено";
Прочитанный85.Удалить();
Найденный85 = Менеджер85.НайтиПоУникальномуИдентификатору(Идентификатор85);
Если Найденный85 <> Неопределено Тогда
ВызватьИсключение "Отсутствие собственной записи не подтверждено";
КонецЕсли;
Фаза85 = "УДАЛЕНО";
Состояние85 = "Удаление проверено: " + СобственноеИмя85
+ "; точный поиск вернул Неопределено: " + Строка(Найденный85 = Неопределено);
Исключение
Фаза85 = "STOP";
СогласенНаУдалениеЗаписи85 = Ложь;
Состояние85 = "STOP: исход не подтвержден; автоматического удаления и повторов нет";
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция СнимокПользователя85(Пользователь85)
Если ТипЗнч(Пользователь85) <> Тип("ПользовательИнформационнойБазы") Тогда
ВызватьИсключение "Точный поиск не вернул ожидаемый настоящий объект";
КонецЕсли;
Снимок85 = Новый Структура;
ДобавитьПоле85(Снимок85, "Имя", Пользователь85.Имя, Тип("Строка"));
ДобавитьПоле85(Снимок85, "ПолноеИмя", Пользователь85.ПолноеИмя, Тип("Строка"));
ДобавитьПоле85(Снимок85, "УникальныйИдентификатор", Пользователь85.УникальныйИдентификатор, Тип("УникальныйИдентификатор"));
ДобавитьПоле85(Снимок85, "ИмяПолитикиПаролей", Пользователь85.ИмяПолитикиПаролей, Тип("Строка"));
ДобавитьПоле85(Снимок85, "ПарольУстановлен", Пользователь85.ПарольУстановлен, Тип("Булево"));
ДобавитьПоле85(Снимок85, "АутентификацияOpenID", Пользователь85.АутентификацияOpenID, Тип("Булево"));
ДобавитьПоле85(Снимок85, "АутентификацияOpenIDConnect", Пользователь85.АутентификацияOpenIDConnect, Тип("Булево"));
ДобавитьПоле85(Снимок85, "АутентификацияQRКодом", Пользователь85.АутентификацияQRКодом, Тип("Булево"));
ДобавитьПоле85(Снимок85, "АутентификацияОС", Пользователь85.АутентификацияОС, Тип("Булево"));
ДобавитьПоле85(Снимок85, "АутентификацияСтандартная", Пользователь85.АутентификацияСтандартная, Тип("Булево"));
ДобавитьПоле85(Снимок85, "АутентификацияТокеномДоступа", Пользователь85.АутентификацияТокеномДоступа, Тип("Булево"));
ДобавитьПоле85(Снимок85, "АутентификацияЧерезЭлектроннуюПочту", Пользователь85.АутентификацияЧерезЭлектроннуюПочту, Тип("Булево"));
Роли85 = Пользователь85.Роли;
Если ТипЗнч(Роли85) <> Тип("РолиПользователя") Тогда
ВызватьИсключение "Не получена настоящая коллекция ролей";
КонецЕсли;
КоличествоРолей85 = 0;
Для Каждого НазначеннаяРоль85 Из Роли85 Цикл
Если НазначеннаяРоль85 = Неопределено Тогда
ВызватьИсключение "Неверный элемент настоящей коллекции ролей";
КонецЕсли;
КоличествоРолей85 = КоличествоРолей85 + 1;
КонецЦикла;
ДобавитьПоле85(Снимок85, "КоличествоНазначенныхРолей85", КоличествоРолей85, Тип("Число"));
Если Снимок85.ПарольУстановлен <> Ложь Или Снимок85.ИмяПолитикиПаролей <> ""
Или Снимок85.КоличествоНазначенныхРолей85 <> 0
Или Снимок85.АутентификацияOpenID <> Ложь
Или Снимок85.АутентификацияOpenIDConnect <> Ложь
Или Снимок85.АутентификацияQRКодом <> Ложь
Или Снимок85.АутентификацияОС <> Ложь
Или Снимок85.АутентификацияСтандартная <> Ложь
Или Снимок85.АутентификацияТокеномДоступа <> Ложь
Или Снимок85.АутентификацияЧерезЭлектроннуюПочту <> Ложь
Тогда
ВызватьИсключение "Учебная запись должна быть без входа, пароля, назначенной политики и ролей";
КонецЕсли;
Если Снимок85.Количество() <> 13 Тогда
ВызватьИсключение "Неполный учебный снимок";
КонецЕсли;
Возврат Снимок85;
КонецФункции
Разбор по шагам
Нажмите СоздатьИПроверитьЗапись85 после своего согласия. Код подтверждает подготовку, получает настоящего менеджера и проверяет собственного администратора.
Точный поиск нового имени обязан вернуть Неопределено. Совпадение имени останавливает опыт без чтения и изменения найденной записи.
СоздатьПользователя возвращает настоящее описание. После заполнения собственных полей полностью проверяется учебный снимок; непустые роли, установленный пароль или назначенная политика означают STOP до записи.
Перед Записать состояние становится НЕИЗВЕСТНО. После записи берётся настоящий ненулевой UUID, отличный от UUID администратора; новый поиск по нему должен вернуть пользователя с полностью совпавшими 13 значениями.
Состояние85 показывает собственные фактически прочитанные имя, UUID, число ролей и флаг наличия пароля. Успех разрешает отдельное удаление, но сам его не выполняет.
Если решили удалить, поставьте СогласенНаУдалениеЗаписи85 и нажмите УдалитьСвоюЗапись85. Перед удалением запись заново ищется по тому же UUID и полностью сравнивается с подтверждённым снимком. Удаляется только этот новый прочитанный объект.
После удаления ещё один точный поиск по тому же UUID должен вернуть Неопределено. Только тогда появляется Удаление проверено; отсутствие исключения у метода Удалить само по себе не считается результатом.
Как проверить результат
Без флажка создания: STOP до менеджера/проверки администратора и до записи; Проверено не появляется. В том же экземпляре повтор запрещён.
Будущий нормальный запуск: фактически прочитанные имя и UUID показаны, число назначенных ролей 0, ПарольУстановлен=Ложь, семь флагов Ложь, имя политики пустое. В отладчике ФактическийСнимок85 имеет все 13 значений.
UUID в снимке после записи не нулевой и не равен UUID администратора. Случайный UUID собственной метки не подставляйте вместо выданного платформой идентификатора.
До явной команды удаления запись остаётся в этой новой учебной базе. Нажатие удаления без отдельного флажка не вызывает Удалить.
Будущее подтверждённое удаление: точный поиск возвращает Неопределено и статус Удаление проверено. Если отсутствует разрешение администратора, возникает ошибка или снимок изменён, требуется STOP без повтора/очистки.
Не назначайте чужие роли, пароль, политику или существующего пользователя ради отрицательной пробы. Непустые роли/пароль и совпадение имени должны останавливать опыт, но непроверенные реальные ошибки честно отмечайте как непроверенные.
Ожидаемый результат
Будущий успешный ручной запуск должен прочитать созданную собственную запись по её настоящему UUID и подтвердить все 13 выбранных значений. Отдельное подтверждённое удаление должно новым точным поиском установить отсутствие этой записи на момент проверки. Вход под ней не выполняется; сейчас запуск в 1С не проверялся.
На что обратить внимание
Создание и удаление действительно меняют свою лабораторную базу. Ошибка после Записать или Удалить может означать частичный результат: STOP остаётся у этого экземпляра, без повтора, автоматической очистки и отката.
Удаление — отдельное решение человека, не завершение создания. Оно разрешено только после подтверждённого создания, нового согласия и полного свежего сравнения собственного объекта.
ТекущийПользователь возвращает состояние начала сеанса и нужен только для проверки своего администратора. Это НЕ повторное чтение созданной записи; для результата используются новые точные поиски.
Нет перечисления списка пользователей/политик, доступа к чужим паролям, привилегированного режима, назначений ролей или попыток входа. Состояние API не даёт гарантии всех внутренних действий платформы.
Проверки пути, роли и метки CF предотвращают ошибки подготовки, но не доказывают владение базой или атомарную защиту от других писателей. Один собственный спокойный сеанс обязателен.
STOP данного экземпляра сохраняется. Новый опыт возможен лишь после явной ручной подготовки другой новой собственной формы/лаборатории; открытие формы не является автоматическим восстановлением частичного результата.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.