Как настроить ограничение прав доступа к документам по конкретному складу в 1С?

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

При настройке прав доступа в 1С часто возникает задача ограничить видимость документов для пользователей в зависимости от склада, указанного в документе. Например, менеджер склада "А" не должен видеть документы, относящиеся к складу "Б". Стандартный механизм RLS (ограничение доступа на уровне записей) позволяет это сделать, но при его настройке можно столкнуться с неожиданным поведением, когда ограничение не срабатывает. Разберем, как правильно настроить такое ограничение и какие нюансы нужно учесть.

Проанализируем ситуацию: вы создали роль с ограничением доступа к документу, например, РеализацияТоваровУслуг, по полю Склад. Однако пользователь с этой ролью по-прежнему видит все документы, а не только те, что относятся к разрешенному ему складу. Выясним причину и найдем решение.

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

Основная причина, по которой простое ограничение вида ГДЕ Склад В (&СписокРазрешенныхСкладов) не работает, заключается в том, что права должны быть настроены не только на сам документ, но и на все связанные с ним регистры и справочники, которые используются для отображения данных в динамических списках или отчетах.

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

Важный момент: если в документе поле Склад не заполнено (например, для услуг), то условие ГДЕ Склад = <Значение> отсечет и такие документы. Это тоже нужно учитывать при написании шаблона ограничения.

Решение: создание комплексного шаблона ограничения доступа

Для корректной работы RLS необходимо создать шаблон ограничения, который будет применяться ко всем объектам, где есть измерение или реквизит "Склад". Этот шаблон должен учитывать все возможные сценарии, включая незаполненное поле склада.

Разберем по шагам, как создать такой шаблон и применить его.

  1. Создание шаблона ограничения

    Перейдите в конфигураторе в раздел "Общие" -> "Шаблоны ограничений". Создайте новый шаблон, назовем его, например, ОграничениеПоСкладам. Этот шаблон будет содержать текст запроса, который система будет встраивать в запросы к данным.

    В текст шаблона добавим следующий код:

    
    #Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
        (ТекущаяТаблица.Склад В (
                ВЫБРАТЬ
                    ДоступныеСклады.Склад
                ИЗ
                    РегистрСведений.ДоступныеСкладыПользователей КАК ДоступныеСклады
                ГДЕ
                    ДоступныеСклады.Пользователь = &ТекущийПользователь
            )
            ИЛИ ТекущаяТаблица.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
            ИЛИ ТекущаяТаблица.Склад ЕСТЬ NULL
        )
    #КонецЕсли
    
  2. Разбор кода шаблона

    Давайте подробно проанализируем, что делает этот код:

    • #Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда ... #КонецЕсли — это директива препроцессора. Она позволяет включать или выключать RLS с помощью функциональной опции ОграничениеДоступаНаУровнеЗаписейУниверсально. Это удобно для администрирования.
    • ТекущаяТаблица.Склад В (...) — это основное условие. Оно проверяет, входит ли значение поля Склад из текущей таблицы (документа, регистра и т.д.) в список разрешенных складов.
    • Вложенный запрос ВЫБРАТЬ ДоступныеСклады.Склад ИЗ РегистрСведений.ДоступныеСкладыПользователей ... получает список разрешенных складов для текущего пользователя (&ТекущийПользователь — это стандартный параметр RLS). Вам нужно будет предварительно создать регистр сведений ДоступныеСкладыПользователей с измерениями Пользователь и Склад, где вы будете указывать соответствия.
    • ИЛИ ТекущаяТаблица.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) — это условие разрешает доступ к документам, где поле Склад не заполнено (например, при оказании услуг).
    • ИЛИ ТекущаяТаблица.Склад ЕСТЬ NULL — аналогично предыдущему пункту, обрабатывает ситуацию, когда значение поля равно NULL.
  3. Применение шаблона к ролям и объектам

    Теперь нужно применить созданный шаблон. Создайте или измените существующую роль (например, "Менеджер по продажам").

    На вкладке "Ограничения доступа" найдите нужные объекты метаданных. Это не только документы (РеализацияТоваровУслуг, ЗаказКлиента и т.д.), но и все регистры, которые они используют и в которых есть измерение Склад. Например:

    • Документ.РеализацияТоваровУслуг
    • Документ.ЗаказКлиента
    • РегистрНакопления.ТоварыНаСкладах
    • РегистрНакопления.СвободныеОстатки
    • И другие...

    Для каждого такого объекта в поле "Тип ограничения" выберите "Ограничение доступа к данным", а в поле "Ограничение доступа" вставьте текст:

    #ПоШаблону("ОграничениеПоСкладам")

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

Альтернативный вариант шаблона с использованием псевдонима

Если в разных документах или регистрах поле склада называется по-разному, можно использовать псевдоним #Параметр(1). Система автоматически подставит в него имя нужного поля.

Текст шаблона будет выглядеть так:


#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально #Тогда
    (#Параметр(1) В (
            ВЫБРАТЬ
                ДоступныеСклады.Склад
            ИЗ
                РегистрСведений.ДоступныеСкладыПользователей КАК ДоступныеСклады
            ГДЕ
                ДоступныеСклады.Пользователь = &ТекущийПользователь
        )
        ИЛИ #Параметр(1) = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
        ИЛИ #Параметр(1) ЕСТЬ NULL
    )
#КонецЕсли

При применении такого шаблона в роли нужно будет указать, какое поле использовать:

#ПоШаблону("ОграничениеПоСкладам", "Склад")

Или для другого документа:

#ПоШаблону("ОграничениеПоСкладам", "СкладОтправитель")

Финальные шаги и проверка

  1. Обновление базы данных. После внесения изменений в конфигурацию не забудьте обновить базу данных (F7).
  2. Заполнение регистра доступа. В режиме "Предприятие" заполните созданный вами регистр сведений ДоступныеСкладыПользователей, указав для каждого пользователя (или группы пользователей) разрешенные склады.
  3. Проверка. Зайдите в систему под пользователем, для которого настроено ограничение, и убедитесь, что он видит только документы по разрешенным складам.

Таким образом, ключ к успешной настройке RLS по складам — это комплексный подход. Необходимо ограничивать доступ не только к самим документам, но и ко всем связанным регистрам, используя единый, хорошо продуманный шаблон ограничения, который учитывает все возможные варианты, включая незаполненные значения.

← На главную