Книга знаний

1С:Предприятие / v8 / Приемы программирования / Запросы

v8: Контроль над исполнением всех запросов в 1С

Способ, позволяющий перехватить выполнение всех запросов в 1С. Полезно для контроля прав доступа.Автор статьи: Гений 1С | Редакторы: Волшебник
Последняя редакция №2 от 12.09.06 | История
URL: http://kb.mista.ru/article.php?id=363

Ключевые слова: запрос,права доступа


Введение


В контроле прав доступа остается одно узкое место - нет возможности проконтролировать запросы, которые выполняют пользователи.
Было бы неплохо, если можно было бы отлавливать событие - ПередВыполнениемЗапроса(Запрос), но увы, 1С не предоставляет нам такой возможности.

Но не все потеряно, парсинг творит чудеса.

Методика


Объект запроса не может быть создан иначе как через вызов конструкции вида:
Запрос=Новый Запрос(ТекстЗапроса);

Возможные варианты этого конструктора:
Запрос=Новый Запрос;
Запрос=Новый Запрос();
Запрос=Новый Запрос(ТекстЗапроса);


Следовательно мы должны заменить все обращения к конструктору на конструкции вида:
Запрос=Обработки.ЛовушкаЗапроса.Создать().УстановитьТекст(ТекстЗапроса);

Где УстановитьТекст возвращает сам экзмепляр обработки-ловушки.

Ну или, заведя глобальную функцию можно сделать красиво:
Запрос=НовыйЗапрос(ТекстЗапроса);


Т.е. обрабатываем все тексты модулей и там, где встречаем конструктор запроса, заменяем "Новый Запрос" или "Новый Запрос(" на "Обработки.ЛовушкаЗапроса.Создать().УстановитьТекст(ТекстЗапроса)" или на "НовыйЗапрос(".

Таким образом, вместо объекта "Запрос" создается обработка "Ловушка запроса", которая содержит такие же свойства и методы, что и объект "Запрос".

Теперь, при выполнении запроса, сначала сработает метод "Выполнить" ловушки, произойдет контроль прав доступа, автоматическое ограничение условий и только после этого выполнение кода запроса.

Дополнительно необходимо разработать процедуру полного (ключевые слова и выражения) или частичного парсинга (блоки запроса) парсинга текста запроса перед выполнением в древовидную структуру.

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

Дополнительные соображения


Чтобы не разбирать каждый раз текст запроса, можно построить хэш запросов.
Таким образом, если запрос повторяется, то мы имеем уже готовое дерево разбора запроса, и можем быстро добавить условия по правам.
Заключение
Таким образом можно также элегантно решить проблему замены во всех запросах "ВЫБРАТЬ" на "ВЫБРАТЬ РАЗРЕШЕННЫЕ", что особенно актуально для конфигураций с RLS.

Данный метод позволит обойтись без РЛС. Таким образом, пользователи, запускающие например оборотно-сальдовую ведомость, будут видеть результаты только по доступным им счетам, а по остальным счетам не увидят никаких данных.

Просто, красиво, элегантно, как всегда - от Гения 1С. Идея родилась у меня в ходе неспешного обсуждения в аське с TormozIT вопросов парсинга текста запроса.

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика