в запросах используется конструкция запроса разрешенные для чего она нужна

Использование директивы «Разрешенные».

В языке запросов существует директива «Разрешенные». Она предназначена для отсеивания платформой записей, на которые у пользователя нет прав, при настройке ограничения на уровне записей базы данных.

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

Допустим, мы делаем отчет по взаиморасчетам физических лиц. У пользователя есть права на одну организацию, а в базе данных находится более одной организации и в базе данных включено ограничение на уровне записей. Так же, в базе данных есть регистр «Взаиморасчеты» с измерениями «Организация» и «Физлицо». Если в системе будет запрос

и он будет выполняться от имени пользователя с разрешением на одну организацию, то запрос не выполниться, при наличии записей других организаций в этом регистре. Случиться ошибка, а описание ошибки будет «У пользователя не достаточно прав для выполнения запроса!» и это действительно так, платформа не обманывает, поскольку у него нет прав на записи других организаций в этом регистре.

Что же делать в этом случае, использовать директиву «Разрешенные»? На мой взгляд не стоит. Необходимо всего лишь установить отбор по организации и пользователь сможет сформировать отчет. Запрос для отчета с компоновкой данных будет выглядеть так

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

Вы можете снова спросить – «Почему же не стоит применять директиву Разрешенные», это сразу накладывает отбор, убережет пользователя от не нужных ему сообщений!

На этот вопрос ответ будет такой – как в этом случае пользователь узнает, что в отчет попали все нужные данные. Допустим, ранее, этот пользователь работал под полными правами и ошибся и выбрал в документе физлицо из другой организации. Так же может быть ситуация, данные загружались – и в документы организации записалось подразделение другой организации (в ЗУП на них тоже накладываются ограничения по владельцу). В этом случае директива «Разрешенные» отсечет запрещенные данные без каких-либо сообщений пользователю, и он не узнает, что в отчет попало не все, что должно попасть.

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

А как же все-таки избежать ошибки «падения» программы при не хватке прав?

Да очень просто, необходимо использовать команду «Попытка», вот пример:

В отчетах с использованием СКД программный код исполнения отчета необходимо написать вручную, так же через попытку.

В результате, пользователь не получит не корректных данных и получит вменяемое сообщение об ошибке.

Можно ознакомиться с нюансами настройки RLS в обособленных подразделениях в нашей статье.

Источник

Особенность ВЫБРАТЬ РАЗРЕШЕННЫЕ в запросах 1С 8.3

РАЗРЕШЕННЫЕ — конструкция языка запросов 1С 8, которая используется при применении ограничения прав на уровне записей (RLS). Использование данного ключевого слова позволяет избежать ошибки при получении записей, прав на которых у пользователя нет.

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Проблема: В некоторых случаях результат ограничений доступа к данным в 1С 8.3 может зависеть от плана запроса СУБД. В данной статье рассмотрены возможные ситуации и даны рекомендации, как этого избежать.

Условия возникновения проблемы

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

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

Причина различий

Возможная разница в поведении объясняется реализацией ограничений доступа к данным без ключевого слова РАЗРЕШЕННЫЕ в 1С Предприятии 8.3.

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

Такое же сигнальное поле добавляется и к результатам запросов, вложенных в сравнение В/НЕ В. Причем проверка значения сигнальной колонки в этом случае выполняется средствами СУБД. Таким образом, если в процессе выполнения вложенного запроса происходило обращение к запрещенным данным, то выполнение запроса должно завершиться с ошибкой У пользователя недостаточно прав на исполнение операции над базой данных.

Пример и рекомендации

Рассмотрим простой пример. Пусть на таблицу Справочник.ФизическиеЛица наложены ограничения доступа к данным. В этом случае запрос:

Таблица.ФизЛицо КАК ФизЛица

Справочник.ФизическиеЛица КАК Таблица

будет выполнен с ошибкой из-за попытки обращения к запрещенным данным. Если же этот запрос участвует в сравнении, например:

Документ.ДоговорНаВыполнениеРаботСФизЛицом КАК ДоговорНаВыполнениеРаботСФизЛицом

Таблица.ФизЛицо КАК ФизЛица

Справочник.ФизическиеЛица КАК Таблица)

то в зависимости от выбранного СУБД плана запроса запрос может быть выполнен как успешно, так и с ошибкой. Такое поведение запроса не является ошибочным, поскольку обращение к запрещенным данным в процессе выполнения этого запроса может произойти, а может и не произойти. Для получения более предсказуемого результата необходимо построить запрос таким образом, чтобы вложенный запрос гарантированно не выполнял обращений к заведомо ненужным данным. В частности, если предыдущий запрос переписать так:

Документ.ДоговорНаВыполнениеРаботСФизЛицом КАК ДоговорНаВыполнениеРаботСФизЛицом

Таблица.ФизЛицо КАК ФизЛица

Справочник.ФизическиеЛица КАК Таблица

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

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

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Источник

1С запрос выбрать разрешенные

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

О принципах функционирования ограничений доступа к данным

Основные принципы функционирования и использования ограничений доступа к данным описаны в документации 1С:Предприятия 8 и в разделе «Ограничения доступа к данным. Сведения о принципах функционирования».

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

Приведем несколько примеров.

Например, в случае простейшего ограничения вида:

ГДЕ Реквизит = &ПравильноеЗначениеРеквизита

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

ВЫБРАТЬ 1
ИЗ ТаблицаИзОднойПроверяемойЗаписи
ГДЕ Реквизит = &ПравильноеЗначениеРеквизита

В данной таблице доступ к записи, в которой значение реквизита «Реквизит» совпадает со значением параметра сеанса «ПравильноеЗначениеРеквизита», разрешен. К другим записям этой таблицы доступ запрещен.

Другой пример. Усложним ограничение. Допустим нужно разрешить доступ к записи таблицы «Справочник.Контрагенты» не только если ее «Реквизит» имеет «правильное значение», но и в том случае, если «правильное значение» имеет «Реквизит» родителя этой записи (1-го или 2-го уровня). В этом случае ограничение может иметь следующий вид:

Контрагенты
ИЗ Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты1
ПО Контрагенты.Родитель = Контрагенты1.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты2
ПО Контрагенты1.Родитель = Контрагенты2.Ссылка
ГДЕ Контрагенты.Реквизит = &ПравильноеЗначениеРеквизита ИЛИ Контрагенты1.Реквизит = &ПравильноеЗначениеРеквизита ИЛИ Контрагенты2.Реквизит = &ПравильноеЗначениеРеквизита

Тогда запрос, который будет выполнятся в процессе проверки этого ограничения для конкретной записи справочника «Контрагенты», будет иметь вид:

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

Обращения по ссылкам в запросах и ограничения доступа к данным

Пусть на справочник «Контрагенты» установлено следующее ограничение доступа:

ГДЕ Ответственный = &ТекущийПользователь

а сам справочник содержит такие записи:

Ответственный
(ссылка на Справочник.Пользователи)

Завод имени ЛапкинаИвановПекарня КосолаповаЛюбимовЭлектроламповый заводИвановТрикотажная фабрикаГенералов

Пусть регистр сведений «КонтактнаяИнформация» содержит следующие записи:

КонтактноеЛицо
(ссылка на Справочник.ФизЛица)

Организация
(ссылка на Справочник.Контрагенты)

Зайкин А. В.Завод имени ЛапкинаТонков Т. А.Пекарня КосолаповаПетров А. А.Электроламповый заводСидоров И. И.Трикотажная фабрика

Тогда если текущим пользователем является пользователь «Иванов», то результатом запроса:

ВЫБРАТЬ РАЗРЕШЕННЫЕ Имя, Ответственный
ИЗ Справочник.Контрагенты

Ответственный
(ссылка на Справочник.Пользователи)

Завод имени ЛапкинаИвановЭлектроламповый заводИванов

Однако, результатом следующего запроса:

ВЫБРАТЬ РАЗРЕШЕННЫЕ КонтактноеЛицо, Организация
ИЗ РегистрСведений.КонтактнаяИнформация

Зайкин А. В.Завод имени ЛапкинаТонков Т. А..Петров А. А.Электроламповый заводСидоров И. И..

Ответственный
(ссылка на Справочник.Пользователи)

Пекарня КосолаповаЛюбимовТрикотажная фабрикаГенералов

ВЫБРАТЬ РАЗРЕШЕННЫЕ КонтактноеЛицо, Организация.Имя КАК Имя, Организация.Ответственный КАК Ответственный
ИЗ РегистрСведений.КонтактнаяИнформация

Зайкин А. В.Завод имени ЛапкинаИвановТонков Т. А.Петров А. А.Электроламповый заводИвановСидоров И. И.

поскольку противоречащие ограничению записи справочника «Контрагенты» считаются отсутствующими, а значениями полей «Имя» и «Ответственный» по ссылкам, указывающим на несуществующие записи, является значение NULL.

Если же необходимо по тому же признаку ограничить доступ к записям регистра сведений «КонтактнаяИнформация», то на этот регистр можно наложить ограничение вида:

ГДЕ Организация.Ответственный = &ТекущийПользователь

В этом случае результатом выполнения последнего запроса будет таблица:

Зайкин А. В.Завод имени ЛапкинаИвановПетров А. А.Электроламповый заводИванов

Ограничения и табличные части

Ограничения доступа к данным действуют только на записи таблиц верхнего уровня и не могут ограничивать доступность записей табличных частей. С другой стороны, в тексте ограничения поля табличных частей использоваться могут. В этом случае в процессе проверки ограничения для некоторой записи будет исполнен запрос, в котором табличная часть будет соединена с таблицей из одной проверяемой записи левым внешнем соединением. Таким образом запись будет удовлетворять ограничению, если в ее табличной части найдется хотя бы одна запись, для которой условие в ограничении принимает значение «Истина».

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

Например, если документ «Накладная» содержит табличную часть «Состав», то ограничения доступа к этому документу проверяются при обращении к каждой накладной, как к единому целому и не могут разрешить доступ к какой-нибудь одной записи его табличной части «Состав», а к какой-нибудь другой запретить.

Пусть таблица «Документ.Накладная» содержит следующие записи:

Контрагент
(ссылка на Справочник.Контрагенты)

Состав (табличная часть)

Пекарня КосолаповаБулка с маком20Пирожок с курагой30Трикотажная фабрикаШтаны20Футболка100

В этом случае запрос, исполняемый для каждой накладной в процессе проверки следующего ограничения:

ГДЕ Состав.Количество > 50

ВЫБРАТЬ 1
ИЗ ТаблицаИзОднойПроверяемойЗаписи КАК Накладная
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Документ.Накладная.Состав КАК Состав
ПО Накладная.Ссылка = Состав.Ссылка
ГДЕ Состав.Количество > 50

Следовательно доступ будет разрешен только для записи «Трикотажная фабрика». Поэтому запрос:

ВЫБРАТЬ РАЗРЕШЕННЫЕ Контрагент, Состав.(Номенклатура, Количество)
ИЗ Документ.Накладная

Трикотажная фабрикаШтаны20Футболка100

а запрос к вложенной таблице:

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

Трикотажная фабрикаШтаны20Трикотажная фабрикаФутболка100

поскольку ограничение накладывается только на записи верхнего уровня, но не на записи табличных частей.

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

ГДЕ Состав.Количество > 50 ИЛИ Состав.Количество ЕСТЬ NULL

Если же необходимо разрешить доступ только к тем накладным, у которых в табличной части «Состав» нет записей с «Количеством», превышающем 50, то в ограничении необходимо использовать вложенный запрос:

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

ГДЕ Тип = &ТипКонтактнойИнформации»

то для успешного выполнения метода

необходимо установить отбор:

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

Виртуальные таблицы запросов

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

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

Выделенный отбор по виртуальной таблице «СрезПоследних» может содержать произвольное логическое выражение, допустимое для раздела ГДЕ, использующее поля, которые присутствуют в виртуальной таблице.

В языке запросов существует директива «Разрешенные». Она предназначена для отсеивания платформой записей, на которые у пользователя нет прав, при настройке ограничения на уровне записей базы данных.

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

Допустим, мы делаем отчет по взаиморасчетам физических лиц. У пользователя есть права на одну организацию, а в базе данных находится более одной организации и в базе данных включено ограничение на уровне записей. Так же, в базе данных есть регистр «Взаиморасчеты» с измерениями «Организация» и «Физлицо». Если в системе будет запрос

и он будет выполняться от имени пользователя с разрешением на одну организацию, то запрос не выполниться, при наличии записей других организаций в этом регистре. Случиться ошибка, а описание ошибки будет «У пользователя не достаточно прав для выполнения запроса!» и это действительно так, платформа не обманывает, поскольку у него нет прав на записи других организаций в этом регистре.

Что же делать в этом случае, использовать директиву «Разрешенные»? На мой взгляд не стоит. Необходимо всего лишь установить отбор по организации и пользователь сможет сформировать отчет. Запрос для отчета с компоновкой данных будет выглядеть так

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

Вы можете снова спросить – «Почему же не стоит применять директиву Разрешенные», это сразу накладывает отбор, убережет пользователя от не нужных ему сообщений!

На этот вопрос ответ будет такой – как в этом случае пользователь узнает, что в отчет попали все нужные данные. Допустим, ранее, этот пользователь работал под полными правами и ошибся и выбрал в документе физлицо из другой организации. Так же может быть ситуация, данные загружались – и в документы организации записалось подразделение другой организации (в ЗУП на них тоже накладываются ограничения по владельцу). В этом случае директива «Разрешенные» отсечет запрещенные данные без каких-либо сообщений пользователю, и он не узнает, что в отчет попало не все, что должно попасть.

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

А как же все-таки избежать ошибки «падения» программы при не хватке прав?

Да очень просто, необходимо использовать команду «Попытка», вот пример:

В отчетах с использованием СКД программный код исполнения отчета необходимо написать вручную, так же через попытку.

В результате, пользователь не получит не корректных данных и получит вменяемое сообщение об ошибке.

Можно ознакомиться с нюансами настройки RLS в обособленных подразделениях в нашей статье.

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Основы запросов в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю).

Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

Источник

ВЫБРАТЬ ИЗ в запросе 1С 8.3

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

ВЫБРАТЬ

В предложении ВЫБРАТЬ указываются поля выборки запроса. Полей может быть несколько, между собой они разделяются запятой.

Можно использовать литералы примитивных типов:

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

С числами можно выполнять арифметические операции прямо в полях выборки:

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Также можно использовать унарный минус:

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Можно складывать строки, но только если их длина меньше 1024 символов:

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Псевдонимы полей

Псевдоним поля выборки в запросе указывается после ключевого слова КАК. При этом можно вообще не задавать псевдоним для поля, можно указать после ключевого слова КАК, а можно просто через пробел, без указания ключевого слова КАК:

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

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

В предложении ИЗ указываются таблицы-источники, из которых выполняется выборка. Например, в конфигурации есть справочник «КамерыХранения». Для выборки полей из данного справочника нужно выполнить следующий запрос:

Источник

В запросах используется конструкция запроса разрешенные для чего она нужна

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Тема ограничения доступа на уровне записей (RLS) обычно сложна в понимании новичками и многими профессионалами, почему и не используется в работе.
Всего статей будет 2:

Роли, права доступа

Объект конфигурации «роль» дает набор прав на операции (действия) над объектами конфигурации.

Это всего лишь роль (не предопределенная), в которой установлены флажки на все виды прав на все объекты конфигурации.

Отличие ее от остальных ролей – наличие права «Администрирование».

В случае создания хотя бы одного пользователя, система начинает проверять наличие права «Администрирование» — оно должно быть минимум у одного пользователя.

Ограничение доступа на уровне записей

Row Level Security (RLS) – ограничение на уровне записей.

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

Механизм предназначен для ограничения доступа к записям таблицы объектов метаданных по произвольным условиям, накладываемым на значения полей строк этих таблиц. Например, чтобы видеть записи только по «своим» контрагентам, организациям и т.д.

Техническая реализация ограничений доступа в 1С

1С формирует запрос к СУБД. Кластер серверов добавляет к запросу секцию ГДЕ, в которой содержится текст условия на ограничение доступа по RLS, затем этот запрос отправляется в СУБД, извлеченные данные возвращаются на клиент 1С.

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Такой механизм будет работать при любом запросе из клиента:

Подобная реализация механизма сильно влияет на производительность.

Пути обхода ограничений доступа.

В больших ресурсоемких операциях (обработки перепроведения документов, например) часть кода можно выносить в привилегированные модули.

А) Привилегированный модуль — это общий модуль с флагом «Привилегированный» в свойствах.

Его особенность заключается в том, что код в нем исполняется без какого-либо контроля прав доступа, в том числе и RLS.

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

В) Метод УстановитьПривилегированныйРежим()

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

Со следующей строки кода будет действовать привилегированный режим исполнения.

Действовать он будет до строки отключения этого режима или до конца процедуры / функции

// любой код тут будет исполнен без контроля прав и RLS

УстановитьПривилегированныйРежим ( Ложь ); // либо конец процедуры / функции

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

Если в процедуре или функции вызовов метода УстановитьПривилегированныйРежим ( Ложь ) сделано больше, чем вызовов метода УстановитьПривилегированныйРежим ( Истина ), то будет вызвано исключение

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

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Закономерно возникает вопрос: Зачем тогда вообще настраивать ограничения доступа, если его можно так легко обойти?

Безопасный режим.

Да, можно написать внешнюю обработку с привилегированным режимом исполнения и выгрузить / испортить данные. Для предотвращения этого в системе есть метод глобального контекста

Безопасный режим кроме прочего игнорирует привилегированный режим.

Его нужно устанавливать перед программным вызовом внешних обработок или экспортных процедур и функций из их модулей.

При выполнении запрещенных операций во время выполнения генерирует исключение.

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

Настройка ограничения доступа

RLS можно настроить только для прав:

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

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

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

Для всех остальных прав такой возможности нет.

Добавим новое ограничение для права «чтение» справочника «Номенклатура». Откроется список полей, для которых можно настроить добавляемое ограничение.

Это означает, что при попытке получить доступ к отмеченным флажками полям, ограничение сработает, а при попытке получить доступ к неотмеченным полям ограничение не сработает.

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

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

*Особенность: для прав добавление, изменение, удаление:

Для права «Чтение» можно настроить несколько условий, они будут объединяться логическим оператором «И».

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

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

Механизм наложения ограничений доступа.

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

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

Построенные условия добавляются к SQL-запросам, с которыми «1С: Предприятие» обращается к СУБД. При обращении к данным со стороны условий ограничения доступа проверка прав не выполняется (ни к объектам метаданных, ни к объектам базы данных). Причем механизм добавления условий зависит от выбранного способа действия ограничений «все» или «разрешенные».

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

* Особенность : Если пользователю доступны несколько ролей с настроенными ограничениями на уровне записей к одному объекту, то в этом случае условия ограничений складываются логической операцией « ИЛИ ». Другими словами полномочия пользователя складываются.

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

Способ «Все».

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

Наложение ограничений доступа способом «все» схематически представлено на рисунке:

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Способ «Разрешенные».

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

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

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

В клиент-серверном варианте «1С:Предприятия» наложение ограничений выполняется на сервере «1С:Предприятия».

Однако эта опция (РАЗРЕШЕННЫЕ) не сработает в случае, если мы в запросе обратимся к таблице, для которой не настроены ограничения доступа, но в которой есть ссылки на строки таблицы с настроенными ограничениями. В этом случае результат запроса выдаст « …. » вместо значения ссылочного поля.

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

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

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

Практика 1. Конструктор запросов в настройках RLS.

Составим текст секции «ГДЕ» в запросе к справочнику. Можно воспользоваться конструктором запросов.
Конструктор имеет урезанный вид.

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Основная таблица будет таблицей объекта, для которого настраивается ограничение.

Можно также выбирать и другие таблицы и настраивать между ними различные связи на закладке «Связи».

Здесь настраиваются собственно условия ограничения доступа

Добавим условия на реквизит «Цена» справочника номенклатура для права на «чтение» ко всем полям таблицы.

«Номенклатура ГДЕ Номенклатура.Цена > 500»

Проверим, как сработает это простое правило. Таблица справочника содержит такие элементы:

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

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

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Пропали также и группы. Изменим текст ограничения

«Номенклатура ГДЕ Номенклатура.Цена > 500

Ну вот теперь то, что нужно.

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Далее попробуем сделать то же самое для конкретных полей таблицы. Поставим в настройке ограничения флаг для поля «Код».

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Если в настройке списка убрать отображение поля «код», будут выведены все элементы справочника, т.е. ограничение не сработало. Если поставить отображение поля «Код», ограничение будет работать.

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

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

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Если попытаться получить «ограниченный» реквизит программным образом, также будет вызвана ошибка доступа.

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Более того, нельзя будет обратиться к любым полям объекта через ссылку, т.к при получении ссылки система считывает весь объект целиком, и если в нем есть «ограниченные» реквизиты, объект считан не будет.

Поэтому при программной работе с объектами БД нужно иметь в виду возможные ограничения на уровне записей и получать все нужные данные объекта запросом и затем помещать их в структуру или исполнять часть кода в привилегированном модуле.

После настройки ограничения доступа изменилось отображение строки в списке прав – она стала серой и появилась пиктограмма.

Ограничения при настройке доступа (RLS).

Практика 2. Номенклатура с актуальной ценой.

Сделать ограничение доступа, если нужно выводить номенклатуру с актуальной ценой больше определенного значения, например, 100.

Решение:

Добавляем новое правило ограничения доступа для справочника «Номенклатура» на право «чтение».
Выбираем «прочие поля».
В конструкторе добавляем вложенный запрос. В нем выбираем таблицу регистра сведений «Цены номенклатуры».
Вкладки «порядок» нет – это особенность конструктора запросов для построения запроса ограничения доступа.
На вкладке «Дополнительно» ставим «первые 999999999», вкладка «порядок» появилась.
Настраиваем упорядочивание по полю «Период» по убыванию.
Затем настраиваем связь основной таблицы с вложенным запросом по ссылке.

в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть фото в запросах используется конструкция запроса разрешенные для чего она нужна. Смотреть картинку в запросах используется конструкция запроса разрешенные для чего она нужна. Картинка про в запросах используется конструкция запроса разрешенные для чего она нужна. Фото в запросах используется конструкция запроса разрешенные для чего она нужна

Шаблоны ограничений доступа.

Практика 3. Ограничение на «контрагенты» по значению в константе.

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

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

Для справочника «Контрагенты» для права «чтение» настроим ограничение, добавив в секцию «Условия» вложенный запрос к константе. Не забыть ЭтоГруппа.

Видим проблему, справочник Контрагенты фильтруется верно, а документы с реквизитом «Контрагент» отображаются все, некоторые с «битыми» ссылками в реквизите «Контрагент».

Теперь нужно настроить ограничение доступа для всех объектов, использующих ссылку на «Контрагенты». Найдем их сервисом «поиск ссылок на объект».

Скопируем и немного доработаем текст условия RLS из справочника «Контрагенты». Это нужно сделать столько раз, сколько найдено объектов.

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

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

Можно вынести в шаблон любой кусок текста ограничения доступа. Вызов шаблона осуществляется через символ «#». Например, #ШаблонКонтрагент.

Через # в 1С пишутся инструкции препроцессору. В контексте исполнения настроек ограничений доступа платформа заменяет текст вызова шаблона на текст шаблона.

Вынесем в шаблон «ШаблонКонтрагент» текст после слова ГДЕ, кроме текста про ЭтоГруппа.

Параметры в шаблонах ограничений доступа.

Продолжим решение задачи 2.

Проблема заключается теперь в том, что основная таблица в справочнике называется «контрагент», в документе «Приходная накладная». Проверяемое поле в справочнике называется «ссылка», в документе – «Контрагент».

Изменим в тексте шаблона название основной таблицы на «#ТекущаяТаблица»

«#ТекущаяТаблица» — это предопределенный параметр.

И через точку укажем номер входного параметра – «.#Параметр(1)

«#Параметр» — это тоже предопределенное значение. Может содержать произвольное количество входных параметров. Обращение к ним происходит по порядковому номеру.

В тексте ограничения доступа для справочника укажем следующее:

«Контрагенты ГДЕ #ШаблонКонтрагент(«Ссылка») ИЛИ ЭтоГруппа»

Для документа следующее:

«РеализацияТоваров ГДЕ #ШаблонКонтрагент(«Контрагент»)»

При вызове шаблона ограничения доступа параметры в него передавать нужно только как Строка, т.е в кавычках.

Основная таблица — Номенклатура

Текст шаблона такой:

#ТекущаяТаблица ГДЕ #ТекущаяТаблица.#Параметр(1) = #Параметр(2)

ВызовРезультирующий текст
#Шаблон(«ЭтоГруппа»,»Истина»)Номенклатура ГДЕ Номенклатура.ЭтоГруппа = Истина
#Шаблон(«Наименование»,»Стул»)Номенклатура ГДЕ Номенклатура.Наименование = «Стул»
#Шаблон(«Цена»,»100″)Номенклатур ГДЕ Номенклатура.Цена = 100

После символа «#» могут следовать:

В выражении ограничения доступа могут содержаться:

Для удобства редактирования текста шаблона на закладке Шаблоны ограничений в форме роли нужно нажать кнопку Установить текст шаблона. В открывшемся диалоге ввести текст шаблона и нажать кнопку ОК.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *