При настройке прав доступа в конфигурациях 1С часто возникает задача ограничить определенным сотрудникам (например, менеджерам по продажам или закупкам) доступ к финансовым документам — в частности, к исходящим платежным поручениям. Однако простое снятие прав в конфигураторе нередко приводит либо к тому, что документы продолжают отображаться в интерфейсе, либо к возникновению критических ошибок при проведении других документов (например, счетов-фактур или реализаций). Разберем причины такого поведения платформы и пошагово рассмотрим, как корректно настроить ограничения.
В платформе 1С действует принцип аддитивности прав (логическое «ИЛИ»): если у пользователя назначено несколько ролей, то право на просмотр или чтение объекта будет предоставлено, если оно включено хотя бы в одной из назначенных ролей. Проанализируем основные причины, по которым пользователи продолжают видеть документы:
Подотчетные лица, Базовые права, Самообслуживание или вспомогательные роли подсистем. Проверить наличие прав по конкретному пользователю программно можно с помощью функции:
ИмяПользователя = "Иванов";
НужныйДокумент = Метаданные.Документы.ПлатежноеПоручениеИсходящее;
ЕстьПраво = ПравоДоступа("Просмотр", НужныйДокумент, ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя));
Ключевая ошибка при ограничении доступа — одновременное отключение прав «Чтение» и «Просмотр» у учетных документов. Разберем принципиальное различие этих механизмов:
Когда вы снимаете флаг «Чтение» с документа ПлатежноеПоручениеИсходящее, любой встроенный запрос конфигурации, пытающийся прочитать данные этой таблицы в пользовательском сеансе без указания ключевого слова РАЗРЕШЕННЫЕ или без привилегированного режима, завершается системным исключением:
{ОбщийМодуль.УправлениеЗапасами.Модуль(865)}: Ошибка при вызове метода контекста (Выполнить) по причине: Недостаточно прав для работы с таблицей "Документ.ПлатежноеПоручениеИсходящее"
При проведении документов отгрузки, счетов-фактур или актов типовые алгоритмы конфигураций выполняют контроль расчетов с контрагентами, автоматический зачет авансов или расчет НДС. Для этого модуль проведения обращается к регистрам взаиморасчетов или выполняет прямые запросы к расчетным документам.
В таких регистрах измерение ДокументРасчетовСКонтрагентом имеет составной тип данных, включающий в себя как входящие, так и исходящие платежные документы. При соединении таблиц или разыменовании полей составного типа СУБД обращается ко всем входящим в тип таблицам. Отсутствие базового права «Чтение» приводит к аварийному завершению транзакции проведения.
Для решения поставленной задачи и исключения ошибок проведения выберем один из следующих подходов:
В настраиваемой роли оставьте установленным базовый флаг «Чтение», но снимите флаг «Просмотр», а также все зависимые интерактивные права: «Интерактивное добавление», «Редактирование», «Интерактивное удаление». В этом случае пользователи не смогут увидеть платежные документы в меню, формах списков и журналах, но механизмы проведения и расчетные модули продолжат работать без сбоев.
Если бизнес-требования диктуют полный запрет даже программного чтения данных пользователем (например, через отчеты), алгоритмы проведения зависимых документов необходимо перевести в привилегированный контекст, который временно отключает проверку прав:
УстановитьПривилегированныйРежим(Истина);
// Выполнение запроса к взаиморасчетам и расчетным документам
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Взаиморасчеты.ДокументРасчетов,
| Взаиморасчеты.СуммаОстаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК Взаиморасчеты";
Результат = Запрос.Выполнить();
УстановитьПривилегированныйРежим(Ложь);
Также можно вынести процедуры проведения в общие модули с установленным свойством «Привилегированный».
Если используется механизм RLS, в запросах отчетов и процедурах обязательно должно присутствовать ключевое слово РАЗРЕШЕННЫЕ. В этом случае при ограничении прав платформа не генерирует критическую ошибку, а просто исключает недоступные строки из результата выборки.