Тип: Булево. Определяет, разрешено ли повышение прав на объекты конфигурации расширениями, ограниченными профилем безопасности: Истина – повышение прав разрешено. Ложь – повышение прав не разрешено. Если указан список ролей расширяемой конфигурации(RightExtensionDefinitionRoles), допускается повышение права, если хотя бы одна роль из списка включает в себя требуемое право.
Полное описание, параметры и ограничения
Профиль безопасности.RightExtension (ISecurityProfile.RightExtension)
Профиль безопасности (ISecurityProfile)
RightExtension (RightExtension)
Доступен, начиная с версии 8.3.9.
Использование:
Чтение и запись.
Описание:
Тип: Булево.
Определяет, разрешено ли повышение прав на объекты конфигурации расширениями, ограниченными профилем безопасности:
Истина – повышение прав разрешено.
Ложь – повышение прав не разрешено. Если указан список ролей расширяемой конфигурации(RightExtensionDefinitionRoles), допускается повышение права, если хотя бы одна роль из списка включает в себя требуемое право.
Доступность:
Интеграция.
Использование в версии:
Доступен, начиная с версии 8.3.9.
Методическая информация
Практические примеры
Разобрать списки модулей и ролей, ограничивающие расширение конфигурации
В COM-интерфейсе RightExtensionDefinitionRoles имеет тип Строка. Не переносим на него противоречивый тип одноимённого русского свойства ras и не считаем общий False абсолютным запретом.
Где и как запускать
Полный модуль управляемой формы собственной пустой учебной конфигурации на отдельном локальном Windows-стенде 8.5.1.1343. Читаются только свой назначенный профиль и собственные ресурсы; подготовленные черновики не регистрируются. Здесь в 1С не запускался.
Подготовка
Нужен отдельный собственный локальный серверный стенд 1С 8.5.1.1343 на Windows без рабочих баз. Здесь выполняется только авторская подготовка кода: реальное подключение агентом справочника не выполнялось.
Администратор стенда заранее устанавливает сервер и регистрирует V85.COMConnector той же версии и разрядности, что серверный процесс учебной базы. Код не запускает regsvr32, не устанавливает платформу и не открывает COM 8.3 вместо 8.5.
В своём стенде создайте единственный целевой кластер с точным именем УчебныйКластер85 и новую пустую серверную базу с именем УчебнаяБаза85. У описания этой базы задайте точное значение syntax-guide85:owned-com. Не переименовывайте рабочую базу или кластер ради обхода защит.
У собственной учебной конфигурации задайте имя метаданных УчебнаяКонфигурацияСинтаксиса. Серверная функция должна выполняться на той же Windows-машине, что агент сервера и выбранный рабочий процесс: обращения жёстко ограничены 127.0.0.1.
Заведите отдельные действительные учебные учётные данные администратора агента, администратора кластера и администратора базы с правом Администратор. В этих уроках имена и пароли намеренно должны быть непустыми; анонимный режим не используется.
Создайте свою учебную обработку с управляемой формой. Реквизиты: ПортАгента и ПортКластера — Число без дробной части; КлючПроцесса, ИмяАгента, ПарольАгента, ИмяАдминистратораКластера, ПарольАдминистратораКластера, ИмяАдминистратораБазы, ПарольАдминистратораБазы, JSONРезультат — Строка; Занято — Булево, начально Ложь. Длина JSONРезультат 0.
Поля трёх паролей выведите в Режиме пароля и не сохраняйте в настройках формы, истории или файле. JSONРезультат выведите многострочным полем только для просмотра. Добавьте команду ПолучитьУчебныйCOMСнимок с одноимённым клиентским обработчиком.
Вставьте весь приведённый модуль формы, включая обе вспомогательные функции. ПортАгента берите из реальной настройки ragent, ПортКластера — из настройки менеджера кластера. Порт ras сюда не подходит.
Первый раз оставьте КлючПроцесса пустым. Каталог покажет только локальные процессы выбранного учебного кластера. Скопируйте точный ключ порт|PID живого процесса из JSON, повторно введите очищенные пароли и повторите команду. PID не придумывайте; после перезапуска процесса получите каталог заново.
Для диагностики соединений откройте одно или два своих клиентских окна УчебнаяБаза85 и выполните обычные учебные действия, например собственный константный запрос. Не создавайте нагрузку на рабочем сервере; измеряемые числа зависят от реальных действий.
Снимок содержит только выбранные поля, не целые COM-объекты. Пароль СУБД, код разрешения входа, параметр блокировки и строка внешнего управления сеансами выводятся только как признаки наличия. Наличие строки не доказывает её корректность или доступность сервиса.
Если вы сами запустите урок, произойдут административные обращения к своему локальному агенту и рабочему процессу. Настройки не меняются, сеансы не завершаются, база не создаётся и не удаляется. Здесь запуск в 1С и подключение не проверялись.
На собственном стенде заранее создайте профиль с именем УчебныйПрофиль85 и описанием syntax-guide85:owned-com-profile. Назначьте его своей УчебнаяБаза85 как профиль обычного режима. Эти уроки профиль не создают, не назначают и не расширяют.
Учитывайте разрешения самого профиля: серверному коду нужен разрешённый V85.COMConnector для административного чтения. Администратор стенда должен заранее разрешить свой реально зарегистрированный локальный соединитель; не включайте полный доступ ко всем COM-классам в рабочем профиле ради примера.
Для каждого урока ресурса заранее зарегистрируйте в своём профиле ровно один собственный образец с указанным в уроке ключом и описанием syntax-guide85:owned-com-resource. Используйте реальные собственные пути, CLSID, контрольные суммы и шаблоны запуска. Строки в уроке не устанавливают сторонние компоненты.
COM-описания имеют английские свойства и тип COMОбъект в BSL. Их нельзя создавать через Новый Виртуальный каталог или сравнивать ТипЗнч со строковым именем интерфейса из справки.
&НаКлиенте
Процедура ПолучитьУчебныйCOMСнимок(Команда)
Если Занято Тогда
Возврат;
КонецЕсли;
Занято = Истина;
Попытка
JSONРезультат = УчебныйCOMСнимокНаСервере(ПортАгента, ПортКластера, КлючПроцесса,
ИмяАгента, ПарольАгента, ИмяАдминистратораКластера, ПарольАдминистратораКластера,
ИмяАдминистратораБазы, ПарольАдминистратораБазы);
Исключение
JSONРезультат = "Снимок не получен. Проверьте собственный Windows-стенд, COM 8.5, разрядность, порты, ключ процесса, учебные имена и права. Сырую ошибку с учётными данными не публикуйте.";
КонецПопытки;
ПарольАгента = "";
ПарольАдминистратораКластера = "";
ПарольАдминистратораБазы = "";
Занято = Ложь;
КонецПроцедуры
&НаСервереБезКонтекста
Функция УчебныйCOMСнимокНаСервере(ПортАгента, ПортКластера, КлючПроцесса,
ИмяАгента, ПарольАгента, ИмяАдминистратораКластера, ПарольАдминистратораКластера,
ИмяАдминистратораБазы, ПарольАдминистратораБазы)
Система = Новый СистемнаяИнформация;
Если Система.ТипПлатформы <> ТипПлатформы.Windows_x86
И Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
ВызватьИсключение "COM-урок требует серверного выполнения на Windows";
КонецЕсли;
Порты = Новый Массив;
Порты.Добавить(ПортАгента);
Порты.Добавить(ПортКластера);
Для Каждого Порт Из Порты Цикл
Если ТипЗнч(Порт) <> Тип("Число") Тогда
ВызватьИсключение "Порты должны быть числами";
КонецЕсли;
Если Порт <> Цел(Порт) ИЛИ Порт < 1 ИЛИ Порт > 65535 Тогда
ВызватьИсключение "Недопустимый порт локального стенда";
КонецЕсли;
КонецЦикла;
Если ТипЗнч(КлючПроцесса) <> Тип("Строка") Тогда
ВызватьИсключение "Ключ процесса должен быть строкой";
КонецЕсли;
УчётныеДанные = Новый Структура;
УчётныеДанные.Вставить("ИмяАгента", ИмяАгента);
УчётныеДанные.Вставить("ПарольАгента", ПарольАгента);
УчётныеДанные.Вставить("ИмяКластера", ИмяАдминистратораКластера);
УчётныеДанные.Вставить("ПарольКластера", ПарольАдминистратораКластера);
УчётныеДанные.Вставить("ИмяБазы", ИмяАдминистратораБазы);
УчётныеДанные.Вставить("ПарольБазы", ПарольАдминистратораБазы);
Для Каждого Поле Из УчётныеДанные Цикл
Если ТипЗнч(Поле.Значение) <> Тип("Строка") Тогда
ВызватьИсключение "Учебные учётные данные должны быть строками";
КонецЕсли;
Если ПустаяСтрока(Поле.Значение) Тогда
ВызватьИсключение "Введите все три непустые учебные пары учётных данных";
КонецЕсли;
КонецЦикла;
ЛокальноеИмя = НРег(ИмяКомпьютера());
АдресАгента = "tcp://127.0.0.1:" + Формат(ПортАгента, "ЧГ=0");
Соединитель = Новый COMОбъект("V85.COMConnector");
Агент = Соединитель.ConnectAgent(АдресАгента);
Если Агент.ConnectionString <> АдресАгента Тогда
ВызватьИсключение "Не совпала строка выбранного локального подключения";
КонецЕсли;
Агент.AuthenticateAgent(ИмяАгента, ПарольАгента);
Кластер = Неопределено;
СовпаденийКластера = 0;
Для Каждого Найденный Из Агент.GetClusters() Цикл
Если Найденный.ClusterName = "УчебныйКластер85"
И УчебныйЛокальныйУзел(Найденный.HostName, ЛокальноеИмя)
И Найденный.MainPort = ПортКластера Тогда
Кластер = Найденный;
СовпаденийКластера = СовпаденийКластера + 1;
КонецЕсли;
КонецЦикла;
Если СовпаденийКластера <> 1 Тогда
ВызватьИсключение "Нужен единственный собственный локальный УчебныйКластер85 с указанным портом";
КонецЕсли;
Агент.Authenticate(Кластер, ИмяАдминистратораКластера, ПарольАдминистратораКластера);
КраткаяБаза = Неопределено;
СовпаденийБазы = 0;
Для Каждого НайденнаяБаза Из Агент.GetInfoBases(Кластер) Цикл
Если НайденнаяБаза.Name = "УчебнаяБаза85" И НайденнаяБаза.Descr = "syntax-guide85:owned-com" Тогда
КраткаяБаза = НайденнаяБаза;
СовпаденийБазы = СовпаденийБазы + 1;
КонецЕсли;
КонецЦикла;
Если СовпаденийБазы <> 1 Тогда
ВызватьИсключение "Не найдена единственная собственная база с точным маркером описания";
КонецЕсли;
Каталог = Новый Массив;
Процесс = Неопределено;
СовпаденийПроцесса = 0;
Для Каждого НайденныйПроцесс Из Агент.GetWorkingProcesses(Кластер) Цикл
Если УчебныйЛокальныйУзел(НайденныйПроцесс.HostName, ЛокальноеИмя)
И НайденныйПроцесс.MainPort >= 1 И НайденныйПроцесс.MainPort <= 65535
И НайденныйПроцесс.MainPort = Цел(НайденныйПроцесс.MainPort)
И НЕ ПустаяСтрока(НайденныйПроцесс.PID) Тогда
Ключ = Формат(НайденныйПроцесс.MainPort, "ЧГ=0") + "|" + НайденныйПроцесс.PID;
Каталог.Добавить(Новый Структура("Ключ,Хост", Ключ, НайденныйПроцесс.HostName));
Если Ключ = КлючПроцесса Тогда
Процесс = НайденныйПроцесс;
СовпаденийПроцесса = СовпаденийПроцесса + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ПустаяСтрока(КлючПроцесса) Тогда
Возврат СериализоватьСвойСнимок(Новый Структура("УчебныеПроцессы", Каталог));
КонецЕсли;
Если СовпаденийПроцесса <> 1 Тогда
ВызватьИсключение "Нужен один живой локальный процесс с ключом из своего каталога";
КонецЕсли;
РабочееСоединение = Соединитель.ConnectWorkingProcess("tcp://127.0.0.1:" + Формат(Процесс.MainPort, "ЧГ=0"));
СовпаденийПолнойБазы = 0;
Для Каждого НайденнаяПолнаяБаза Из РабочееСоединение.GetInfoBases() Цикл
Если НайденнаяПолнаяБаза.Name = КраткаяБаза.Name И НайденнаяПолнаяБаза.Descr = КраткаяБаза.Descr Тогда
СовпаденийПолнойБазы = СовпаденийПолнойБазы + 1;
КонецЕсли;
КонецЦикла;
Если СовпаденийПолнойБазы <> 1 Тогда
ВызватьИсключение "Рабочий процесс не подтвердил свою учебную базу";
КонецЕсли;
РабочееСоединение.AddAuthentication(ИмяАдминистратораБазы, ПарольАдминистратораБазы);
База = Неопределено;
СовпаденийПослеВхода = 0;
Для Каждого НайденнаяПослеВхода Из РабочееСоединение.GetInfoBases() Цикл
Если НайденнаяПослеВхода.Name = "УчебнаяБаза85" И НайденнаяПослеВхода.Descr = "syntax-guide85:owned-com" Тогда
База = НайденнаяПослеВхода;
СовпаденийПослеВхода = СовпаденийПослеВхода + 1;
КонецЕсли;
КонецЦикла;
Если СовпаденийПослеВхода <> 1 Тогда
ВызватьИсключение "После аутентификации изменился выбор учебной базы";
КонецЕсли;
Снимок = Новый Структура;
Снимок.Вставить("База", База.Name);
Снимок.Вставить("ПроцессPID", Процесс.PID);
Снимок.Вставить("ПортПроцесса", Процесс.MainPort);
Если База.SecurityProfileName <> "УчебныйПрофиль85" Тогда
ВызватьИсключение "Своей базе должен быть назначен УчебныйПрофиль85 обычного режима";
КонецЕсли;
Профиль = Неопределено;
СовпаденийПрофиля = 0;
Для Каждого НайденныйПрофиль Из Агент.GetSecurityProfiles(Кластер) Цикл
Если НайденныйПрофиль.Name = База.SecurityProfileName
И НайденныйПрофиль.Descr = "syntax-guide85:owned-com-profile" Тогда
Профиль = НайденныйПрофиль;
СовпаденийПрофиля = СовпаденийПрофиля + 1;
КонецЕсли;
КонецЦикла;
Если СовпаденийПрофиля <> 1 Тогда
ВызватьИсключение "Нужен единственный назначенный собственный профиль с точным маркером";
КонецЕсли;
Снимок.Вставить("Профиль", Профиль.Name);
Снимок.Вставить("ОписаниеПрофиля", Профиль.Descr);
Снимок.Вставить("AllModulesExtension", Профиль.AllModulesExtension);
Снимок.Вставить("ModulesAvailableForExtension", Профиль.ModulesAvailableForExtension);
Снимок.Вставить("ModulesNotAvailableForExtension", Профиль.ModulesNotAvailableForExtension);
Снимок.Вставить("RightExtension", Профиль.RightExtension);
Снимок.Вставить("RightExtensionDefinitionRoles", Профиль.RightExtensionDefinitionRoles);
Снимок.Вставить("PrivilegedModeRoles", Профиль.PrivilegedModeRoles);
Если ТипЗнч(Профиль.RightExtensionDefinitionRoles) <> Тип("Строка") Тогда
ВызватьИсключение "В COM-контракте ожидалась строка имён ролей";
КонецЕсли;
Если Профиль.AllModulesExtension Тогда
СписокМодулей = Профиль.ModulesNotAvailableForExtension;
Снимок.Вставить("РежимМодулей", "Разрешены все, кроме указанного списка запрещённых");
Иначе
СписокМодулей = Профиль.ModulesAvailableForExtension;
Снимок.Вставить("РежимМодулей", "Разрешены только указанные объекты или модули");
КонецЕсли;
Модули = Новый Массив;
Для Каждого ИмяМодуля Из СтрРазделить(СписокМодулей, ";", Ложь) Цикл
ИмяМодуля = СокрЛП(ИмяМодуля);
Если НЕ ПустаяСтрока(ИмяМодуля) Тогда
Модули.Добавить(ИмяМодуля);
КонецЕсли;
КонецЦикла;
Снимок.Вставить("ПрименяемыйСписокМодулей", Модули);
Если Профиль.RightExtension Тогда
Снимок.Вставить("ПовышениеПравРасширением", "Повышение разрешено по этому флагу");
Иначе
Снимок.Вставить("ПовышениеПравРасширением", "Общее повышение запрещено, но список ролей может разрешить конкретное право");
КонецЕсли;
РолиПрав = СтрРазделить(Профиль.RightExtensionDefinitionRoles, ";", Ложь);
РолиПривилегий = СтрРазделить(Профиль.PrivilegedModeRoles, ";", Ложь);
Снимок.Вставить("РолиОграниченияПовышения", РолиПрав);
Снимок.Вставить("РолиДляОграниченногоПривилегированногоРежима", РолиПривилегий);
Снимок.Вставить("РолиПривилегийПрименимыПоФлагу", НЕ Профиль.FullPrivilegedMode);
Возврат СериализоватьСвойСнимок(Снимок);
КонецФункции
&НаСервереБезКонтекста
Функция СериализоватьСвойСнимок(Снимок)
Писатель = Новый ЗаписьJSON;
Писатель.УстановитьСтроку();
ЗаписатьJSON(Писатель, Снимок);
Возврат Писатель.Закрыть();
КонецФункции
&НаСервереБезКонтекста
Функция УчебныйЛокальныйУзел(ИмяУзла, ЛокальноеИмя)
Возврат НРег(ИмяУзла) = ЛокальноеИмя ИЛИ НРег(ИмяУзла) = "localhost" ИЛИ ИмяУзла = "127.0.0.1";
КонецФункции
Разбор по шагам
Проверить имя учебной конфигурации, типы портов и реквизитов до COM. Порты целые в диапазоне 1..65535; секреты не сериализуются.
ConnectAgent обращается только к 127.0.0.1. ConnectionString должна совпасть с построенной строкой без паролей. COM AuthenticateAgent принимает имя, пароль, в отличие от русскоязычного API ras.
Выбрать УчебныйКластер85 по точному имени, локальному хосту и порту менеджера. Отсутствие или неоднозначность не заменяются выбором первого элемента.
Проверить краткое описание УчебнаяБаза85 и точный маркер. Каталог живых локальных процессов позволяет взять настоящий порт|PID, а не подставить 1545 или придуманный PID.
ConnectWorkingProcess использует найденный динамический порт процесса, не порт агента или ras. До аутентификации базы читаются только Name и Descr.
AddAuthentication принимает только имя администратора базы и пароль, не дополнительный аргумент с именем базы. После него заново выбрать свою базу; полные поля читаются только далее.
В конце показать явно перечисленные скалярные поля JSON. После успеха или ошибки очищаются все три пароля и снимается флаг Занято.
После полного выбора собственного стенда проверить назначение обычного профиля, его точное имя и маркер описания. Чужой или неназначенный профиль не принимать.
Прочитать оба списка модулей и выбрать применяемый по AllModulesExtension. Один список разрешающий, другой запрещающий.
Разделять собственную фактическую строку по ;. Полное имя объекта означает все его модули; полное имя модуля — конкретный модуль, не произвольный BSL-код.
В COM RightExtensionDefinitionRoles документирован строкой; проверить тип перед СтрРазделить. Не копировать тип Булево из другого административного интерфейса.
RightExtension=False запрещает общее повышение, но наличие требуемого права хотя бы у одной роли этого списка может допустить повышение конкретного права.
PrivilegedModeRoles относится к безопасному исполнению, если FullPrivilegedMode не установлен. Это не список всех ролей текущего пользователя.
Изменение состава ролей учитывается после перезапуска текущих сеансов и для новых сеансов. Урок не меняет строку и не перезапускает сеансы.
Показываем настройки, не вычисляем фактическую матрицу RLS и прав выбранного пользователя из одного профиля.
Как проверить результат
РежимМодулей соответствует фактическому AllModulesExtension, выбран именно соответствующий список.
Оба списка ролей получены из реальных строк COM, не из выдуманного массива и не из значения Булево.
В примере нет изменения ролей, перезапуска сеанса, загрузки расширения или утверждения об эффективных правах пользователя.
Ожидаемый результат
Правила расширения и привилегий объяснены по настоящим спискам собственного профиля с корректными исключениями.
На что обратить внимание
COM здесь работает в серверном Windows-процессе. Loopback означает эту машину, не компьютер тонкого клиента; Linux и незарегистрированный соединитель этому уроку не соответствуют.
Присутствие учебных имён и маркера не заменяет права доступа. Не запускайте в рабочем кластере; отделите стенд от production.
Порт агента, порт менеджера кластера, порт ras и динамический порт рабочего процесса — разные значения.
COMSafeArray перечисляется циклом Для Каждого. Это не Массив 1С и не список UUID ras; не приписывайте ему методы или свойства другой коллекции.
Снимки и выбранные процессы могут устареть между запросами. После перезапуска повторите каталог; не пытайтесь автоматически завершить мешающий процесс.
Сырые COM-ошибки могут раскрывать чувствительные сведения. Разбирайте подготовку в отладчике своего стенда, не добавляйте ОписаниеОшибки в публичный JSON.
Имена модулей и объектов в этих строках имеют специальное назначение; не выполняйте их через Выполнить или Вычислить.
Пустой список, общий флаг и конкретное право — разные условия. Снимок не заменяет проверку прав в тестовой базе.
Текст роли не доказывает, что она существует в любой конфигурации. Перенос профиля требует отдельной сверки метаданных.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.