0

Заполнение данных для ограничения доступа

Содержание

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

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

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

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

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

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

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

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

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

ВЫБРАТЬ 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
ИЗ Документ.Накладная КАК Накладная1
ГДЕ Накладная1.Ссылка В
(
ВЫБРАТЬ Состав1.Ссылка
ИЗ Документ.Накладная.Состав КАК Состав1
СГРУППИРОВАТЬ ПО Состав1.Ссылка
ИМЕЮЩИЕ МАКСИМУМ(Состав1.Количество) СправочникиМенеджер , СправочникМенеджер. , СправочникСсылка. , СправочникОбъект. , и другие.

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

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

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

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

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

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

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

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

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

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

Читайте также:  Время полёта к марсу

Загрузка классификатора банков

Это регламентное задание осуществляет загрузку классификатора банков РФ с сайта РБК. Его регулярная работа поддерживает этот классификатор в актуальном состоянии. И когда мы добавляем очередной расчетный счет – больше шансов, что банк в котором он открыт будет найден нами в классификаторе по БИК.

Загрузка курсов валют

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

Заполнение данных для ограничения доступа

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

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

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

Задание служебное. Не нужно включать его вручную.

Извлечение текста

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

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

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

Обновление агрегатов

Регламентное задание выполняет обновление агрегатов. Что это за зверь такой?

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

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

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

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

Во-вторых, разрезы агрегатов могут быть произвольными (любой состав измерений регистра накопления), в отличии от итогов, которые рассчитываются по полному составу регистра.

Обновление данных монитора руководителя

Регламентное задание вызывает обновление данных регистра сведений "ДанныеМонитораРуководителя" по всем организациям. Если монитор руководителя реально используется – задание имеет смысл.

Обновление задач бухгалтера

Регламентное задание производит обновление и заполнение задач бухгалтера (даты сдачи различных деклараций, отчетов и тому подобное).

Обновление индекса ППД

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

Обновление информации о направлениях сдачи отчетности

Речь идёт об направлениях: в ФСС, в ФНС, в ПФР. Короче, что-то связанное опять же со сдачей электронной отчетности из 1С.

Обработка заявлений абонентов на подключение электронной подписи в модели сервиса

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

Отложенное обновление ИБ

Задание управляет процессом выполнения отложенных обработчиков обновления. Не следует включать самостоятельно.

Отправка отчетности абонентов

Отправка регламентированной отчетности абонентов сервиса в контролирующие органы через сервис сдачи отчетности СОС "Калуга-Астрал". Не следует включать самостоятельно.

Очистка устаревших версий объектов

Только для служебного использования.

Перестроение агрегатов

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

Пересчет текущих значений относительных дат запрета изменения

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

Планирование извлечения текста в модели сервиса

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

Получение результатов отправки отчетности

Получение результатов отправки отчетности абонентов сервиса в контролирующие органы от сервиса сдачи отчетности СОС "Калуга-Астрал". Служебное.

Проверка контрагентов

Для модели сервиса обновляет состояния контрагентов (всё ли у него ОК с реквизитами). Для локального режима обновляет состояния и записывает недостающие ИНН и КПП.

Слияние индекса ППД

Выполняет слияние индексов полнотекстового поиска. Работа задания связана опять же с полнотекстовым поиском (куда же поиск без индекса).

Удаление неактуальной информации синхронизации

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

Удаление помеченных объектов программы

Удаляет помеченные объекты из регламентного задания.

Установка периода рассчитанных итогов

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

И как же быть?

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

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

Читайте также:  В чем различие лазерного и струйного принтера

Грамотнее всего там где это возможно отключать не сами задания, а те параметры в системе, которые их включают (например, полнотекстовый поиск).

Если же вам нужно автоматизировать включение/выключение (в том числе по расписанию) регламентных заданий сразу в группе баз – рассмотрите вот эту статью.

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

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

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

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

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

Часто возникает необходимость в частичном ограничении доступа к данным. Например, когда пользователь должен видеть документы только своей организации. В таких случаях в 1С используется механизм ограничения доступа на уровне записей (так называемый, RLS – Record Level Securiy).

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

Для решения задачи будем использовать платформу “1С:Предприятие 8.2″. Создадим новую конфигурацию в свойствах которой в качестве основного режима запуска будет выбран вариант “Управляемое приложение”.

Далее создадим справочник “Организации” и ещё два справочника – “Контрагенты” и “Пользователи” с реквизитом “Организация”. Кроме справочников нам понадобятся два параметра сеанса – “Организация” и “Пользователь” (соответствующих типов). Значения этих параметров устанавливаются при запуске сеанса работы с конфигурацией и хранятся до его завершения. Именно значения этих параметров мы и будем использовать при добавлении условий ограничения доступа на уровне записей.

Установка параметров сеанса выполняется в специальном модуле – “Модуль сеанса”

В этом модуле опишем предопределенную процедуру “УстановкаПараметровСеанса” в которой вызовем функцию заранее подготовленного общего модуля “ПолныеПрава”. Это необходимо в силу особенностей работы базы данных в режиме управляемого приложения, когда часть программного кода может выполняться только на стороне сервера (подробно на объяснении этих принципов в данной статье я останавливаться не буду).

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

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

Теперь можем перейти непосредственно к описанию ограничений доступа. Для этого создадим роль “Пользователь” и перейдем на закладку “Шаблоны ограничений”, где добавим новый шаблон “КонтрагентыЧтениеИзменение” со следующим текстом шаблона: ГДЕ Организация =Организация #Параметр(1)

Текст шаблона ограничений является расширением языка запросов. В отличии от обычного запроса, текст ограничения должен в обязательном порядке содержать условие “ГДЕ”. В качестве значений параметров запроса (в нашем случае это “&Организация”) используются значения одноименных параметров сеанса. Конструкция вида #Параметр(1) означает, что на это место система подставит текст, переданный в качестве первого параметра в месте использования шаблона. С помощь приведенного шаблона будет выполняться проверка каждой записи таблицы (в нашем случае это будет справочник “Контрагены”). Для записей, значение реквизита “Организация” которых совпадает с заданным в соответствующем параметре сеанса, условие описанное в шаблоне будет выполняться. Таким образом эти записи будут доступны для чтения, изменения или добавления (в зависимости от того для какого из этих прав применяется шаблон). Продемонстрирую вышеизложенное на нашем примере.

Перейдем на закладку “Права” роли “Пользователь” и откроем список прав справочника “Контрагенты”. Будем использовать шаблон ограничений “КонтрагентыЧтениеИзменеие” для прав “Чтение”, “Изменение” и “Доблавление”.

Для права “Чтение” будем использовать шаблон с параметром “ИЛИ ЭтоГруппа”. При этом пользователям данной роли будет разрешено чтение не только элементов справочника “Контрагенты” своей организации, но и всех групп этого справочника.

#КонтрагентыЧтениеИзменение("ИЛИ ЭтоГруппа")

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

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

admin

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

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