выбрать разрешенные различные что значит

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

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

выбрать разрешенные различные что значит. Смотреть фото выбрать разрешенные различные что значит. Смотреть картинку выбрать разрешенные различные что значит. Картинка про выбрать разрешенные различные что значит. Фото выбрать разрешенные различные что значит

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Язык запросов 1с — оператор Выбрать

Язык запросов 1С 8 — незаменимый инструмент для программиста 1С, он позволяет писать более лаконичный, простой, понятный код, использовать меньшее количество ресурсов системы при работе с данными. Данная статья открывает серию уроков, посвященных языку запросов 1С 8. На первом уроке мы рассмотри структуру главного оператора данного языка — ВЫБРАТЬ. При помощи этого оператора можно создавать выборки из таблиц базы данных. Выбранные данные таблиц можно сортировать, накладывать на них условия, связывать и объединять с данными других таблиц, группировать по различным полям и много другое.

Язык запросов 1с предприятия 8 — Структура оператора ВЫБРАТЬ

Рассмотрим структуру оператора ВЫБРАТЬ (в квадратных скобках указаны необязательные части оператора). Язык запросов 1С предоставляет широкий набор инструментов для создания выборок данных.

Ключевые слова и блоки работы с полями

Таким образом мы указываем из какой таблицы мы берем данное поле. Язык запросов 1С позволяет указывать любые псевдонимы, но они не должны повторяться в одном операторе ВЫБРАТЬ. Поле может быть и более сложным, оно может состоять из различных комбинаций полей таблиц, функций языка запросов и агрегатных функций, но в этом уроке мы не будем касаться этих случаев;

Ключевые слова и блоки работы с таблицами

После типа связи указывается имя и псевдоним второй таблицы. Далее следует ключевое слово ПО, после него следуют условия связи, связанные между собою логическими операторами И, ИЛИ. Каждое выражение в условии должно возвращать значение логического типа (Истина, Ложь). Если первая таблица связана еще с какими то таблицами, кроме второй, то снова указывается тип соединения и так далее. Каждая из таблиц участвующих в связи в свою очередь может быть связана с другими таблицами, это показано в схеме структуры запроса. Если таблица не связана с первой, то она указывается без типа соединения, далее могут следовать ее связи и так далее;

Ключевые слова и блоки преобразования данных

Хотите продолжить изучать язык запросов 1с 8? Тогда прочтите следующую статью: Программная работа с запросом в 1С 8

Научитесь пользоваться конструктором запросов: Конструктор запросов 1С — обучение на примерах

Источник

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С, всё выкладываю там в первую очередь.

выбрать разрешенные различные что значит. Смотреть фото выбрать разрешенные различные что значит. Смотреть картинку выбрать разрешенные различные что значит. Картинка про выбрать разрешенные различные что значит. Фото выбрать разрешенные различные что значит

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

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

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Использование ограничений доступа к данным для различных объектов 1С:Предприятия 8

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

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

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

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

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

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

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

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

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

Источник

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

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