Информация о функционировании механизма ограничений прав доступа к данным на уровне записей (1Cv8)

Материал из КинтВики
Перейти к: навигация, поиск

Источник: http://aleks1c.blogspot.com/2009/07/blog-post.html

Общие замечания

Механизм ограничений доступа к данным позволяет управлять правами доступа не только на уровне объектов метаданных, но и на уровне объектов базы данных 1С:Предприятия 8.1. Для ограничения доступа к данным могут быть использованы следующие объекты 1С:Предприятия:

  • Роли. Являются объектами метаданных. Их создание и настройка описаны в документации в разделе "Роли и права доступа" книги "1С:Предприятие 8.1 Конфигурирование и администрирование".
  • Параметры сеанса. Также являются объектами метаданных. Их создание и настройка описаны в разделе "Параметры сеанса" книги "1С:Предприятие 8.1 Конфигурирование и администрирование".
  • Привилегированные общие модули. О создании и настройке общих модулей можно прочитать в разделе "Общие модули" книги "1С:Предприятие 8.1 Конфигурирование и администрирование".
  • Ключевое слово "РАЗРЕШЕННЫЕ" в языке запросов. (См. раздел "Работа с запросами" книги "Описание встроенного языка. Часть 2").

Совместное использование перечисленных объектов позволяет обеспечить максимальную гибкость при необходимости разграничения прав доступа к данным между пользователями, выполняющими различные функции.

Ограничения доступа

Ограничения доступа к данным могут накладываться на чтение или изменение объектов базы данных. Текущий пользователь имеет право прочитать или изменить некоторый объект базы данных только в том случае, если ограничение доступа предоставляет ему такое право. В противном случае операция чтения или изменения этого объекта базы данных выполнена не будет.

Для объектов базы данных следующих видов могут быть наложены различные ограничения на разные виды изменений (добавление, модификацию, удаление):

  • Планы обмена;
  • Справочники;
  • Документы;
  • Планы видов характеристик;
  • Планы счетов;
  • Планы видов расчета;
  • Бизнес-процессы;
  • Задачи.


Для следующих видов объектов базы данных возможно наложение ограничений на чтение не только всего объекта целиком, но и на чтение отдельных его полей:

  • Планы обмена;
  • Справочники;
  • Документы;
  • Журналы документов;
  • Планы видов характеристик;
  • Планы счетов;
  • Планы видов расчета;
  • Регистры сведений;
  • Бизнес-процессы;
  • Задачи.


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

Ограничения доступа содержатся в ролях, они могут быть указаны для большинства объектов метаданных и записываются на специальном языке, являющемся подмножеством языка запросов. Главной частью ограничения является условие, истинное значение которого для некоторого объекта базы данных означает наличие у текущего пользователя права на выполнение чтения или изменения этого объекта базы данных. Причем, изменение записи считается допустимым, если запись не противоречит ограничениям на изменение как до изменения, так и после. В ограничении могут использоваться:

  • Поля объекта базы данных на который накладывается ограничение (основного объекта ограничения) и выражения над ними. Например, если ограничение накладывается на чтение элементов справочника "Контрагенты", то в ограничении могут использоваться поля справочника "Контрагенты" и его табличных частей. В частности, наиболее простые ограничения на чтение элементов справочника "Контрагенты" могут выглядеть так:


ГДЕ 
        Наименование = "Кирпичный завод"

или

		ГДЕ 
        Продукция.Наименование = "Кирпич красный"


где "Продукция" - это табличная часть справочника "Контрагенты".

  • Поля объектов базы данных, доступных по ссылкам, хранящимся в основном объекте ограничения, и выражения над ними. Например, если реквизит "ОсновнойМенеджер" справочника "Контрагенты" имеет тип ссылки на справочник "Пользователи", то ограничение доступа может иметь, например, следующий вид:


ГДЕ 
        ОсновнойМенеджер.Код = "Иванов"

или

		ГДЕ 
        ОсновнойМенеджер.ФизическоеЛицо.Наименование = "Петровский"
  • Поля объектов базы данных, связанных с основным объектом ограничения некоторыми условиями, и выражения над ними. Например, на чтение элементов справочника "Контрагенты" может быть наложено следующее ограничение:


Контрагенты 
     ИЗ 
        Справочник.Контрагенты КАК Контрагенты 
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи 
           ПО Контрагенты.ОсновнойМенеджер.Наименование = Пользователи.Наименование 
     ГДЕ 
        Пользователи.ФизическоеЛицо.Наименование = "Петровский"


в котором используются поля элементов справочника "Пользователи", связанных с данным элементом справочника "Контрагенты" по значению полей "Наименование".

  • Вложенные запросы в качестве набора записей для связывания с основным объектом ограничения или в качестве операнда операций сравнения В или НЕ В. Во вложенных запросах могут использоваться любые средства языка запросов, кроме оператора В ИЕРАРХИИ, предложения ИТОГИ и некоторых виртуальных таблиц, в частности ОстаткиИОбороты. В следующем примере ограничения на чтение из справочника "Контрагенты" вложенный запрос используется в качестве набора записей для связывания с основным объектом ограничения:


Контрагенты 
     ИЗ 
        Справочник.Контрагенты КАК Контрагенты 
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
                             Пользователи.Наименование, Пользователи.ФизическоеЛицо 
                          ИЗ 
                             Справочник.Пользователи КАК Пользователи 
                          ГДЕ 
                             Пользователи.Код > "Петечкин") КАК Пользователи 
           ПО Контрагенты.ОсновнойМенеджер.Наименование = Пользователи.Наименование 
     ГДЕ 
        Пользователи.ФизическоеЛицо.Наименование = "Петровский"


Далее приведен пример ограничения на чтение из справочника "ПаспортныеДанныеФизЛиц", в котором вложенный запрос используется в качестве операнда операции сравнения В:


ПаспортныеДанныеФизЛиц 
     ГДЕ 
        ПаспортныеДанныеФизЛиц.ФизЛицо В (ВЫБРАТЬ РАЗЛИЧНЫЕ 
                                             Работники.ФизЛицо КАК ФизЛицо 
                                          ИЗ 
                                             РегистрСведений.Работники КАК Работники)


Важно, что результаты вложенных запросов, которые используются в ограничении, не должны содержать табличных частей. Если во вложенном запросе необходимо получить данные из табличной части, то в разделе ИЗ вложенного запроса необходимо обращаться непосредственно к табличной части. Например, вместо:


ВЫБРАТЬ Ссылка КАК Ссылка, Продукция.Наименование КАК НаименованиеПродукции 
     ИЗ Справочник.Контрагенты


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


ВЫБРАТЬ Ссылка КАК Ссылка, Наименование КАК НаименованиеПродукции 
     ИЗ Справочник.Контрагенты.Продукция
  • Параметры сеанса, в том числе и в составе выражений. Например, на чтение элементов справочника "ГруппыПисемЭлектроннойПочты" может быть задано следующее ограничение доступа:
ГДЕ
Владелец.ДоступКУчетнойЗаписи.Пользователь = &ТекущийПользователь И
Владелец.ДоступКУчетнойЗаписи.Администрирование = ИСТИНА

где "ТекущийПользователь" - это параметр сеанса.

В ограничениях на объекты базы данных следующих типов могут быть использованы не все поля основного объекта данных ограничения:

  • В регистрах накопления ограничения доступа могут содержать только измерения основного объекта ограничения.
  • В регистрах бухгалтерии в ограничениях можно использовать только балансовые измерения основного объекта ограничения.

Действия ограничения доступа

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

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

Ограничения доступа к данным накладываются на объекты базы данных в момент обращения 1С:Предприятия к базе данных. В клиент-серверном варианте 1С:Предприятия наложение ограничений выполняется на сервере 1С:Предприятия.

Способ действия ограничений, выбираемый для выполнения каждой операции над данными, определяется назначением этой операции и степенью ответственности ее результатов. В частности, способ "разрешенные" используется при отображении динамических списков и некоторых других интерактивных действиях. Способ "все" используется при выполнении любых операций с прикладными объектами из встроенного языка 1С:Предприятия, в том числе при любых изменениях объектов базы данных. Поэтому, например, могут возникнуть затруднения при построении отбора для метода "Выбрать" менеджеров справочников, документов и других с последующим обходом результата в том случае, если на соответствующий объект установлено достаточно сложное ограничение, поскольку не всякое условие в ограничении прав доступа может быть адекватно представлено в виде отбора для метода "Выбрать".

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

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


ВЫБРАТЬ 
   КонтактнаяИнформацияСрезПервых.Представление 
ИЗ 
   РегистрСведений.КонтактнаяИнформация.СрезПоследних(, Тип = &Тип) КАК КонтактнаяИнформацияСрезПервых 
ГДЕ 
   КонтактнаяИнформацияСрезПервых.Тип = &Тип


Механизм наложения ограничений.

Любая операция над данными, хранимыми в базе данных, в 1С:Предприятии 8.1 в конечном счете приводит к обращению к базе данных с некоторым запросом на чтение или изменение данных. В процессе исполнения запросов к базе данных внутренними механизмами 1С:Предприятия происходит наложение ограничений доступа. При этом

  • Формируется список прав (чтение, добавление, изменение, удаление), список таблиц базы данных и список полей, используемых этим запросом.
  • Из всех ролей текущего пользователя выбираются ограничения доступа к данным для всех прав, таблиц и полей, задействованных в запросе. При этом если какая-нибудь роль не содержит ограничений доступа к данным какой-нибудь таблицы или поля, то это значит, что в данной таблице доступны значения требуемых полей из любой записи. Иначе говоря, отсутствие ограничения доступа к данным означает наличие ограничения вида "ГДЕ Истина".
  • Получаются текущие значения всех параметров сеанса, участвующих в выбранных ограничениях. Причем для выборки значения параметра от текущего пользователя не требуется наличие права на получение значения этого параметра. Однако, если значение некоторого параметра сеанса не было установлено, то произойдет ошибка и запрос к базе данных выполнен не будет.
  • Ограничения, полученные из одной роли, объединяются операцией "И".
  • Ограничения, полученные из разных ролей, объединяются операцией "ИЛИ".
  • Построенные условия добавляются к SQL-запросам, с которыми 1С:Предприятие обращается к СУБД. При обращении к данным со стороны условий ограничения доступа проверка прав не выполняется (ни к объектам метаданных, ни к объектам базы данных). Причем, механизм добавления условий зависит от выбранного способа действия ограничений "все" или "разрешенные"

Способ "все"

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

Способ "разрешенные"

При наложении ограничений способом "разрешенные" к SQL-запросам добавляются такие условия, чтобы запрещенные текущему пользователю записи не оказывали влияния на результат запроса. Иначе говоря, при наложении ограничений в режиме "разрешенные" запрещенные данному пользователю записи считаются отсутствующими.

Другие объекты, связанные с ограничениями доступа к данным

При разработке конфигураций с использованием ограничений доступа к данным могут оказаться полезными такие объекты метаданных, как параметры сеанса и общие модули с флагом "привилегированный".

Параметры сеанса

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

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

  • Параметры сеанса являются объектами метаданных, что позволяет 1С:Предприятию осуществлять повышенный контроль за их использованием.
  • Параметры сеанса имеют тип, причем набор допустимых типов ограничен типами, перечисленными ниже. Их важной общей чертой является невозможность изменения внутреннего состояния для объектов этих типов.
    • примитивные типы (подробнее см. книгу «1С:Предприятие 8.1. Описание встроенного языка» глава 1 «Общее описание языка» параграф «Примитивные типы данных»;.
    • ХранилищеЗначения;
    • ОписаниеТипов;
    • ссылки на объекты базы данных;
    • УникальныйИдентификатор;
    • ФиксированныйМассив, элементами которого могут быть значения перечисленных типов, включая ФиксированныйМассив. ФиксированныйМассив не допускает никаких изменений своего содержимого и может быть сконструирован из объекта типа "Массив";
    • ВидДвиженияНакопления;
    • ВидСчета;
    • ВидДвиженияБухгалтерии.
  • Для установки или получения значения параметра сеанса текущий пользователь должен быть наделен соответствующим правом.
  • В клиент-серверном варианте 1С:Предприятия значения параметров сеанса хранятся на сервере и доступны как с сервера, так и с клиента.
  • Параметры сеанса не имеют значений по умолчанию. Попытка получить значение параметра сеанса до его установки приведет к ошибке.
  • Параметры сеанса доступны как из встроенного языка 1С:Предприятия (например: ПараметрыСеанса.ТекущийПользователь = ИмяПользователя() или Пользователь = ПараметрыСеанса.ТекущийПользователь), так и из ограничений доступа (например: Документ.Отчет.Пользователь = &ТекущийПользователь).

В последнем случае для получения значения параметра сеанса наличия у текущего пользователя соответствующего права не требуется.

Привилегированные общие модули

Если для общего модуля установлен флаг "Привилегированный", то исполнение процедур и функций этого модуля приобретает важную специфику:

  • В клиент-серверном варианте 1С:Предприятия привилегированным может быть только тот модуль, который исполняется на сервере;
  • Исполнение процедур и функций привилегированного модуля и всего, что из них вызвано, выполняется при выключенной системе ограничения прав, как к объектам метаданных, так и к данным. Таким образом, из привилегированного модуля может быть выполнена любая операция над любыми объектами даже в том случае, если текущий пользователь не имеет соответствующих прав.


Привилегированные модули предназначены для начальной установки значений параметров сеанса, используемых в ограничениях доступа к данным. Еще общие модули могут быть использованы для некоторых целостных действий над данными со стороны пользователя с ограниченными правами. Например, если в функции пользователя входит ввод и проведение документов, но пользователь не должен иметь доступа к данным, на которые влияет проведение документа, то выполнение операции проведения может быть вынесено в привилегированный модуль. Это позволит пользователю проводить документы без предоставления ему прав на другую информацию (регистры, например).

Общие рекомендации по ограничению прав

  • Для гибкого управления доступом пользователей к данным в соответствии с функциями при установке ограничений доступа к данным, рекомендуется придерживаться следующих принципов:
  • Выберите совокупность информации (может быть зависимой от текущего пользователя), для которой целесообразна предварительная подготовка. Выбранная информация должна, с одной стороны, максимально упростить ограничения доступа к данным, а с другой стороны, не должна иметь слишком большой объем. Распределите ее по параметрам сеанса.
  • Создайте привилегированный общий модуль и установите в нем значения параметров сеанса. Это должно быть сделано до первого обращения к данным, на которые необходимо установить ограничения, за исключением обращений к данным из привилегированных модулей.
  • Задайте ограничения доступа к тем данным, для которых это оправдано (данные являются секретными или наиболее важными для сохранения целостности системы). Необходимо иметь в виду, что установка ограничения доступа может привести к замедлению любого обращения к этим данным. Излишняя сложность ограничений также может привести к замедлению.
  • При необходимости обеспечить выполнение некоторого ограниченного количества операций над данными со стороны пользователя, которому полный доступ к этим данным давать нецелесообразно, вынесите эти действия в привилегированные модули.
  • Выполняя операции с различными объектами 1С:Предприятия из встроенного языка, необходимо иметь в виду, что некоторые объекты могут выполнять обращения к некоторым полям базы данных неявно. При этом наложение ограничений доступа выполняется способом "Все", что может приводить к неожиданным сообщениям о нарушении прав доступа. Поэтому ограничивать доступ к таким полям нельзя. В частности:
  • Включение автонумерации или контроля уникальности номеров объектов таких типов, как справочники, документы, планы видов характеристик, планы счетов, планы видов расчета, бизнес-процессы, задачи приводит к неявному чтению поля "Код" (для документов, бизнес процессов и задач - "Номер") при создании нового объекта и при его записи. В справочниках и других объектах, допускающих иерархию, если в качестве серии кодов выбрано "в пределах подчинения", то будет неявно выполняться чтение полей "Код", "Родитель" и, быть может, "Это группа" (при выборе иерархии групп и элементов). При выборе в качестве серии кодов "в пределах подчинения владельцу" неявно будет выполняться чтение полей "Код" и "Владелец". При использовании автонумерации или контроля уникальности номеров не устанавливайте ограничений прав на чтение перечисленных полей. Если же на остальные поля нужны ограничения прав на чтение, то можно добавить ограничение на чтение полей "Код", "Родитель", "Владелец" вида "ГДЕ Истина". Аналогом ограничения доступа "ГДЕ Истина", разрешающего доступ ко всем записям таблицы, является пустое ограничение. Использование пустого ограничения вместо ограничения "ГДЕ Истина" приводит к незначительному упрощению запросов к СУБД со стороны 1С:Предприятия.
  • Если при записи документа, бизнес-процесса или задачи установлен режим автоматического определения времени (Первым, Последним, ТекущееИлиПервым, ТекущееИлиПоследним), то при записи соответствующего объекта будет неявно выполняться чтение поля "Дата" и поля "Ссылка". Поэтому чтение полей "Дата" и "Ссылка" должно быть разрешено. Если же установлен режим автоматического определения времени с использованием журналов, то должно быть разрешено чтение полей "Дата" и "Ссылка" любой записи из всех журналов, в которые входит документ, и полей "Дата" и "Ссылка" всех документов, которые входят в эти журналы.