Запрет создания документа 1с
Часть 2. Ограничение доступа к справочникам (Настраиваем права доступа в 1С Университет ПРОФ)
Данная статья была написана в попытках решить недостаток способа настройки ролей, описанного в первой части статьи. Напомню, о чем речь: пользователи по умолчанию не имеют доступа к документам, однако они имеют доступ ко всем справочникам (кроме физ.лиц) и некоторым другим объектам, например, константам: они могут добавлять элементы и изменять существующие (удалить не смогут).
А также, если пользователь догадается как включить режим "Все функции", то он сможет изменять константы, запускать любые обработки, бизнес-процессы (ирония в том, что если он сможет добраться через "Все функции", например, до константы "Ограничивать доступ на уровне записей", то ничто не помешает ему ее отключить…).
Это повышает требования к пользователям, но зачастую они меняют элементы сами того не подозревая, без злого умысла.
Таким образом, главный вопрос этой части статьи в том - как запретить доступ на редактирование к тем объектам, к которым доступ разрешен в типовой роли "Пользователь", не трогая саму роль, и, не создавая новых ролей, иметь возможность оперативно разрешать/запрещать доступ определенным пользователям (опять же исходя из цели, обозначенной в части 1, т.е. с минимальными изменениями в типовой конфигурации).
Здесь я опишу два способа (хотя их конечно может быть и больше). Рекомендую прочесть оба, чтобы определиться который Вам подходит и подходит ли вообще.
Начиная с версии 2.0.8 у роли "Пользователь" режим "Все функции" отключен в типовой конфигурации и никаких дополнительных действий не требуется.
Если же у Вас версия ниже, то рекомендуется, всё же немного подкорректировать роль "Пользователь" в конфигураторе, а именно в настройках прав убрать "Режим "Все функции".
Сильных проблем при последующем обновлении программы вызвать не должно, просто надо это запомнить, чтобы делать после каждого обновления. Так мы защитим от намеренного открытия некоторые важные объекты, вроде констант и справочников.
Но опять же, если дотошный пользователь через настройки интерфейса и панелей включит себе то, что мы отключали через шаблоны, то он сможет получить доступ к некоторым справочникам или другим объектам.
Если же случайный доступ принципиально нужно ограничить, то можно попробовать использовать следующее решение, которое позволит через стандартный административный интерфейс предоставлять доступ к справочникам или другим объектам избранным пользователям.
Суть решения: создать подписки на события в момент записи объектов (справочников, констант и т.п.), создать группы пользователей, которым разрешено/запрещено изменять объекты конфигурации, на основании групп предоставлять доступ к редактированию. Будут созданы только пара новых объектов конфигурации, поэтому проблем при обновлении быть не должно.
Т.к. мы не хотим менять типовые объекты конфигурации, то вместо изменения самих объектов для проверки доступа на редактирование к ним будем использовать подписки на события "ПередЗаписью".
Чтобы добавить подписку, необходимо установить следующий режим редактирования: на корневом узле установить "Объект поставщика редактируется с сохранением поддержки" (без наследования на подчиненные объекты):
Скорее всего данный режим у Вас уже установлен (если пользовались внешними обработками выгрузки данных в ФИС).
Начнем со справочников, рассмотрим всё на их примере, а остальные объекты (например, константы) делаются по аналогии.
Для начала, мы вставим небольшой код, который будет запрещать редактирование всех справочников пользователями (по умолчанию редактирование всех справочников разрешено).
Даем наименование (в моем случае "п_" - это регламентированный префикс для всех добавляемых объектов):
Данный код разрешает редактирование только пользователям с полными правами. Дополним его более гибкими правами позже.
Теперь создаем подписку на событие (которая будет срабатывать при попытке записать элемент справочника):
(Если нужно, можно еще дополнительно сделать такую же подписку для констант, тогда в типе данных нужно выбрать "КонстантаМенеджерЗначения" и также для любых других объектов.)
Теперь нужно сделать так, чтобы один пользователь имел доступ, а другой нет. Используем для этого тот же механизм групп, что и ранее для объединения пользователей в группы.
Идея такова - для каждого объекта конфигурации, к которому нужно предоставить доступ, создается группа и любой пользователь, входящий в эту группу, будет иметь доступ на редактирование этого объекта. Можно делать как "разрешающие" группы, так и "запрещающие", т.е. если Вы хотите не всё запрещать, а оставить всё разрешенным (как по умолчанию) и потом отдельно запрещать редактирование некоторых объектов (тогда в указанном выше коде модуля нужно убрать строку "Отказ = Истина;", которая всё запрещает).
Вернемся к нашему примеру. Для удобства можно сгруппировать все папки (группы) пользователей, где будут назначаться права, например, так: (можно задать любую структуру, важны будут только конечные группы)
В этом примере мы решаем, что константы и справочники будут запрещены на редактирование для всех и будем делать разрешающие права в группе "Разрешено редактировать". А на планы видов характеристик будем делать запрещающие права для некоторых пользователей.
Примечание: наименование должно быть таким, как задано "ПолноеИмя" объекта в конфигураторе, например, "Справочник.Дисциплины", "Справочник.ЕдиницыИзмерения", "Константа.ЗаголовокСистемы" и т.п.
Теперь необходимо добавить код в созданный ранее модуль, чтобы обрабатывать вышеуказанные группы (текст кода для копирования см. ниже):
Можно проверять редактирование справочника под пользователем, у которого раньше была ошибка при сохранении и которого мы включили в группу на разрешение. Теперь ошибки быть не должно, и дисциплина сохранится нормально.
Если нужно сделать тоже самое для констант, то опять же создаем подписку "ПередЗаписью" на объекты констант, ссылаемся на ту же процедуру в нашем модуле. В группах создаем соответствующую группу и добавляем в нее пользователей.
В итоге код обеих процедур в нашем модуле может быть следующим:
Для запрета редактирования объектов, которые по умолчанию разрешены (например, некоторые планы видов характеристик и др.), также добавляем подписку на эти объекты, ссылаемся уже на вторую процедуру - ПередЗаписьюОбъектовПроверкаПравЗапрет, в группах создаем соответствующие группы объектов и добавляем пользователей, которым редактирование запрещено.
Этот способ позволяет сделать также всё наоборот. Т.е. оставить все справочники по умолчанию редактируемыми, и добавить запрещающие редактирование правила. Это уже на усмотрение администратора.
Однако в этом способе нельзя использовать один и тот же объект как для разрешения, так и для запрета. Поэтому необходимо сразу определиться, что будет по умолчанию включено, а что нет.
Данный механизм можно попытаться расширить, используя, например, механизм "Администрирование объектов метаданных", как было сделано для документов в типовой конфигурации. Тогда можно будет предоставлять доступ сразу на группы объектов (способ 2)
Предисловие: после описания и обсуждения 1го способа, нами была избрана несколько иная стратегия для справочников - "стратегия запрета".
Её суть: по умолчанию в типовой конфигурации основные объекты разрешены для редактирования (справочники, константы и т.п.). Но есть справочники, к которым доступ необходимо предоставить лишь избранным пользователям или совсем запретить редактирование.
Например, справочники "Типы стандартов" или "Формы обучения" (нам бы не хотелось, чтобы любой из пользователей мог переименовать "очное" на "заочное" и т.п.).
Почему именно так, а не наоборот? Решение было принято из-за сроков (нужно сделать быстро), а "способ разрешения" опасен тем, что на данный момент мы точно не знаем, какие где справочники понадобятся при работе, и, если в разгар приемной кампании всё запретить, может встать работа сотрудников ПК.
Поэтому пока нужно защитить лишь особо важные объекты, а когда с течением времени будут сформированы списки справочников для разных учебных процессов, тогда можно будет перейти к стратегии разрешения.
Однако при детальном обдумывании реализации задачи "стратегии запрета" выяснилось, что первый способ неудобен, т.к. создавая группу объекта нужно будет включить в нее всех пользователей, кому нельзя редактировать объект, которых довольно много (тех, кому разрешено, - единицы). Особенно неудобно, если создается новый пользователь - при создании надо будет не забыть добавить его в группы запрета (если забыть, то он случайно получит доступ на редактирование к защищаемым объектам).
Суть способа 2: всё разрешено для всех, но если что-то разрешено только для кого-то, то оно должно быть автоматически запрещено для всех остальных. Т.е. запрет не глобальный (как в способе 1), а объектно-ориентированный.
Например, если на справочник специально не назначено никаких пользователей, то доступ на редактирование по умолчанию разрешен. Если к справочнику привязали хотя бы одну группу пользователей или пользователя, то будем разрешать редактирование только указанным группам, а всем остальным запрещать.
Реализовывать будем немного другим методом, в отличие от способа 1, а именно расширим стандартный механизм "Администрирование прав объекта" (знакомый нам по первой части статьи).
Механизм базируется на справочнике метаданных, в который нужно добавить имена объектов, доступ к которым нужно регулировать, например, "Справочник.ФормаОбучения", "Справочник.ТипыСтандартов" или "Константа.ЗаголовокСистемы" и т.п.
Теперь выбираем группу пользователей, которым будет разрешено редактирование. Например, справочник дисциплин должны редактировать только сотрудники УМУ, т.к. они создают учебные планы, все остальные только чтение.
Для этого в "Администрировании прав группы" добавляем справочник дисциплин из справочника метаданных (кнопка "Подбор объектов") и ставим право "Изменять" или "Добавлять" ("галка Чтение" на данный момент будет проигнорирована).
Это будет означать, что раз появился кто-то, кому даны особые права, то автоматически другим право редактирования будет запрещено.
Теперь нужно сделать обработчик для этих прав и метаданных. Для этого, как уже описывалось в способе 1 выше, создадим подписку "ПередЗаписью" на все справочники и/или другие нужные объекты.
Наверняка, у вас есть много вопросов относительно оплаты (как оплатить, как получить разработку, не возникнут ли проблемы и т.п.).
Ответы на самые распространенные вопросы, относящиеся к процессу покупки моих разработок, приведены на странице заказа. Для перехода к ней нажмите Оплатить картой или Заказать счет .
Там же вы найдете мои контакты, на случай если останутся вопросы.
Эта разработка позволяет настроить выборочную блокировку (открытия или изменения) справочников и документов для разных пользователей (или групп пользователей).
Тут вы можете спросить - А не проще ли обойтись установкой нужных ролей для пользователей?
Отвечаю - не всегда. Нередко типовые роли являются избыточными, и в придачу к установке нужных прав для пользователей предоставляют им дополнительные ненужные полномочия. К тому же иногда бывает нужно ограничить возможность редактирования уже проведенных документов - такую задачу типовыми средствами не решить.
Расширение позволяет дополнить функциональность типовых ролей конфигурации и в пользовательском режиме ограничить доступ конкретных пользователей (или групп) к конкретным типам объектов системы (документам или справочникам).
Для примера, ограничим группе пользователей доступ к документу Заказ клиента:
Откроем форму настройки прав доступа:
На форме настроек расположена таблица, в разных строках которой мы можем добавить настройки доступа для разных пользователей /групп. Добавляем новую строку и выбираем в ней:
- тип объекта - документ или справочник,
- имя объекта - в данном случае выбираем из выпадающего списка нужный тип документов информационной базы,
- настраиваем адресата ограничения - можно выбрать конкретного пользователя или группу пользователей (в таком случае ограничение будет срабатывать для всех пользователей, принадлежащих этой группе),
- тип запрета - запрет открытия или запрет изменения (в последнем случае форма будет открываться только на просмотр, таким образом пользователь не сможет редактировать старый документ).
Если включен запрет изменения, пользователь также не сможет перепровести/распровести документ, пометить объект на удаление или снять пометку (из журнала документов или в списке элементов какого-то справочника).
Применительно к документам запрет изменения имеет место только для проведенных документов.
Теперь попытка пользователя открыть заказ заканчивается ничем:
Ограничение не распространяется на пользователей с полными правами.
Несмотря на запрет доступа к заказам, пользователь без проблем может просматривать список заказов, ограничение касается только просмотра формы конкретного документа.
Для корректной работы расширения необходимо отключить Безопасный режим .
Вас может заинтересовать
В данной статье показано, как производится загрузка курсов валют в 1С:Предприятие 8 на примере конфигурации Бухгалтерия предприятия 3.0
В данном видео даются разъяснения, необходимые для понимания того, что такое права, роли и профили групп доступа. Затем создается пользователь и происходит базовая настройка прав него.
В данной статье описывается зачем делать свертку базы и на конкретном примере показано, как выполнить свертку информационной базы 1С:Бухгалтерия 3.0 штатными средствами.
В 1С можно настроить ограничения по ролям, т.е. запретить пользователям с определенной ролью изменять какие либо реквизиты или объекты конфигурации. Например, при создание или открытии какого либо документа (справочника) можно запретить изменять номер, дату или другие необходимые элементы. На практики подобные задачи встречаются довольно часто, так как некоторые пользователи могут поменять дату документ или его номер, тем самым нарушить учет документооборота. Реализовать все это достаточно просто.
Программное ограничения по ролям в 1С
Допустить у нас в базе есть роль «Пользователь» и нам необходимо всем учетным записям с данной ролью запретить изменять номер и дату документа поступления, а так же указывать в поле «Ответственный» наименование роли.
Для этого в обработчике события «При создании на сервере» пишем вот такой код.
Думаю в нем все понять, если учетная запись под которой создается документ имеет роль «Пользователь» тогда запрещаем редактировать «Номер», «Дату» и в поле «Ответственный» подставляем значение из справочника «Пользователи» которое найдем по коду. Под данным кодом в справочнике находиться «Пользователь».
Запустим 1С и посмотрим что получилось, в итоге ввести что-то с клавиатуры в поля «Номер», «Дата» не получиться.
Но если у данного поля есть возможность выбора, например, как у даты то изменить её все же буде возможно.
Для того чтобы исключить подобную ситуацию можно отключить доступность, без ограничения редактирования.
В этом случае пользователь уже ни чего не сможет сделать.
Вариантов реализации подобных задач очень много, я показал один из, возможно он даже не самый оптимальной. Если Вы знаете другой обязательно поделитесь.
Кстати механизм подставления «Ответственного» тут не совсем корректен, так как в базе может быть много пользователей 10, 20 и если у всех у них есть роль «Пользователь» то она и будет подставляться, тут необходимо подставлять имя пользователя а не роли, с помощью ПользователиИнформационнойБазы.ТекущийПользователь() но об этом в следующей статье.
Использование ограничений доступа к данным для различных объектов 1С:Предприятия 8
Этот раздел содержит информацию об особенностях использования ограничений доступа к данным, определяемых поведением различных объектов 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.
Если же необходимо по тому же признаку ограничить доступ к записям регистра сведений "КонтактнаяИнформация", то на этот регистр можно наложить ограничение вида:
ГДЕ Организация.Ответственный = &ТекущийПользователь
В этом случае результатом выполнения последнего запроса будет таблица:
Ограничения и табличные части
Ограничения доступа к данным действуют только на записи таблиц верхнего уровня и не могут ограничивать доступность записей табличных частей. С другой стороны, в тексте ограничения поля табличных частей использоваться могут. В этом случае в процессе проверки ограничения для некоторой записи будет исполнен запрос, в котором табличная часть будет соединена с таблицей из одной проверяемой записи левым внешнем соединением. Таким образом запись будет удовлетворять ограничению, если в ее табличной части найдется хотя бы одна запись, для которой условие в ограничении принимает значение "Истина".
Из соображений эффективности в ограничениях доступа к данным нельзя использовать агрегатные функции. Поэтому возможности участия в ограничениях доступа к данным каких-нибудь условий на совокупности записей табличных частей не предусмотрено. Подобная цель может быть достигнута посредством запросов, вложенных в ограничения, однако пользоваться этим необходимо с осторожностью из-за возможного снижения производительности.
Например, если документ "Накладная" содержит табличную часть "Состав", то ограничения доступа к этому документу проверяются при обращении к каждой накладной, как к единому целому и не могут разрешить доступ к какой-нибудь одной записи его табличной части "Состав", а к какой-нибудь другой запретить.
Пусть таблица "Документ.Накладная" содержит следующие записи:
Контрагент
(ссылка на Справочник.Контрагенты)
Состав (табличная часть)
В этом случае запрос, исполняемый для каждой накладной в процессе проверки следующего ограничения:
ГДЕ Состав.Количество > 50
будет иметь вид
ВЫБРАТЬ 1
ИЗ ТаблицаИзОднойПроверяемойЗаписи КАК Накладная
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Документ.Накладная.Состав КАК Состав
ПО Накладная.Ссылка = Состав.Ссылка
ГДЕ Состав.Количество > 50
Следовательно доступ будет разрешен только для записи "Трикотажная фабрика". Поэтому запрос:
ВЫБРАТЬ РАЗРЕШЕННЫЕ Контрагент, Состав.(Номенклатура, Количество)
ИЗ Документ.Накладная
а запрос к вложенной таблице:
ВЫБРАТЬ РАЗРЕШЕННЫЕ Контрагент, Номенклатура, Количество
ИЗ Документ.Накладная.Состав
поскольку ограничение накладывается только на записи верхнего уровня, но не на записи табличных частей.
Если нужно разрешить доступ еще и к тем накладным, у которых состав пустой, то ограничение может быть модифицировано так:
ГДЕ Состав.Количество > 50 ИЛИ Состав.Количество ЕСТЬ NULL
Если же необходимо разрешить доступ только к тем накладным, у которых в табличной части "Состав" нет записей с "Количеством", превышающем 50, то в ограничении необходимо использовать вложенный запрос:
Накладная1
ИЗ Документ.Накладная КАК Накладная1
ГДЕ Накладная1.Ссылка В
(
ВЫБРАТЬ Состав1.Ссылка
ИЗ Документ.Накладная.Состав КАК Состав1
СГРУППИРОВАТЬ ПО Состав1.Ссылка
ИМЕЮЩИЕ МАКСИМУМ(Состав1.Количество) ) ИЛИ Накладная1.Состав.Количество ЕСТЬ NULL
Объекты встроенного языка
Для работы с данными в объектной технике во встроенном языке 1С:Предприятия предусмотрены специальные объекты. Например для справочника это: СправочникиМенеджер , СправочникМенеджер. , СправочникСсылка. , СправочникОбъект. , и другие.
Все операции над объектами встроенного языка 1С:Предприятия выполняются в режиме "ВСЕ" (без использования режима "РАЗРЕШЕННЫЕ"). Для успешного получения разрешенных объектов в соответствующих методах объектов необходимо указывать отборы, не противоречащие ограничениям. Например, если на чтение из регистра сведений "КонтактнаяИнформация" установлено ограничение вида:
ГДЕ Тип = &ТипКонтактнойИнформации"
то для успешного выполнения метода
необходимо установить отбор:
Если ограничение доступа сложное и не может быть сформулировано в терминах отборов, то использование выборки (метод Выбрать() ) и аналогичных оказывается невозможным. В этом случае следует использовать запросы. Проектирование разграничения доступа к данным таким образом, чтобы ограничения могли быть сформулированы в терминах отборов, позволит использовать объекты встроенного языка с максимальной гибкостью.
Виртуальные таблицы запросов
При использовании в запросах без ключевого слова РАЗРЕШЕННЫЕ виртуальных таблиц в условиях установленных ограничений доступа к данным необходимо указывать отборы, не противоречащие ограничениям не только для запроса в целом, но и для виртуальных таблиц. Например:
ВЫБРАТЬ
КонтактнаяИнформацияСрезПервых.Представление
ИЗ
РегистрСведений.КонтактнаяИнформация.СрезПоследних(, Тип = &Тип ) КАК КонтактнаяИнформацияСрезПервых
ГДЕ
КонтактнаяИнформацияСрезПервых.Тип = &Тип
Выделенный отбор по виртуальной таблице "СрезПоследних" может содержать произвольное логическое выражение, допустимое для раздела ГДЕ, использующее поля, которые присутствуют в виртуальной таблице.
В 1С:Бухгалтерии 2.0 (или любой другой конфигурации) может возникнуть следующая проблема: возможность создания и редактирования элементов справочника Номенклатура должны быть не у всех пользователей программы. Для решения этой проблемы можно внести изменения в типовую роль Бухгалтер, обязательную для запуска системы и поэтому установленной у всех пользователей. Но изменение типовой роли может привести к трудностям при обновлении релиза конфигурации, поэтому данное решение не является приемлемым. В 1с запрет редактирования документа или справочника можно сделать гораздо проще.
Как реализовать в 1с запрет редактирования документа или справочника
Рассмотрим решение данной задачи без изменения типовых ролей. Суть его будет заключаться в создании и использовании своих, не типовых, объектов метаданных:
1. В конфигурации создадим новую, не типовую, роль. Назовем ее Номенклатура. Никакие галочки в ней проставлять не нужно, требуется только ее наличие;
2. Добавим в конфигурацию еще один общий модуль. Можно назвать его, к примеру, НастройкиДоступа. Если в вашей базе уже есть не типовой модуль, то можно использовать его;
3. Добавим в конфигурацию еще одну подписку на событие, назовем ее ПередЗаписьюНоменклатураНастройкиДоступа. В настройках подписки укажем тип данных источника — справочник Номенклатура. Выберем нужное событие для подписки (в нашем случае ПередЗаписью). В поле Источник укажем созданный вами общий модуль. Туда автоматически будет добавлена новая процедура, обрабатывающая событие данной подписки;
4. В этой процедуре пишем следующие строки кода:
Данный программный код проверяет наличие у пользователя роли Номенклатура и разрешает или запрещает запись элемента справочника.
5. Установим роль Номенклатура тем пользователям, которым должны иметь возможность записи элементов справочника, теперь никто кроме них не сможет вносить изменения в справочник.
На основании данного алгоритма можно реализовать ограничения на запись любых документов или справочников. Для этого можно использовать одну или несколько не типовых ролей.
Читайте также: