Разработчики в управляемых приложениях применили новый механизм настройки прав доступа, о которых и пойдет речь.
Будут перечислены все те грабли, которые собрал автор, чтобы вы о них знали.
Наверняка, уже все знают, что из себя представляет новая система, поэтому предистория вкрадце:
Как было раньше( в обычном приложении):
Есть документ. Есть Роли - ПолныеПрава, ДокументНетДоступа, ДокументТолькоЧтение, ДокументЧтениеИРедактирование. В конфигураторе(аналогичный механизм в реж предприятия) вы выставляете пользователям эти роли и у них появляются соответствующие права доступа на документ. Все просто и скучно и даже зевать хочется.
С введением управляемого приложения разработчики решили усложнить(читается как расширить) настройки прав доступа.
Теперь:
Вводная та же. Чтобы дать пользователю какие-то права на документ - сначала вам необходимо создать элемент справочника Профили групп доступа. Это некий агрегирующий(суммирующий значения) объект, который объединяет роли в группы ролей. Теоритически таких профилей можно создать сколько угодно много с различным набором ролей( N*(n-1), где N - количество ролей), но на практике количество профилей определяется количеством должностных обязанностей пользователей в организации и их гораздо меньше, чем ролей.
Чтобы "привязать" эти профили к пользователям - нужно создать элементы справочника ГруппыДоступа. В типовых они создаются автоматически, когда вы отмечаете галочками профили для пользователя. Этот справочник соединяет профиль и пользователя(или нескольких пользователей).
При записи этого элемента справочника система автоматически добавляет роли (из профиля) в роли пользователя. Поэтому не стоит напрямую редактировать роли в конфигураторе, как раньше - при редактировании прав в Предприятии все роли в конфигураторе будут обновлены на роли из профилей пользователя. Кроме того, будет наблюдаться явное противоречение между набором профилей с ролями и ролями, установленными в конфигураторе.
Как хранятся роли в Профиле групп доступа, спросите вы. Ведь роли - это объекты МД, это не ссылочные типы. Отвечаю - для этого(и не только) разработчики создали служебный справочник ИдентификаторыОбъектовМетаданных, в котором хранится( в иерархии!) имена, синонимы, значения пустых ссылок всех объектов МД. Если вы хотите создать Профиль программно и добавить в него роль, то код примерно будет таким:
Но если мы добавили новую роль в конфигурации, то как она попадет в справочник? Хороший вопрос. У справочника ИдентификаторыОбъектовМетаданных есть метод, позволяющий обновлять его данные. это:
Процедуру следует запускать каждый раз, когда вы вносите изменения в метаданные, особенно когда изменяете роли, объекты, связанные с новыми ролями.
Отлично. Роль добавили, идентификаторы обновили.
Но обратная связь не работает - вы в режиме предприятия назначили пользователю профиль( с созданием группы доступа), а роль у пользователя в конфигураторе не добавилась! Что делать?
За синхронизацию ролей/профилей отвечает константа ПараметрыРаботыПользователей. Если роли не обновляются в конфигураторе, следует обновить её значение:
Хорошо, скажите вы. А как быть, если я хочу создать группы доступа программно? Да не вопрос. Единственное ограничение - не допускаются дубли связок Профиль-Пользоваль в группах доступа. Примерный код будет таким:
После выполнения этого кода, если все, что нужно обновлено - типовая конфигурация добавит пользователю роли.
Раз уж пошли по программному пути, вот код, который добавляет пользователя в справочник Пользователи и ПользователяИБ в ПользователиИнформационнойБазы:
Если вы добавляете не программно, то добавлять нужно из режима Предприятия - тогда пользовательИБ у вас сам создатся.
И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе - и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит - система не даст зайти под пользователемИБ, которого нет в справочнике Пользователи.
Если в рассчитываемом регистре установлено свойство Период действия, в сформированном наборе могут присутствовать записи, у которых период действия принадлежит более раннему периоду, чем период регистрации. В этом случае они могут вступать в конкуренцию на этом периоде действия с записями более раннего периода регистрации. Чтобы такие записи могли иметь непустой фактический период действия, необходимо допол- нить сформированный набор соответствующими сторно-записями.
Добавление сторно-записей происходит с использованием метода ПолучитьДополнение() набора записей регистра. Ниже приведен текст модуля, позволяющий добавить в набор сторно-записи. Добавление записи происходит при помощи вызова процедуры ДобавитьСтрокуСторноОсновныхНачислений(), которая должна быть описана в процедуре РассчитатьОсновныеНачисления(). При этом для каждой сторно- записи необходимо добавить новую строку в табличную часть документа, чтобы при проведении эта запись попала в регистр
При формировании сторно-записей данные всех измерений и реквизитов записи указаны в строке дополнения. Также в этой строке содержатся данные о периоде регистрации и периоде действия сторно-записи. Ресурсы сторно-записи не заполняются, так как запись будет рассчитана в общем порядке
Для расчета записей необходимо сначала сформировать набор этих записей в регистре расчета. Это позволит использовать расчетные механизмы платформы. Формирование записей при расчете аналогично рассмотренному выше модулю формирования записей при проведении. Однако если при проведении в качестве набора записей выступали движения доку- мента по регистру (Движения.ОсновыеНачисленияРегл), то при расчете без проведения такой набор необходимо создать.
Ниже приведен модуль, позволяющий сформировать набор записей регистра расчета по данным документа. В тексте используется процедура ДобавитьСтрокуОсновныхНачислений(), описанная выше. Этот модуль является начальным этапом процедуры РассчитатьОсновныеНачисления(), которая вызывается при нажатии кнопки Рассчитать в форме документа.
При формировании набора записей значения ресурсов не играют роли, так как они будут в дальнейшем изменены при расчете. В том числе эти значения могут быть пустыми.
Когда требуется более тонкая настройка доступа, на помощь приходит механизм RLS - Record Level Security.
Конфигурации системы «1С:Предприятие» 8 изначально позиционировалась как программа для многофирменного учета, и один из первых возникающих вопросов – как бы сделать так, что бы пользователь видел только те данные, которые ему положено видеть, и никакие другие? Конечно, есть роли, с помощью которых можно разрешить или запретить то или иное действие над объектом конфигурации, есть интерфейсы, позволяющие минимизировать пункты меню. Но как быть в случае, когда к одному и тому же объекту конфигурации нужно организовать «интеллектуальный» доступ, скрывающий только определенный записи? Ярким примером служит справочник «Организации»: учет в базе ведется по нескольким фирмам, справочник физически один, документы по фирмам ведутся одни и те же. Понятно, что в этом случае в назначенных ролях пользователя нельзя просто убрать права на чтение и просмотр, нужна более детальная настройка - RLS.
Ограничения RLS можно задавать для следующих действий над объектами базы данных:
- Чтение – получение записей из таблицы базы данных;
- Добавление – добавление новых записей без изменения существующих;
- Изменение – изменение существующих записей;
- Удаление – удаление некоторых записей без внесения изменений в другие.
Ограничение доступа задаётся подмножеству, определяемому условием выборки, заданному с помощью языка запросов. Если результат выполнения запроса ИСТИНА, то доступ на определенное действие будет предоставлен, в противном случае доступ будет запрещен.
Пример запроса:
В качестве переменных в запросах RLS используются специальные объекты конфигурации – параметры сеанса. Кроме привычных типов объектов, тип параметра может быть такжеNULL, УникальныйИдентификатор, ФиксированныйМассив, ВидДвиженияНакопления и др. Особо хочется отметить тип ХранилищеЗначений, позволяющий хранить разнородные данные в одном параметре (например, ОбщиеЗначения). Значения параметров сеанса обычно задается в процедуре ПриНачалеРаботыСистемы.
Так, при выводе списка номенклатуры можно отображать только некоторые группы справочника, при выборе контрагента в документ можно показывать не всех контрагентов, а только тех, к которым позволено работать пользователю, при формировании отчета скрывать данные по определенному подразделению. Вариантов применения RLS масса, нужды бизнеса иногда диктуют порой умопомрачительные требования, например разграничения доступа к проектам и спецификациям.
Заданные ограниченияRLS добавляются системой к каждому запросу, каждому действию с базой данных. Поэтому необходимо помнить, что злоупотребление механизмом RLS чревато снижением быстродействия системы.
В типовых конфигурациях возможность настройки прав доступа на уровне записей организована только для групп пользователей. Т.е. каждый пользователь системы включается в одну или несколько групп, для которых настраивается правило доступа к объекту или множеству элементов. Чем в большее количество групп входит пользователь, тем ниже будет производительность системы.
Платформа 1С в явном виде не предоставляет возможность отладки работы механизма RLS, но тем ни менее сделать это вполне реально. Для этого можно воспользоваться универсальной консолью отчетов (версия не ниже 2.6.9.2), на закладке «Данные» у которой есть функция «Выполнить от имени». Обработка создаст COM-соединение с помощью указанного имени пользователя и пароля, и выдаст результат выполнения запроса в консоль.
Используя имеющиеся в конфигурациях шаблоны ограничений, или создавая свой собственный запрос с помощью конструктора ограничений доступа к данным, можно настроить работу базы данных до мельчайших деталей, расписав кому что видно, доступно и дозволено. Единственным минусом является снижение производительности базы данных, но, как говорится, всё хорошее должно быть в меру.
Многие, кто еще не касался СКД или касался поверхностно, высказывают - СКД сырая приблуда, на которой можно рисовать простенькие отчеты, типа вывода на печать справочника номенклатуры!
Так вот, на самом деле СКД очень мощный и гибкий инструмент, позволяющий на несколько минут создать хороший и многофункциональный отчет!
Этим примером я хочу Вам это показать!
Цель:
Необходимо для проверки сдаваемой отчетности создать в ЗУПе отчет, выводящий по Организации Налогооблагаемые базы: ОБЩАЯ, БАЗА ПФР, БАЗА ФОМС, БАЗА ФСС, БАЗА ФСС от НС, БАЗА не облагаемая и Скидка.
В отчете Нужна разбивка по месяцам, Видам Дохода, Видам расчета входящих в выше указанный Вид дохода,
Сумму представленную по Виду расчета, необходимо развернуть по ФизЛицу с указанием документа начисления!
Создание:
И так начнем:
1. Создаем отчет и Открываем Схему Компоновки Данных
2. В Наборах Данных -> Добавляем Набор данных - Запрос
Создаем не сложный запрос, собирающий доходы с регистра накопления СтраховыеВзносыСведенияОДоходах и по условиям распределяющий суммы в разные базы:
Закладка - Набор данных:
3. Так как у нас только один набор данных, закладку Связи Наборов Данных пропускаем.
Вычисляемые поля, тоже нам не нужны - пропускаем.
4. Для расчета итогов по группировкам на закладке Ресурсы добавляем:
5. В запросе я использовал Параметры, теперь на Закладке Параметры их нужно указать:
6. Закладки Макет и Вложенные Запросы пропускаем, переходим на Закладку Настройки
В верхней части формы необходимо указать выводимые данные отчета - воспользуемся Конструктором Настроек..
Далее комментировать не буду, смотрите по картинкам:
После нажатия на ОК получаем:
7. При формировании отчет будет выводить группировку месяц как дату 01.01.2010, сделаем же ее вида Январь 2010
Для этого в нижней части перейдем на Закладку Условное оформление и добавим строку:
В колонке область выберем Месяц, а в колонке Оформление зададим формат вывода:
Хранилище значений - это тип, который появился в 8-ой версии 1С позволяющий сохранять прямо в базе различные данные, включая двоичные данные (произвольные файлы). Например, так можно хранить в базе данных JPG-картинки, Word-документы и т.д. Причем данные будут храниться в самой базе (файле 1CD или в таблицах на SQL-сервере) и будут включены в штатную выгрузку базы или резервную копию средствами SQL Server.
Тип Хранилище значения может быть назначен реквизиту справочника, документа, ресурсу регистра сведений и т.д.
Примеры:
Восьмерка поддерживает сжатие данных, помещаемых в хранилище:
Если это были ДвоичныеДанные, то их можно восстановить из хранилища значения методом Получить и записать в файл методом Записать().
Если это был, например, Word-документ (doc-файл, или другой файл зарегистрированного типа), то его можно открыть так:
Чтобы очистить поле типа Хранилище значения, нужно присвоить ему Неопределено:
Если в Хранилище значений содержались какие-то ссылки, то они не будут контролироваться при контроле ссылочной целостности (операция Удаление помеченных объектов или метод НайтиПоСсылкам).
К сожалению, 1С не содержит встроенных методов для проверки того, заполнено хранилище или нет.
Такой вариант не работает:
Работает только такой вариант:
Но он требует затрат времени на извлечение данных из хранилища.
Поэтому, если это критично, нужно заводить еще один флаг, который указывает, содержит ли хранилище значение.