В практике разработчика 1С иногда возникают ситуации, которые кажутся нелогичными с точки зрения настроек в Конфигураторе. Одной из таких проблем является ситуация, когда пользователю назначена роль, дающая право на просмотр конкретной команды справочника, но программная проверка через ПравоДоступа() упорно возвращает Ложь. Особенно часто это встречается в сложных типовых решениях, таких как 1С:Документооборот.
В данной статье мы подробно разберем, почему платформа может блокировать доступ к командам, как на это влияют свойства ролей и что делать, если стандартные методы исправления не помогают. Проанализируем ситуацию по шагам, от простых настроек до глубоких манипуляций с метаданными.
Первое, на что мы должны обратить внимание — это фундаментальное свойство роли в дереве метаданных. Разберем, как 1С обрабатывает иерархию прав. У каждой роли есть свойство «Независимые права подчиненных объектов». Посмотрим, как оно влияет на доступ к командам:
Проанализируем ситуацию автора: если в роли БазовыеПраваДокументооборот этот флаг снят, то проверка ПравоДоступа("Просмотр", Метаданные.Справочники.Файлы.Команды.ВставитьШтрихкодВФайл) будет возвращать Ложь до тех пор, пока в этой конкретной роли не будет добавлено право на просмотр справочника Файлы. Тот факт, что право на справочник дается другой ролью, для платформы в данном режиме может быть не аргументом при проверке конкретного метаданного команды.
Важно помнить, что для интерактивных команд критическим является право Просмотр (View). Однако это право не существует в вакууме — оно является функциональной надстройкой над правом Чтение (Read). Выясним причину возможного отказа через код:
// Простая проверка прав на объект и команду
ДоступКОбъекту = ПравоДоступа("Просмотр", Метаданные.Справочники.Файлы);
ДоступККоманде = ПравоДоступа("Просмотр", Метаданные.Справочники.Файлы.Команды.ВставитьШтрихкодВФайл);
Если ДоступКОбъекту И Не ДоступККоманде Тогда
Сообщить("Проблема в правах конкретной роли на подчиненный объект");
КонецЕсли;
Если программная проверка показывает отсутствие прав, хотя визуально в Конфигураторе галочки стоят, мы переходим к анализу целостности метаданных.
Рассмотрим специфический флаг в свойствах роли: «Устанавливать права для новых собственных объектов». Эта настройка определяет поведение роли при обновлении конфигурации и добавлении новых объектов разработчиком (или поставщиком в типовом релизе).
Если в вашей конфигурации роль была модифицирована или снята с поддержки, а затем в новом релизе поставщик добавил команду ВставитьШтрихкодВФайл, то при выключенном флаге «Устанавливать права для новых объектов» права на эту команду в роли не проставятся автоматически. Более того, иногда возникает эффект «фантомных галочек», когда в Конфигураторе право отображается как установленное, но в фактическую таблицу прав базы данных (хранящуюся внутри SQL или файловой БД) запись не попадает.
Если вы убедились, что роль назначена, флаги наследования проверены, а ПравоДоступа() все равно возвращает Ложь, воспользуемся следующими методами восстановления логической целостности:
Самый простой, но эффективный шаг. Очистите кэш на стороне клиента (удаление базы из списка и добавление заново) и, что более важно, перезапустите службу кластера серверов 1С (если база клиент-серверная). Платформа кэширует структуру прав, и иногда изменения в ролях не подхватываются сеансом пользователя мгновенно.
Как показала практика обсуждения на форуме, создание новой роли «чистым копированием» часто решает проблему. Рассмотрим этот процесс:
ДополнительныеПраваНаФайлы).ПравоДоступа() возвращает Истина, значит, исходная роль (в данном случае БазовыеПраваДокументооборот) имеет внутренние повреждения структуры метаданных.
В редких случаях, когда конфигурация базы данных расходится с основной конфигурацией, помогает радикальный метод:
.cf.Проанализируем влияние расширений. Если в базе подключены расширения, они могут перекрывать права основной конфигурации. Даже если вы удаляли расширение, попробуйте выполнить «Тестирование и исправление» с включенным пунктом «Проверка логической целостности». Платформа должна вычистить остатки прав удаленных расширений, которые могут конфликтовать с основными ролями.
Резюме: Если ПравоДоступа() возвращает неверный результат для команды, проверьте флаг независимых прав подчиненных объектов и попробуйте создать дублирующую роль. В 90% случаев это решает проблему, связанную с некорректным обновлением прав в типовых конфигурациях.