При настройке ограничений доступа на уровне записей (RLS) в таких конфигурациях, как «Комплексная автоматизация 1.1» или «Управление производственным предприятием 1.3», администраторы часто сталкиваются с проблемой: после включения ограничений по контрагентам из отчетов и списков пропадают документы, где контрагент не указан. Чаще всего это касается Отчетов о розничных продажах, где покупатель не персонифицирован. Разберем подробно, почему так происходит и какими способами можно решить эту задачу, сохранив при этом безопасность данных.
Рассмотрим механику работы системы. Когда мы включаем ограничение доступа, 1С модифицирует каждый запрос к базе данных, добавляя в него условие ГДЕ.... В типовом механизме КА 1.1 ограничение по контрагентам обычно строится на проверке вхождения контрагента в разрешенные Группы доступа контрагентов. Если в документе или записи регистра поле Контрагент содержит пустую ссылку, то система пытается найти для этой «пустоты» разрешенную группу доступа. Поскольку пустая ссылка не принадлежит ни к какой группе, условие RLS возвращает «Ложь», и запись скрывается из выборки. Это приводит к тому, что менеджеры видят некорректные остатки или неполную сумму продаж в отчетах.
Проанализируем наиболее технически правильный метод — внесение изменений в текст запроса ограничения в роли. Если у вас есть возможность вносить изменения в конфигурацию, мы можем явно разрешить чтение записей с пустой ссылкой.
Для этого в конфигураторе найдем нужную роль (например, МенеджерПоПродажам) и перейдем на вкладку «Права». Выберем объект Справочник.Контрагенты или соответствующий регистр накопления (например, Продажи). В окне настройки RLS нам необходимо добавить условие проверки на пустую ссылку. Типовой запрос часто использует шаблоны, но в общем виде нам нужно добиться следующей логики:
ГДЕ (Контрагент.Ссылка В (&СписокРазрешенныхГрупп))
ИЛИ (Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка))
ИЛИ (Контрагент ЕСТЬ NULL)
Разберем, что дают эти строки. Условие ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) позволяет системе игнорировать ограничение, если поле не заполнено. Использование ЕСТЬ NULL необходимо для корректной обработки левых соединений в сложных запросах отчетов. После внесения таких правок документы типа ОтчетОРозничныхПродажах, где контрагент пуст, станут доступны для чтения.
Рассмотрим вариант, предложенный опытными пользователями на форумах, который не требует программирования. Вместо того чтобы перечислять, какие группы разрешены, можно настроить доступ ко всем контрагентам, кроме определенных запрещенных групп.
Посмотрим на алгоритм настройки:
Выясним причину, почему это удобно: при создании нового контрагента, если менеджер забыл указать ему группу доступа, объект останется видимым для всех. Это избавляет от проблем, когда новые данные внезапно «исчезают» для сотрудников сразу после записи.
Проанализируем ситуацию, когда менеджеры должны видеть документы только своего отдела. В Отчете о розничных продажах и других первичных документах всегда заполнены реквизиты Ответственный или Подразделение. Мы можем настроить RLS не по справочнику Контрагенты, а по иерархии подразделений.
В этом случае логика доступа будет выглядеть так: «Пользователь видит все документы, где Подразделение совпадает с его Подразделением или входит в разрешенный список». При такой настройке заполненность контрагента вообще перестает влиять на видимость документа. Это особенно актуально для розничной торговли, где продажи идут «обезличенно».
Если менять программный код RLS нельзя, а отчеты должны сходиться, можно применить административный метод. Заведем в справочнике Контрагенты специальный элемент, например, РозничныйПокупатель. Этому элементу присвоим общую группу доступа, которая открыта всем менеджерам.
Рассмотрим шаги по реализации:
Отчетов о розничных продажах укажем этого контрагента в качестве значения по умолчанию.Таким образом, поле Контрагент всегда будет заполнено ссылкой, имеющей корректную группу доступа, и RLS пропустит эти записи в отчеты Продажи и ПродажиСебестоимость.
Многие забывают, что в Комплексной автоматизации 1.1 ограничение может быть установлено не только на справочники и документы, но и на Регистры накопления. Если вы настроили доступ к справочнику, но менеджер все равно видит пустые строки в отчете или не видит их вовсе, проверьте права на регистры:
ПродажиПродажиСебестоимостьВзаиморасчетыСКонтрагентамиПосмотрим на пример: если в регистре Продажи включен RLS по измерению Контрагент, то текст ограничения в регистре должен дублировать логику разрешения пустых ссылок, иначе данные будут отсекаться еще на этапе запроса к виртуальным таблицам регистра. Для внесения правок используйте конструкцию ГДЕ непосредственно в настройках доступа к регистрам в конфигураторе.
Для решения проблемы видимости пустых контрагентов в RLS мы рекомендуем комбинированный подход:
Во-первых, если есть ресурсы разработчика, внесите правку в шаблон RLS, добавив условие ИЛИ Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка).
Во-вторых, проверьте, чтобы аналогичные условия были добавлены в права доступа к регистрам накопления, по которым строятся отчеты.
В-третьих, рассмотрите возможность использования «разрешающей» политики доступа (доступно всё, что не запрещено), что значительно упрощает администрирование системы в долгосрочной перспективе.