v8: Контроль над исполнением всех запросов в 1С Ключевые слова: запрос,права доступа
Введение
В контроле прав доступа остается одно узкое место - нет возможности проконтролировать запросы, которые выполняют пользователи.
Было бы неплохо, если можно было бы отлавливать событие - ПередВыполнениемЗапроса(Запрос), но увы, 1С не предоставляет нам такой возможности.
Но не все потеряно, парсинг творит чудеса.
Методика
Объект запроса не может быть создан иначе как через вызов конструкции вида:
Запрос=Новый Запрос(ТекстЗапроса);
Возможные варианты этого конструктора:
Запрос=Новый Запрос;
Запрос=Новый Запрос();
Запрос=Новый Запрос(ТекстЗапроса);
Следовательно мы должны заменить все обращения к конструктору на конструкции вида:
Запрос=Обработки.ЛовушкаЗапроса.Создать().УстановитьТекст(ТекстЗапроса);
Где УстановитьТекст возвращает сам экзмепляр обработки-ловушки.
Ну или, заведя глобальную функцию можно сделать красиво:
Запрос=НовыйЗапрос(ТекстЗапроса);
Т.е. обрабатываем все тексты модулей и там, где встречаем конструктор запроса, заменяем "Новый Запрос" или "Новый Запрос(" на "Обработки.ЛовушкаЗапроса.Создать().УстановитьТекст(ТекстЗапроса)" или на "НовыйЗапрос(".
Таким образом, вместо объекта "Запрос" создается обработка "Ловушка запроса", которая содержит такие же свойства и методы, что и объект "Запрос".
Теперь, при выполнении запроса, сначала сработает метод "Выполнить" ловушки, произойдет контроль прав доступа, автоматическое ограничение условий и только после этого выполнение кода запроса.
Дополнительно необходимо разработать процедуру полного (ключевые слова и выражения) или частичного парсинга (блоки запроса) парсинга текста запроса перед выполнением в древовидную структуру.
Дополнительный бонус такого подхода - мы можем не только устанавливать параметры запроса, но и получать список и значения этих параметров, что очень удобно для анализа запросов в типовых конфигураций.
Дополнительные соображения
Чтобы не разбирать каждый раз текст запроса, можно построить хэш запросов.
Таким образом, если запрос повторяется, то мы имеем уже готовое дерево разбора запроса, и можем быстро добавить условия по правам.
Заключение
Таким образом можно также элегантно решить проблему замены во всех запросах "ВЫБРАТЬ" на "ВЫБРАТЬ РАЗРЕШЕННЫЕ", что особенно актуально для конфигураций с RLS.
Данный метод позволит обойтись без РЛС. Таким образом, пользователи, запускающие например оборотно-сальдовую ведомость, будут видеть результаты только по доступным им счетам, а по остальным счетам не увидят никаких данных.
Просто, красиво, элегантно, как всегда - от Гения 1С. Идея родилась у меня в ходе неспешного обсуждения в аське с TormozIT вопросов парсинга текста запроса.
|