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

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация Управленческий учет IT и автоматизация бизнеса
← На главную

При настройке прав доступа в конфигурациях 1С часто возникает задача ограничить определенным сотрудникам (например, менеджерам по продажам или закупкам) доступ к финансовым документам — в частности, к исходящим платежным поручениям. Однако простое снятие прав в конфигураторе нередко приводит либо к тому, что документы продолжают отображаться в интерфейсе, либо к возникновению критических ошибок при проведении других документов (например, счетов-фактур или реализаций). Разберем причины такого поведения платформы и пошагово рассмотрим, как корректно настроить ограничения.

Почему документы остаются видны после снятия прав в роли

В платформе 1С действует принцип аддитивности прав (логическое «ИЛИ»): если у пользователя назначено несколько ролей, то право на просмотр или чтение объекта будет предоставлено, если оно включено хотя бы в одной из назначенных ролей. Проанализируем основные причины, по которым пользователи продолжают видеть документы:

  1. Пересечение ролей у пользователя. Очень часто право на работу с банковскими или кассовыми документами входит в неочевидные роли, такие как Подотчетные лица, Базовые права, Самообслуживание или вспомогательные роли подсистем. Проверить наличие прав по конкретному пользователю программно можно с помощью функции:
    
    ИмяПользователя = "Иванов";
    НужныйДокумент = Метаданные.Документы.ПлатежноеПоручениеИсходящее;
    ЕстьПраво = ПравоДоступа("Просмотр", НужныйДокумент, ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя));
    
  2. Права на журналы документов. Документы могут открываться пользователем не только через персональные списки, но и через общие журналы документов (например, журнал «Расчетные документы банк», «Банковские документы» или «Документы контрагентов»). Если в роли сняты права на сам документ, но оставлены права на чтение и просмотр журнала, платформа может продолжать отображать записи в составе журнала.
  3. Влияние RLS (ограничения доступа на уровне записей). Текст шаблона RLS применяется только в том случае, если на объект установлено базовое право (флаг «Чтение»). Если флаг «Чтение» снят полностью, условия ограничения доступа не обрабатываются СУБД, так как доступ к таблице заблокирован целиком на уровне метаданных.

Разница между правами «Чтение» и «Просмотр»

Ключевая ошибка при ограничении доступа — одновременное отключение прав «Чтение» и «Просмотр» у учетных документов. Разберем принципиальное различие этих механизмов:

  1. «Просмотр» (интерактивное право). Отвечает за интерфейсную видимость объекта. Оно определяет, отображается ли документ в командном интерфейсе, меню подсистем, динамических списках, журналах и формах выбора.
  2. «Чтение» (базовое право СУБД). Предоставляет право платформе и коду конфигурации выполнять выборку данных из соответствующей таблицы базы данных. Это право требуется для выполнения запросов при проведении документов, расчета взаиморасчетов, списания партий и восстановления последовательностей.

Когда вы снимаете флаг «Чтение» с документа ПлатежноеПоручениеИсходящее, любой встроенный запрос конфигурации, пытающийся прочитать данные этой таблицы в пользовательском сеансе без указания ключевого слова РАЗРЕШЕННЫЕ или без привилегированного режима, завершается системным исключением:

{ОбщийМодуль.УправлениеЗапасами.Модуль(865)}: Ошибка при вызове метода контекста (Выполнить) по причине: Недостаточно прав для работы с таблицей "Документ.ПлатежноеПоручениеИсходящее"

Почему проведение счета-фактуры или реализации требует чтения платежек

При проведении документов отгрузки, счетов-фактур или актов типовые алгоритмы конфигураций выполняют контроль расчетов с контрагентами, автоматический зачет авансов или расчет НДС. Для этого модуль проведения обращается к регистрам взаиморасчетов или выполняет прямые запросы к расчетным документам.

В таких регистрах измерение ДокументРасчетовСКонтрагентом имеет составной тип данных, включающий в себя как входящие, так и исходящие платежные документы. При соединении таблиц или разыменовании полей составного типа СУБД обращается ко всем входящим в тип таблицам. Отсутствие базового права «Чтение» приводит к аварийному завершению транзакции проведения.

Способы корректной настройки ограничений

Для решения поставленной задачи и исключения ошибок проведения выберем один из следующих подходов:

  1. Разделение прав «Чтение» и «Просмотр» (рекомендуемый способ):

    В настраиваемой роли оставьте установленным базовый флаг «Чтение», но снимите флаг «Просмотр», а также все зависимые интерактивные права: «Интерактивное добавление», «Редактирование», «Интерактивное удаление». В этом случае пользователи не смогут увидеть платежные документы в меню, формах списков и журналах, но механизмы проведения и расчетные модули продолжат работать без сбоев.

  2. Использование привилегированного режима при проведении:

    Если бизнес-требования диктуют полный запрет даже программного чтения данных пользователем (например, через отчеты), алгоритмы проведения зависимых документов необходимо перевести в привилегированный контекст, который временно отключает проверку прав:

    
    УстановитьПривилегированныйРежим(Истина);
    
    // Выполнение запроса к взаиморасчетам и расчетным документам
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Взаиморасчеты.ДокументРасчетов,
        |   Взаиморасчеты.СуммаОстаток
        |ИЗ
        |   РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК Взаиморасчеты";
    Результат = Запрос.Выполнить();
    
    УстановитьПривилегированныйРежим(Ложь);
    

    Также можно вынести процедуры проведения в общие модули с установленным свойством «Привилегированный».

  3. Настройка RLS с использованием выборки разрешенных данных:

    Если используется механизм RLS, в запросах отчетов и процедурах обязательно должно присутствовать ключевое слово РАЗРЕШЕННЫЕ. В этом случае при ограничении прав платформа не генерирует критическую ошибку, а просто исключает недоступные строки из результата выборки.

← На главную