Происхождение Системы
В начале далекого уже сегодня 2007 года у меня возник проект, в котором стояла задача разработки системы контроля прав для конфигурации на платформе 1С:Предприятие 7.7. Стоял выбор - полностью перерабатывать конфигурацию заказчика или сделать что-то универсальное.
"Универсальное решение для любой конфигурации 7.7 ? Без подписок на события и т.п.? Не смешите меня - такое невозможно сделать!" - именно эти слова коллеги пробудили во мне спортивный интерес и практически "на спор" была разработана Система управления правами для 1С:Предприятие 7.7
Система построена на базе небезызвестного компонента 1С++, который в то время как раз "обзавелся" функциями перехвата событий. И по сегодняшний день в платформе 1С:Предприятие 8 нет подписок на события формы - а в 1С++ они работали уже тогда!
История разработки
Как и положено универсальному инструменту главным условием при разработке системы стало не трогать саму конфигурацию, в которой предполагалось управлять правами. Нужно было обойтись минимальными изменениями, скажем, одной строкой кода в глобальном модуле. И это получилось!
Конечно же, разработка не была простой. Потребовалось "разобрать на запчасти" все возможные события платформы, побороться с особенностями не только модальных, но и весьма специфических (как оказалось) окон. Таких как, например, выбор периода для журнала...
Желающим ознакомиться с ходом разработки можно заглянуть в файл whatsnew.txt - там описано много нетривиальных проблем, которые пришлось решать прямо по ходу проекта. Был задействован целый ряд инструментов - и DynamicWrapper для вызова WinAPI процедур, и компонента UsersDef.dll для управления пользователями прямо из пользовательского режима.
Возможности Системы
Достоинства этой Системы управления правами по сравнению с типовым механизмом такие.
- Любое изменение прав применяется сразу же. Пользователь не только не обязан теперь выходить из программы, а даже может не закрывать форму, к кнопке которой у него забрали доступ! При нажатии на кнопку произойдет проверка прав и кнопка заблокируется еще до выполнения действия.
- Пользователей можно объединять в группы. Один пользователь может принадлежать сразу нескольким группам (в типовой платформе пользователю можно дать только один набор прав). Права устанавливаются как на группы, так и на отдельных пользователей. Запрет на пользователя имеет больший приоритет, чем разрешение на группу. С точки зрения конфигуратора группа - это обычный пользователь, в имени которого идет 2 знака подчеркивания впереди, например "__Бухгалтерия". Вход в программу под такими пользователями программно блокируется.
- Права доступа настраиваются не только для объектов метаданных, но и для форм и их элементов! Обязательное условие для управления доступом к элементам - наличие у элемента формы идентификатора - неименованные элементы Системой не обрабатываются.
- Управлять пользователями можно полностью из-под пользовательского режима, не заходя в Конфигуратор.
Помимо "фич" есть и просто полезные инструменты, облегчающие труд по работе с правами.
- Возможно сохранить права доступа, настроенные через наборы прав. Правда, для этого придется зайти в ИБ от имени каждого пользователя, для которого нужно сохранить права. При этом наборы прав станут группами пользователей, а права из наборов загрузятся в Систему управления
- Есть даже режим отладки, когда каждая проверка прав записывается в файл лога и/или выводится в окно сообщений.
Порядок установки и запуска
Чтобы попробовать Систему самому, достаточно выполнить лишь несколько несложных действий. Работу можно производить на любой конфигурации. Перед тем, как выкладывать эту Систему сюда я проверял ее на первой попавшейся конфигурации - типовом "Бухучете для Украины" (релиз 281). На всякий случай уточню, что все действия по настройке производятся в Windows от имени администратора - я не проверял, как поведет себя Система при работе с ограниченными правами.
Итак по порядку.
Шаг 1. Подготовка файлов
Берем любую конфигурацию для платформы 7.7. Скачанный архив разворачиваем в папку ИБ с сохранением иерархии архива.
Шаг 2. Регистрация компонентов
Файл dynwrap.dll из каталога ИБ переносим в папку \Windows\System32 и регистрируем в системе командой
regsvr32.exe dynwrap.dll
Шаг 3. Доработка конфигурации
Доработка конфигурации выполняется за 1 минуту. Если у вас в конфигурации уже используется FormEx и 1C++, тогда действительно понадобится добавить всего одну строку в глобальный модуль. Если нет, то полный текст "вставки" будет выглядеть так:
// {секция объявления переменных} ...
Перем Сервис Экспорт;
Процедура ПриНачалеРаботыСистемы()
// ... {здесь ваш уже существующий текст, если есть} ...
// (1) эти строки, если в конфигурации ранее не использовался FormEx и 1C++
ЗагрузитьВнешнююКомпоненту("FormEx.dll");
Сервис = СоздатьОбъект("Сервис");
ЗагрузитьВнешнююКомпоненту("1CPP.dll");
// конец (1)
// (2) вызов Системы управления правами
ОткрытьФорму(""Обработка"", ""фоновый"", КаталогИБ()+""Security\УправлениеДоступами.ert"");
// конец (2)
КонецПроцедуры
Еще одна микродоработка связана с тем, что у некоторых объектов при проверке права открытия формы окно все же "мелькает" на экране. Во избежание этого был доработан механизм "подмены" формы на свою. Ему требуется, чтобы в метаданных была пустая обработка с именем "ОшибкаДоступа_Тихо" и модулем из 3-х строк:
Процедура ПриОткрытии()
СтатусВозврата(0);
КонецПроцедуры // ПриОткрытии
Благодаря подмене "проблемных" форм объектов на эту форму окна даже не мелькают (если нельзя открывать форму объекта).
Вот и все доработки. Теперь можно запускать 1С:Предприятие.
Шаг 4. Загрузка прав из существующих наборов
Вместе с предприятием сразу откроется обработка "Управление доступами". Она откроется только один раз - при первом запуске - и сформирует файл для хранения прав (файл \Security\mdsec.mdb в каталоге ИБ). Если что-то пойдет не так - можно просто удалить этот файл - при следующем запуске Система создаст его снова и откроет форму обработки. Безусловно, открыть обработку можно и вручную.
В форме обработки "Управление доступами" нажмите кнопку [Импорт объектов и прав]. При этом
- будет загружена структура метаданных вплоть до форм и именованных реквизитов на них
- проанализированы права доступа текущего пользователя к объектам и такие же права будут загружены в Систему
- набор прав будет превращен в группу пользователей, а текущий пользователь помещен в эту группу
С этого момента можно уже полноценно работать в системе.
Учтите, что права доступа к новым объектам по умолчанию не выдаются! Для реквизитов формы придется давать права вручную, ведь в классической платформе 7.7 не существует прав на формы и их реквизиты.
Заключение
Если запустить Систему не получится - попробуйте еще раз детально изучая каждый шаг, описанный выше. Если неполучится и после этого - пишите в комментариях, будет разбираться.
Просьба не "бежать" устанавливать Систему сразу на боевой базе. Да, она уже достаточно отлажена, но падения платформы еще возможны.
Чтобы "проникнуться" результатами работы Системы сразу после установки сделайте вот что. Откройте любой документ/элемент справочника, найдите там какое-то поле ввода или кнопку (только обязательно с установленным идентификатором!). В обработке управления правами доступа попробуйте установить право и, не закрывая "подопытную" форму, нажать на объект для которого изменили права. Работает? Таки неправ был коллега - бывает и такое! ;)