АдминистрированиеКластер.ИдентификаторКластера

Свойства · ClusterID

Тип: УникальныйИдентификатор. Содержит уникальный идентификатор кластера.

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

АдминистрированиеКластер.ИдентификаторКластера (AdministrationCluster.ClusterID)

АдминистрированиеКластер (AdministrationCluster)

ИдентификаторКластера (ClusterID)

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

Использование:
Только чтение.
Описание:
Тип: УникальныйИдентификатор.
Содержит уникальный идентификатор кластера.
Доступность:

Тонкий клиент, сервер, толстый клиент, интеграция.

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

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

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

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

Сохранить реальный шаблон команды в черновике разрешения приложения

Копируем уже подготовленный собственный шаблон без самодельного экранирования, расширения маски или запуска внешнего приложения.

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

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

Подготовка

  1. Нужен отдельный собственный серверный стенд 1С 8.5.1.1343 без рабочих баз. Администратор должен заранее установить сервер, запустить совместимый ras и создать кластер с точным именем УчебныйКластер85. Код ничего не устанавливает и не регистрирует.

  2. Запускайте обработку в собственной пустой учебной конфигурации с именем метаданных УчебнаяКонфигурацияСинтаксиса. Серверное выполнение должно находиться на той же машине, что собственный ras: код разрешает только 127.0.0.1. Это адрес сервера выполнения, не обязательно компьютера тонкого клиента.

  3. ПортRAS возьмите из фактического запуска своего ras, не из порта ragent или рабочего процесса. Например, 1545 подходит только если именно этот порт настроен на вашем стенде. Используйте законные учётные данные своего агента и своего кластера; пустые допустимы только для намеренно настроенного учебного стенда без соответствующих администраторов.

  4. В первый раз оставьте ИдентификаторКластера пустым: появится JSON только с кластерами УчебныйКластер85. Скопируйте настоящий UUID из результата, вновь введите очищенные пароли и повторите команду. Кластер выбирается одновременно по UUID и точному учебному имени; чужой кластер не принимается.

  5. Выполняйте каждый урок отдельно. JSON формируется в памяти и показывается только на своей форме; код не сохраняет файлы, не пишет настройки кластера, не прерывает сеансы и не запускает команды ОС. Он выполняет сетевое обращение к своему локальному ras только если вы сами запустите его на подготовленном стенде.

  6. Здесь подключение к ras и запуск в 1С не выполнялись. Проверены тексты, сигнатуры и привязки к локальной справке 8.5.1.1343. Пройдите контрольные действия сами только на своём учебном стенде.

  7. Штатными средствами заранее зарегистрируйте в своём УчебныйКластер85 только собственную УчебнаяБаза85 с этой учебной конфигурацией. Код не создаёт базу, СУБД, пользователя, профиль или разрешение.

  8. В управляемой форме обработки создайте ПортRAS — Число без дробной части; ИмяАгента, ПарольАгента, ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера, ИдентификаторУчебнойБазы, ИмяАдминистратораБазы, ПарольАдминистратораБазы, JSONРезультат — Строка. У JSONРезультат длина 0.

  9. Выведите реквизиты на форму. Для всех трёх полей паролей включите Режим пароля, не сохраняйте их в истории и настройках; JSONРезультат — многострочное поле просмотра. Создайте команду ПолучитьУчебныйСнимок и вставьте весь приведённый модуль формы.

  10. Первый запуск с пустым UUID кластера возвращает только каталог УчебныйКластер85. Второй с настоящим UUID кластера и пустым UUID базы — только каталог УчебнаяБаза85. Третий — с обоими подтверждёнными UUID и законными учётными данными пользователя-администратора своей базы.

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

  12. Для текущего урока разрешений заранее штатными средствами своего стенда создайте и назначьте УчебнаяБаза85 обычный профиль УчебныйПрофиль85. Возможность работы с профилями должна быть доступна на вашем лицензированном стенде; код не обходит её ограничения.

  13. Списки разрешений, роли и модули проверяются только как настройки. COM, внешние приложения, файлы, криптография и внешние веб-сервисы в примерах не запускаются. Снимок в памяти не проверяет фактический доступ или отказ.

  14. В своём учебном профиле заранее штатными средствами зарегистрируйте разрешение Имя = УчебноеПриложение85 для действительно установленной собственной доверенной утилиты, например своего системного блокнота. Шаблон команды подготовьте по правилам платформы для реального пути; не используйте универсальное разрешение %.

  15. Шаблон не должен содержать паролей, токенов или секретных аргументов. Доверие программе и соответствие конкретной команды шаблону проверяют отдельно на стенде; данный модуль ничего не запускает.

  16. СоздатьРазрешенный… по установленной справке возвращает новый объект для последующей настройки и регистрации. Этот модуль не вызывает Записать ни у разрешения, ни у профиля; исходное разрешение не изменяется.

  17. Повторное чтение проверяет отсутствие нового ключа среди зарегистрированных разрешений. Это ожидаемая контрольная проверка, а не результат запуска здесь: примеры в 1С не выполнялись.

&НаКлиенте
Процедура ПолучитьУчебныйСнимок(Команда)
    Попытка
        JSONРезультат = УчебныйСнимокНаСервере(ПортRAS, ИмяАгента, ПарольАгента,
            ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера,
    ИдентификаторУчебнойБазы, ИмяАдминистратораБазы, ПарольАдминистратораБазы);
    Исключение
        JSONРезультат = "Снимок не получен. Проверьте собственный стенд, порт, UUID кластера и базы, учебные имена и права администраторов. Подробную серверную ошибку исследуйте в отладчике без публикации учётных данных.";
    КонецПопытки;
    ПарольАгента = "";
    ПарольАдминистратораКластера = "";
    ПарольАдминистратораБазы = "";
КонецПроцедуры

&НаСервереБезКонтекста
Функция УчебныйСнимокНаСервере(ПортRAS, ИмяАгента, ПарольАгента,
    ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера,
    ИдентификаторУчебнойБазы, ИмяАдминистратораБазы, ПарольАдминистратораБазы)
    Если ТипЗнч(ПортRAS) <> Тип("Число") Тогда
        ВызватьИсключение "Порт ras должен быть числом";
    КонецЕсли;
    Если ПортRAS <> Цел(ПортRAS) Или ПортRAS < 1 Или ПортRAS > 65535 Тогда
        ВызватьИсключение "Недопустимый порт собственного ras";
    КонецЕсли;
    ТекстовыеПараметры = Новый Массив;
    ТекстовыеПараметры.Добавить(ИмяАгента);
    ТекстовыеПараметры.Добавить(ПарольАгента);
    ТекстовыеПараметры.Добавить(ИдентификаторКластера);
    ТекстовыеПараметры.Добавить(ИмяАдминистратораКластера);
    ТекстовыеПараметры.Добавить(ПарольАдминистратораКластера);
    ТекстовыеПараметры.Добавить(ИдентификаторУчебнойБазы);
    ТекстовыеПараметры.Добавить(ИмяАдминистратораБазы);
    ТекстовыеПараметры.Добавить(ПарольАдминистратораБазы);
    Для Каждого ТекстовыйПараметр Из ТекстовыеПараметры Цикл
        Если ТипЗнч(ТекстовыйПараметр) <> Тип("Строка") Тогда
            ВызватьИсключение "Учётные данные и UUID должны быть строками";
        КонецЕсли;
    КонецЦикла;
    Агент = Новый АдминистрированиеСервера("127.0.0.1", ПортRAS);
    Агент.ВыполнитьАутентификацию(ПарольАгента, ИмяАгента);
    Кластеры = Агент.ПолучитьКластеры();
    Если ПустаяСтрока(СокрЛП(ИдентификаторКластера)) Тогда
        Каталог = Новый Массив;
        Для Каждого Найденный Из Кластеры Цикл
            Если Найденный.Имя = "УчебныйКластер85" Тогда
                СтрокаКаталога = Новый Структура;
                СтрокаКаталога.Вставить("UUID", Строка(Найденный.ИдентификаторКластера));
                СтрокаКаталога.Вставить("Имя", Найденный.Имя);
                Каталог.Добавить(СтрокаКаталога);
            КонецЕсли;
        КонецЦикла;
        Возврат СериализоватьСвойСнимок(Новый Структура("УчебныеКластеры", Каталог));
    КонецЕсли;
    Кластер = Неопределено;
    Совпадений = 0;
    Для Каждого Найденный Из Кластеры Цикл
        Если НРег(Строка(Найденный.ИдентификаторКластера)) = НРег(СокрЛП(ИдентификаторКластера))
            И Найденный.Имя = "УчебныйКластер85" Тогда
            Кластер = Найденный;
            Совпадений = Совпадений + 1;
        КонецЕсли;
    КонецЦикла;
    Если Совпадений <> 1 Тогда
        ВызватьИсключение "Нужен один собственный учебный кластер с подтверждённым UUID";
    КонецЕсли;
    Кластер.ВыполнитьАутентификацию(ИмяАдминистратораКластера, ПарольАдминистратораКластера);
    Снимок = Новый Структура;
    Снимок.Вставить("UUIDКластера", Строка(Кластер.ИдентификаторКластера));
    Снимок.Вставить("ИмяКластера", Кластер.Имя);
    Базы = Кластер.ПолучитьИнформационныеБазы();
    Если ПустаяСтрока(СокрЛП(ИдентификаторУчебнойБазы)) Тогда
        КаталогБаз = Новый Массив;
        Для Каждого КандидатБазы Из Базы Цикл
            Если ТипЗнч(КандидатБазы) <> Тип("АдминистрированиеИнформационнаяБаза") Тогда
                ВызватьИсключение "Ожидалось описание информационной базы";
            КонецЕсли;
            Если КандидатБазы.Имя = "УчебнаяБаза85" Тогда
                ЗаписьКаталога = Новый Структура;
                ЗаписьКаталога.Вставить("UUID", Строка(КандидатБазы.ИдентификаторИнформационнойБазы));
                ЗаписьКаталога.Вставить("Имя", КандидатБазы.Имя);
                КаталогБаз.Добавить(ЗаписьКаталога);
            КонецЕсли;
        КонецЦикла;
        Снимок.Вставить("УчебныеБазы", КаталогБаз);
        Возврат СериализоватьСвойСнимок(Снимок);
    КонецЕсли;
    База = Неопределено;
    СовпаденийБазы = 0;
    Для Каждого КандидатБазы Из Базы Цикл
        Если ТипЗнч(КандидатБазы) <> Тип("АдминистрированиеИнформационнаяБаза") Тогда
            ВызватьИсключение "Ожидалось описание информационной базы";
        КонецЕсли;
        Если КандидатБазы.Имя = "УчебнаяБаза85"
            И НРег(Строка(КандидатБазы.ИдентификаторИнформационнойБазы)) = НРег(СокрЛП(ИдентификаторУчебнойБазы)) Тогда
            База = КандидатБазы;
            СовпаденийБазы = СовпаденийБазы + 1;
        КонецЕсли;
    КонецЦикла;
    Если СовпаденийБазы <> 1 Тогда
        ВызватьИсключение "Нужна одна собственная УчебнаяБаза85 с подтверждённым UUID";
    КонецЕсли;
    База.ВыполнитьАутентификацию(ИмяАдминистратораБазы, ПарольАдминистратораБазы);
    Снимок.Вставить("UUIDБазы", Строка(База.ИдентификаторИнформационнойБазы));
    Снимок.Вставить("ИмяБазы", База.Имя);
    Если База.ПрофильБезопасности <> "УчебныйПрофиль85" Тогда
        ВызватьИсключение "Для урока нужен заранее назначенный своей базе УчебныйПрофиль85";
    КонецЕсли;
    Профиль = Неопределено;
    СовпаденийПрофиля = 0;
    Для Каждого КандидатПрофиля Из Кластер.ПолучитьПрофилиБезопасности() Цикл
        Если ТипЗнч(КандидатПрофиля) <> Тип("АдминистрированиеПрофильБезопасности") Тогда
            ВызватьИсключение "Ожидалось описание профиля безопасности";
        КонецЕсли;
        Если КандидатПрофиля.Имя = "УчебныйПрофиль85" Тогда
            Профиль = КандидатПрофиля;
            СовпаденийПрофиля = СовпаденийПрофиля + 1;
        КонецЕсли;
    КонецЦикла;
    Если СовпаденийПрофиля <> 1 Тогда
        ВызватьИсключение "Нужен один собственный заранее зарегистрированный учебный профиль";
    КонецЕсли;
    Снимок.Вставить("ИмяПрофиля", Профиль.Имя);
    Снимок.Вставить("ОписаниеПрофиляЗаполнено", Не ПустаяСтрока(Профиль.Описание));
    Образец = Неопределено;
    СовпаденийОбразца = 0;
    Для Каждого ЗаписьРазрешения Из Профиль.ПолучитьРазрешенныеВнешниеПриложения() Цикл
        Если ТипЗнч(ЗаписьРазрешения) <> Тип("РазрешенноеВнешнееПриложение") Тогда
            ВызватьИсключение "Получен неожиданный тип разрешения";
        КонецЕсли;
        Если ЗаписьРазрешения.Имя = "УчебноеПриложение85" Тогда
            Образец = ЗаписьРазрешения;
            СовпаденийОбразца = СовпаденийОбразца + 1;
        КонецЕсли;
    КонецЦикла;
    Если СовпаденийОбразца <> 1 Тогда
        ВызватьИсключение "Заранее подготовьте ровно один свой зарегистрированный учебный образец";
    КонецЕсли;
    Если ПустаяСтрока(Образец.СтрокаКоманды) Тогда
        ВызватьИсключение "Нужен настоящий подготовленный шаблон команды своего приложения";
    КонецЕсли;
    Суффикс = Строка(Новый УникальныйИдентификатор);
    Черновик = Профиль.СоздатьРазрешенноеВнешнееПриложение();
    Если ТипЗнч(Черновик) <> Тип("РазрешенноеВнешнееПриложение") Тогда
        ВызватьИсключение "Создание должно вернуть собственное описание разрешения";
    КонецЕсли;
    Черновик.Имя = "ЧерновикПриложения85_" + Суффикс;
    Черновик.Описание = Образец.Описание + " — учебный черновик без запуска";
    Черновик.СтрокаКоманды = Образец.СтрокаКоманды;
    Снимок.Вставить("КлючОбразца", Образец.Имя);
    Снимок.Вставить("КлючЧерновика", Черновик.Имя);
    Снимок.Вставить("РазныеКлючи", Черновик.Имя <> Образец.Имя);
    Снимок.Вставить("ШаблонСохраненБезПерекодировки", Черновик.СтрокаКоманды = Образец.СтрокаКоманды);
    Снимок.Вставить("ОписаниеИзменено", Черновик.Описание <> Образец.Описание);
    ЗарегистрированныхЧерновиков = 0;
    Для Каждого ПовторнаяЗапись Из Профиль.ПолучитьРазрешенныеВнешниеПриложения() Цикл
        Если ТипЗнч(ПовторнаяЗапись) <> Тип("РазрешенноеВнешнееПриложение") Тогда
            ВызватьИсключение "Получен неожиданный тип разрешения при повторном чтении";
        КонецЕсли;
        Если ПовторнаяЗапись.Имя = Черновик.Имя Тогда
            ЗарегистрированныхЧерновиков = ЗарегистрированныхЧерновиков + 1;
        КонецЕсли;
    КонецЦикла;
    Снимок.Вставить("ЗарегистрированныхЧерновиков", ЗарегистрированныхЧерновиков);
    Снимок.Вставить("ОжидаетсяБезРегистрации", ЗарегистрированныхЧерновиков = 0);
    Возврат СериализоватьСвойСнимок(Снимок);
КонецФункции

&НаСервереБезКонтекста
Функция СериализоватьСвойСнимок(Снимок)
    Писатель = Новый ЗаписьJSON;
    Писатель.УстановитьСтроку();
    ЗаписатьJSON(Писатель, Снимок);
    Возврат Писатель.Закрыть();
КонецФункции

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

  1. Полный модуль формы проверяет учебную конфигурацию, loopback ras, порт и строковые аргументы до подключения. Три пары учётных данных не подменяются одной.

  2. Кластер и база выбираются одновременно по своим учебным именам и подтверждённым UUID; назначенный УчебныйПрофиль85 выбирается по единственному точному имени.

  3. Среди фактического массива разрешений ищем только заранее подготовленный учебный ключ. Проверяются тип и ровно одно совпадение; неизвестный объект извне не требуется.

  4. Фабрика возвращает новый объект точного типа. У черновика отдельный случайный ключ; это не редактирование исходной зарегистрированной записи.

  5. Имя административной записи — уникальный ключ профиля, а СтрокаКоманды — шаблон разрешённой команды. Это не текст процедуры 1С и не немедленная команда ОС.

  6. Копируем настоящий шаблон целиком. Не разбиваем его на пробелах: слова с пробелами, кавычки и удвоенные кавычки имеют собственные правила.

  7. В шаблоне % обозначает последовательность, _ — один символ, * связано с именем файла и виртуальным каталогом. Обратная косая перед шаблонным символом делает его нешаблонным.

  8. Пустой шаблон не заменяем произвольным notepad.exe или выдуманным путём. Без подготовленного образца нет пригодной основы для черновика.

  9. Новый ключ отделяет редакцию от исходной записи. Присвоение СтрокаКоманды не запускает процесс; регистрация отсутствует.

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

  1. В JSON правильные UUID своего кластера и базы, ИмяПрофиля — УчебныйПрофиль85. При отсутствии учебного образца должна быть ошибка, не подставленные параметры.

  2. РазныеКлючи — Истина. ЗарегистрированныхЧерновиков ожидается 0, ОжидаетсяБезРегистрации — Истина. Если это не так, остановите самостоятельный опыт и исследуйте собственный стенд без автоматического удаления.

  3. Пароли очищены после успеха или ошибки. Исходное разрешение остаётся неизменным; ресурс, файл, COM или приложение не используются.

  4. ШаблонСохраненБезПерекодировки и ОписаниеИзменено — Истина.

  5. В JSON нет текста команды, секретных аргументов или её вывода. Подробный собственный шаблон можно посмотреть только локально в отладчике.

  6. Нет ЗапуститьПриложение, Выполнить или командной оболочки. Исходная утилита не открывается в результате урока.

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

Настоящий платформенный шаблон сохранён в отдельном черновике без выдуманной строки запуска и без изменения действующего разрешения.

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

  1. Имя или псевдоним — ключ административного разрешения, не доказательство существования или безопасности ресурса. Не заменяйте подготовку случайным GUID, пустой контрольной суммой или выдуманным файлом.

  2. Новый объект и присвоенные свойства ещё не являются действующим разрешением. Записать выполняет регистрацию, Удалить отменяет её; ни одно из этих действий здесь не вызывается.

  3. Статическая проверка не подтверждает подключение к ras, форматирование ресурса платформой или реальный доступ. Сравнения описывают ожидаемое поведение собственного стенда.

  4. Профиль может иметь полный доступ к категории: создание ограниченного черновика само по себе не ограничивает действующий профиль или сеанс.

  5. JSON содержит ключи и результаты сравнений, не пароли или сырые ресурсные строки. Подробности своего образца исследуйте только локально в отладчике.

  6. Не добавляйте % ради обхода несовпадения команды. Непустой шаблон сам по себе не является проверенным ограничением или гарантией доверия приложению.

  7. Обычное экранирование BSL-строки, правил шаблона и командной оболочки — разные задачи. Копирование сохранённого шаблона не доказывает корректность самодельного парсера.

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

Подготовить черновик внешней компоненты с её настоящей контрольной суммой

Берём сумму именно своей подготовленной компоненты, проверяем SHA-1/base64 и не путаем эту запись с внешним модулем или установкой DLL.

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

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

Подготовка

  1. Нужен отдельный собственный серверный стенд 1С 8.5.1.1343 без рабочих баз. Администратор должен заранее установить сервер, запустить совместимый ras и создать кластер с точным именем УчебныйКластер85. Код ничего не устанавливает и не регистрирует.

  2. Запускайте обработку в собственной пустой учебной конфигурации с именем метаданных УчебнаяКонфигурацияСинтаксиса. Серверное выполнение должно находиться на той же машине, что собственный ras: код разрешает только 127.0.0.1. Это адрес сервера выполнения, не обязательно компьютера тонкого клиента.

  3. ПортRAS возьмите из фактического запуска своего ras, не из порта ragent или рабочего процесса. Например, 1545 подходит только если именно этот порт настроен на вашем стенде. Используйте законные учётные данные своего агента и своего кластера; пустые допустимы только для намеренно настроенного учебного стенда без соответствующих администраторов.

  4. В первый раз оставьте ИдентификаторКластера пустым: появится JSON только с кластерами УчебныйКластер85. Скопируйте настоящий UUID из результата, вновь введите очищенные пароли и повторите команду. Кластер выбирается одновременно по UUID и точному учебному имени; чужой кластер не принимается.

  5. Выполняйте каждый урок отдельно. JSON формируется в памяти и показывается только на своей форме; код не сохраняет файлы, не пишет настройки кластера, не прерывает сеансы и не запускает команды ОС. Он выполняет сетевое обращение к своему локальному ras только если вы сами запустите его на подготовленном стенде.

  6. Здесь подключение к ras и запуск в 1С не выполнялись. Проверены тексты, сигнатуры и привязки к локальной справке 8.5.1.1343. Пройдите контрольные действия сами только на своём учебном стенде.

  7. Штатными средствами заранее зарегистрируйте в своём УчебныйКластер85 только собственную УчебнаяБаза85 с этой учебной конфигурацией. Код не создаёт базу, СУБД, пользователя, профиль или разрешение.

  8. В управляемой форме обработки создайте ПортRAS — Число без дробной части; ИмяАгента, ПарольАгента, ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера, ИдентификаторУчебнойБазы, ИмяАдминистратораБазы, ПарольАдминистратораБазы, JSONРезультат — Строка. У JSONРезультат длина 0.

  9. Выведите реквизиты на форму. Для всех трёх полей паролей включите Режим пароля, не сохраняйте их в истории и настройках; JSONРезультат — многострочное поле просмотра. Создайте команду ПолучитьУчебныйСнимок и вставьте весь приведённый модуль формы.

  10. Первый запуск с пустым UUID кластера возвращает только каталог УчебныйКластер85. Второй с настоящим UUID кластера и пустым UUID базы — только каталог УчебнаяБаза85. Третий — с обоими подтверждёнными UUID и законными учётными данными пользователя-администратора своей базы.

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

  12. Для текущего урока разрешений заранее штатными средствами своего стенда создайте и назначьте УчебнаяБаза85 обычный профиль УчебныйПрофиль85. Возможность работы с профилями должна быть доступна на вашем лицензированном стенде; код не обходит её ограничения.

  13. Списки разрешений, роли и модули проверяются только как настройки. COM, внешние приложения, файлы, криптография и внешние веб-сервисы в примерах не запускаются. Снимок в памяти не проверяет фактический доступ или отказ.

  14. Нужна настоящая собственная доверенная внешняя компонента для стенда. Штатными средствами подготовьте разрешение Имя = УчебнаяКомпонента85 с суммой SHA-1/base64 именно её файла или документированного пакета, а не произвольной DLL из Интернета.

  15. Модуль формы компоненту не устанавливает и не вызывает ПодключитьВнешнююКомпоненту. Без реально подготовленной записи опыт заканчивается ошибкой.

  16. СоздатьРазрешенный… по установленной справке возвращает новый объект для последующей настройки и регистрации. Этот модуль не вызывает Записать ни у разрешения, ни у профиля; исходное разрешение не изменяется.

  17. Повторное чтение проверяет отсутствие нового ключа среди зарегистрированных разрешений. Это ожидаемая контрольная проверка, а не результат запуска здесь: примеры в 1С не выполнялись.

&НаКлиенте
Процедура ПолучитьУчебныйСнимок(Команда)
    Попытка
        JSONРезультат = УчебныйСнимокНаСервере(ПортRAS, ИмяАгента, ПарольАгента,
            ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера,
    ИдентификаторУчебнойБазы, ИмяАдминистратораБазы, ПарольАдминистратораБазы);
    Исключение
        JSONРезультат = "Снимок не получен. Проверьте собственный стенд, порт, UUID кластера и базы, учебные имена и права администраторов. Подробную серверную ошибку исследуйте в отладчике без публикации учётных данных.";
    КонецПопытки;
    ПарольАгента = "";
    ПарольАдминистратораКластера = "";
    ПарольАдминистратораБазы = "";
КонецПроцедуры

&НаСервереБезКонтекста
Функция УчебныйСнимокНаСервере(ПортRAS, ИмяАгента, ПарольАгента,
    ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера,
    ИдентификаторУчебнойБазы, ИмяАдминистратораБазы, ПарольАдминистратораБазы)
    Если ТипЗнч(ПортRAS) <> Тип("Число") Тогда
        ВызватьИсключение "Порт ras должен быть числом";
    КонецЕсли;
    Если ПортRAS <> Цел(ПортRAS) Или ПортRAS < 1 Или ПортRAS > 65535 Тогда
        ВызватьИсключение "Недопустимый порт собственного ras";
    КонецЕсли;
    ТекстовыеПараметры = Новый Массив;
    ТекстовыеПараметры.Добавить(ИмяАгента);
    ТекстовыеПараметры.Добавить(ПарольАгента);
    ТекстовыеПараметры.Добавить(ИдентификаторКластера);
    ТекстовыеПараметры.Добавить(ИмяАдминистратораКластера);
    ТекстовыеПараметры.Добавить(ПарольАдминистратораКластера);
    ТекстовыеПараметры.Добавить(ИдентификаторУчебнойБазы);
    ТекстовыеПараметры.Добавить(ИмяАдминистратораБазы);
    ТекстовыеПараметры.Добавить(ПарольАдминистратораБазы);
    Для Каждого ТекстовыйПараметр Из ТекстовыеПараметры Цикл
        Если ТипЗнч(ТекстовыйПараметр) <> Тип("Строка") Тогда
            ВызватьИсключение "Учётные данные и UUID должны быть строками";
        КонецЕсли;
    КонецЦикла;
    Агент = Новый АдминистрированиеСервера("127.0.0.1", ПортRAS);
    Агент.ВыполнитьАутентификацию(ПарольАгента, ИмяАгента);
    Кластеры = Агент.ПолучитьКластеры();
    Если ПустаяСтрока(СокрЛП(ИдентификаторКластера)) Тогда
        Каталог = Новый Массив;
        Для Каждого Найденный Из Кластеры Цикл
            Если Найденный.Имя = "УчебныйКластер85" Тогда
                СтрокаКаталога = Новый Структура;
                СтрокаКаталога.Вставить("UUID", Строка(Найденный.ИдентификаторКластера));
                СтрокаКаталога.Вставить("Имя", Найденный.Имя);
                Каталог.Добавить(СтрокаКаталога);
            КонецЕсли;
        КонецЦикла;
        Возврат СериализоватьСвойСнимок(Новый Структура("УчебныеКластеры", Каталог));
    КонецЕсли;
    Кластер = Неопределено;
    Совпадений = 0;
    Для Каждого Найденный Из Кластеры Цикл
        Если НРег(Строка(Найденный.ИдентификаторКластера)) = НРег(СокрЛП(ИдентификаторКластера))
            И Найденный.Имя = "УчебныйКластер85" Тогда
            Кластер = Найденный;
            Совпадений = Совпадений + 1;
        КонецЕсли;
    КонецЦикла;
    Если Совпадений <> 1 Тогда
        ВызватьИсключение "Нужен один собственный учебный кластер с подтверждённым UUID";
    КонецЕсли;
    Кластер.ВыполнитьАутентификацию(ИмяАдминистратораКластера, ПарольАдминистратораКластера);
    Снимок = Новый Структура;
    Снимок.Вставить("UUIDКластера", Строка(Кластер.ИдентификаторКластера));
    Снимок.Вставить("ИмяКластера", Кластер.Имя);
    Базы = Кластер.ПолучитьИнформационныеБазы();
    Если ПустаяСтрока(СокрЛП(ИдентификаторУчебнойБазы)) Тогда
        КаталогБаз = Новый Массив;
        Для Каждого КандидатБазы Из Базы Цикл
            Если ТипЗнч(КандидатБазы) <> Тип("АдминистрированиеИнформационнаяБаза") Тогда
                ВызватьИсключение "Ожидалось описание информационной базы";
            КонецЕсли;
            Если КандидатБазы.Имя = "УчебнаяБаза85" Тогда
                ЗаписьКаталога = Новый Структура;
                ЗаписьКаталога.Вставить("UUID", Строка(КандидатБазы.ИдентификаторИнформационнойБазы));
                ЗаписьКаталога.Вставить("Имя", КандидатБазы.Имя);
                КаталогБаз.Добавить(ЗаписьКаталога);
            КонецЕсли;
        КонецЦикла;
        Снимок.Вставить("УчебныеБазы", КаталогБаз);
        Возврат СериализоватьСвойСнимок(Снимок);
    КонецЕсли;
    База = Неопределено;
    СовпаденийБазы = 0;
    Для Каждого КандидатБазы Из Базы Цикл
        Если ТипЗнч(КандидатБазы) <> Тип("АдминистрированиеИнформационнаяБаза") Тогда
            ВызватьИсключение "Ожидалось описание информационной базы";
        КонецЕсли;
        Если КандидатБазы.Имя = "УчебнаяБаза85"
            И НРег(Строка(КандидатБазы.ИдентификаторИнформационнойБазы)) = НРег(СокрЛП(ИдентификаторУчебнойБазы)) Тогда
            База = КандидатБазы;
            СовпаденийБазы = СовпаденийБазы + 1;
        КонецЕсли;
    КонецЦикла;
    Если СовпаденийБазы <> 1 Тогда
        ВызватьИсключение "Нужна одна собственная УчебнаяБаза85 с подтверждённым UUID";
    КонецЕсли;
    База.ВыполнитьАутентификацию(ИмяАдминистратораБазы, ПарольАдминистратораБазы);
    Снимок.Вставить("UUIDБазы", Строка(База.ИдентификаторИнформационнойБазы));
    Снимок.Вставить("ИмяБазы", База.Имя);
    Если База.ПрофильБезопасности <> "УчебныйПрофиль85" Тогда
        ВызватьИсключение "Для урока нужен заранее назначенный своей базе УчебныйПрофиль85";
    КонецЕсли;
    Профиль = Неопределено;
    СовпаденийПрофиля = 0;
    Для Каждого КандидатПрофиля Из Кластер.ПолучитьПрофилиБезопасности() Цикл
        Если ТипЗнч(КандидатПрофиля) <> Тип("АдминистрированиеПрофильБезопасности") Тогда
            ВызватьИсключение "Ожидалось описание профиля безопасности";
        КонецЕсли;
        Если КандидатПрофиля.Имя = "УчебныйПрофиль85" Тогда
            Профиль = КандидатПрофиля;
            СовпаденийПрофиля = СовпаденийПрофиля + 1;
        КонецЕсли;
    КонецЦикла;
    Если СовпаденийПрофиля <> 1 Тогда
        ВызватьИсключение "Нужен один собственный заранее зарегистрированный учебный профиль";
    КонецЕсли;
    Снимок.Вставить("ИмяПрофиля", Профиль.Имя);
    Снимок.Вставить("ОписаниеПрофиляЗаполнено", Не ПустаяСтрока(Профиль.Описание));
    Образец = Неопределено;
    СовпаденийОбразца = 0;
    Для Каждого ЗаписьРазрешения Из Профиль.ПолучитьРазрешенныеВнешниеКомпоненты() Цикл
        Если ТипЗнч(ЗаписьРазрешения) <> Тип("РазрешеннаяВнешняяКомпонента") Тогда
            ВызватьИсключение "Получен неожиданный тип разрешения";
        КонецЕсли;
        Если ЗаписьРазрешения.Имя = "УчебнаяКомпонента85" Тогда
            Образец = ЗаписьРазрешения;
            СовпаденийОбразца = СовпаденийОбразца + 1;
        КонецЕсли;
    КонецЦикла;
    Если СовпаденийОбразца <> 1 Тогда
        ВызватьИсключение "Заранее подготовьте ровно один свой зарегистрированный учебный образец";
    КонецЕсли;
    Если СтрДлина(Образец.ХешСумма) <> 28 Тогда
        ВызватьИсключение "Нужна настоящая каноническая SHA-1/base64 контрольная сумма своего файла";
    КонецЕсли;
    БайтыХеша = Base64Значение(Образец.ХешСумма);
    Если ТипЗнч(БайтыХеша) <> Тип("ДвоичныеДанные") Или БайтыХеша.Размер() <> 20 Тогда
        ВызватьИсключение "Контрольная сумма должна декодироваться в 20 байт SHA-1";
    КонецЕсли;
    Суффикс = Строка(Новый УникальныйИдентификатор);
    Черновик = Профиль.СоздатьРазрешеннуюВнешнююКомпоненту();
    Если ТипЗнч(Черновик) <> Тип("РазрешеннаяВнешняяКомпонента") Тогда
        ВызватьИсключение "Создание должно вернуть собственное описание разрешения";
    КонецЕсли;
    Черновик.Имя = "ЧерновикКомпоненты85_" + Суффикс;
    Черновик.Описание = Образец.Описание + " — учебный черновик компоненты";
    Черновик.ХешСумма = Образец.ХешСумма;
    Снимок.Вставить("КлючОбразца", Образец.Имя);
    Снимок.Вставить("КлючЧерновика", Черновик.Имя);
    Снимок.Вставить("РазныеКлючи", Черновик.Имя <> Образец.Имя);
    Снимок.Вставить("SHA1Байт", БайтыХеша.Размер());
    Снимок.Вставить("КонтрольнаяСуммаСохранена", Черновик.ХешСумма = Образец.ХешСумма);
    Снимок.Вставить("ОписаниеИзменено", Черновик.Описание <> Образец.Описание);
    ЗарегистрированныхЧерновиков = 0;
    Для Каждого ПовторнаяЗапись Из Профиль.ПолучитьРазрешенныеВнешниеКомпоненты() Цикл
        Если ТипЗнч(ПовторнаяЗапись) <> Тип("РазрешеннаяВнешняяКомпонента") Тогда
            ВызватьИсключение "Получен неожиданный тип разрешения при повторном чтении";
        КонецЕсли;
        Если ПовторнаяЗапись.Имя = Черновик.Имя Тогда
            ЗарегистрированныхЧерновиков = ЗарегистрированныхЧерновиков + 1;
        КонецЕсли;
    КонецЦикла;
    Снимок.Вставить("ЗарегистрированныхЧерновиков", ЗарегистрированныхЧерновиков);
    Снимок.Вставить("ОжидаетсяБезРегистрации", ЗарегистрированныхЧерновиков = 0);
    Возврат СериализоватьСвойСнимок(Снимок);
КонецФункции

&НаСервереБезКонтекста
Функция СериализоватьСвойСнимок(Снимок)
    Писатель = Новый ЗаписьJSON;
    Писатель.УстановитьСтроку();
    ЗаписатьJSON(Писатель, Снимок);
    Возврат Писатель.Закрыть();
КонецФункции

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

  1. Полный модуль формы проверяет учебную конфигурацию, loopback ras, порт и строковые аргументы до подключения. Три пары учётных данных не подменяются одной.

  2. Кластер и база выбираются одновременно по своим учебным именам и подтверждённым UUID; назначенный УчебныйПрофиль85 выбирается по единственному точному имени.

  3. Среди фактического массива разрешений ищем только заранее подготовленный учебный ключ. Проверяются тип и ровно одно совпадение; неизвестный объект извне не требуется.

  4. Фабрика возвращает новый объект точного типа. У черновика отдельный случайный ключ; это не редактирование исходной зарегистрированной записи.

  5. Массив ПолучитьРазрешенныеВнешниеКомпоненты возвращает записи отдельного типа; выбираем только свой учебный ключ.

  6. Сумма описана строкой SHA-1/base64, как в справке именно компоненты. Декодирование и 20 байт проверяют формат, не совместимость архитектуры или ABI.

  7. Фабрика СоздатьРазрешеннуюВнешнююКомпоненту возвращает точный тип, не описание внешнего EPF/ERF. Поэтому не переносим методы загрузки между этими объектами.

  8. Новое имя и новое описание принадлежат отдельному черновику. Реальная сумма сохраняется без выдуманного файла и без пересчёта чужого содержания.

  9. Повторное административное чтение проверяет отсутствие нового ключа; никакой код компоненты для такой проверки не запускается.

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

  1. В JSON правильные UUID своего кластера и базы, ИмяПрофиля — УчебныйПрофиль85. При отсутствии учебного образца должна быть ошибка, не подставленные параметры.

  2. РазныеКлючи — Истина. ЗарегистрированныхЧерновиков ожидается 0, ОжидаетсяБезРегистрации — Истина. Если это не так, остановите самостоятельный опыт и исследуйте собственный стенд без автоматического удаления.

  3. Пароли очищены после успеха или ошибки. Исходное разрешение остаётся неизменным; ресурс, файл, COM или приложение не используются.

  4. SHA1Байт — 20, КонтрольнаяСуммаСохранена и ОписаниеИзменено — Истина.

  5. Сверьте исходную сумму со штатными настройками своего стенда и своим файлом отдельной безопасной проверкой.

  6. В памяти есть новый объект описания, но установка компоненты, её подключение и регистрация разрешения не происходят.

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

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

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

  1. Имя или псевдоним — ключ административного разрешения, не доказательство существования или безопасности ресурса. Не заменяйте подготовку случайным GUID, пустой контрольной суммой или выдуманным файлом.

  2. Новый объект и присвоенные свойства ещё не являются действующим разрешением. Записать выполняет регистрацию, Удалить отменяет её; ни одно из этих действий здесь не вызывается.

  3. Статическая проверка не подтверждает подключение к ras, форматирование ресурса платформой или реальный доступ. Сравнения описывают ожидаемое поведение собственного стенда.

  4. Профиль может иметь полный доступ к категории: создание ограниченного черновика само по себе не ограничивает действующий профиль или сеанс.

  5. JSON содержит ключи и результаты сравнений, не пароли или сырые ресурсные строки. Подробности своего образца исследуйте только локально в отладчике.

  6. Контрольная сумма не проверяет ABI, битность, происхождение или цифровую подпись компоненты. Нельзя объявлять компоненту безопасной по одному совпадению длины.

  7. Не пересчитывайте пакет как другой произвольный файл ради прохождения проверки. Фактический объект хеширования должен соответствовать требованиям вашей компоненты и настройки.

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

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

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

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

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