Конструктор запросов, консоль запросов - замечательные средства. Но они "статические", офф-лайновые. Суть идеи состоит в возможности вызова консоли запросов в режиме исполнения. Неприметные, на первый взгляд, бонусы, состоят в следующем:
- в отлаживаемом запросе уже выставлены все, порой многочисленные, параметры, причем именно так, как это делает реальный код. Исключаются досадные ошибки установки параметров при офф-лайновой отладке;
- часто SQL-запрос генерируется динамически. В режиме исполнения обработка предоставляет именно исполняемый запрос, не прибегая к остановке в точке создания текста запроса;
- в некоторых случаях, например, в транзакции поведения, сами данные в базе существуют только в этой транзакции, например, временно записанные наборы записей регистров расчета. Естественно, ситуация может быть смоделирована в офф-лайне, но это лишние затраты времени;
- громоздкие пакеты автоматически разлагаются на отдельные запросы, удобно располагаясь в дереве консоли, под каждым генерируются запросы на выборку из временных таблиц и их уничтожение, так что можно быстро найти проблему, просто смотря на получаемые промежуточные данные и играть этими данными.
- незначительная модификация кода типовых конфигураций позволяет наблюдать работу громоздких запросов непосредственно при обнаружении проблемных ситуаций. Так, я знаю, что в 36 релизе УПП в 2-НДФЛ косо работал запрос по вычетам из-за неправильного отбора по обособленному подразделению (в 37 исправили); я знаю, что расчет НДФЛ до сих пор косит в отношении обособленных подразделений, в частности, может проставлять подразделения "чужой" организации; я знаю, что в 4-ФСС нового образца игнорируется настройка обложения ФСС НС и ПЗ. И множество подобных ситуаций.
- сохранненный в конфигурации отладочный код не мешает обычной работе пользователя, но позволяет быстро выяснить причины обнаруженной им проблемы.
Реализация идеи состоит в подмене объекта Запрос обработкой ПСГ_ОберткаЗапроса, имеющей сходные свойства и методы (увы, кроме метода Выполнить()). В обычном режиме эта обработка исполняет запрос как обычно, но в определенном режиме выводит запросы в консоль запросов.
К сожалению, для использования такого механизма в типовых конфигурациях в настоящее время приходится модифицировать код в части создания объекта "Запрос" и в местах вызова метода "Выполнить()", подменяя объект "Запрос" обработкой-оберткой. Остается мечтой маленькая платформенная модификация объекта "Обработка" - добавление метода "Выполнить()" (вот беда, именно его нельзя добавить просто так из-за наличия одноименной функции языка) и генерация этим методом события "ПриВыполнении", которые позволили бы избежать модификаций кода в местах вызова исполнения запросов. Впрочем, если уж смотреть глобально, можно изменить поведение самого объекта "Запрос", добавить в него генерацию событий "ПриВыполнении", "ПриУстановкеТекста", "ПриУстановкеПараметра" соответствущими подписками. Или же реализовать возможность отладки запросов в самом этом объекте Запрос.
Альтернативно, вероятно, можно было бы написать com-компоненту, имеющую-таки метод "Выполнить()" и способной генерировать нужные синхронные события.
Состав объектов для работы с запросами описан подсистемой ПСГ_РаботаСЗапросами.
Активация режима отладки производится обработкой "Управление спецрежимами". Фактически, она управляет содержимым строкового параметра сеанса "ПСГ_Параметры". Обертка запроса при выполнении проверяет это параметр на наличие подстроки, сигнализирующей о необходимости отладки (по умолчанию "/debug").
При наличии параметра "/ДиспетчерЗапросов" открывается собственная форма обертки запросов, полезная возможностью выводить занные в таблицы и сводные таблицы.
В демонстрационной базе решается модельная задача: найти периоды постоянства надбавки по штатному расписанию для всех работников.
Для этого включена обработка "Пример использования обертки запроса".