Моё почтение, господа. На досуге решил сочинить свою личную консоль запросов.
Целью разработки было создание лёгкой (в плане нагрузки на форму) и удобной (что относится к предпочтениям) консоли запросов. Понимаю, что часто хочется много функций, но такой задачи не стояло.
Это простая обработка общего назначения с основными (или минимальными) возможностями. Впоследствии было создано миниатюрное расширение, чтобы сохранять запросы из отладки. Решение написано "с нуля": за основу ничего не взято. Как всё устроено в сторонних решениях особо не изучал, поэтому мог не соблюсти какие-то "каноны".
Сравнивать данную обработку с популярными утилитами смысла нет. Публикую как любительскую разработку базового уровня.
Описание обработки
Ключевые объекты расширения
======================================
* Обработка "Консоль запросов": может быть выгружена и использоваться отдельно от расширения.
* Регистр сведений "Запросы".
Чтобы сохранить запрос в регистр из отладчика, нужно вычислить выражение вида bm_Запросы.СохранитьЗапрос(Запрос, Наименование). Наименование — необязательный параметр.
Особенности работы с консолью запросов
======================================
* Отсутствует событие активизации строки (чтобы не нагружать форму), поэтому выбор текущего запроса (выделяется отдельным цветом) осуществляется через DoubleClick.
* Получение кода на встроенном языке (параметры извлекаются из текста запроса, заполнения в коде нет).
* Вывод результата запроса / пакета запросов в табличный документ.
* Запросы (сохранённый запрос также можно выгрузить из регистра) сериализуются как дерево значений в файлы с расширениями
bmqval — простая сериализация через ЗначениеВФайл;
bmqxml — выгрузка в xml через СериализаторXDTO; этот способ добавлен позже специально для работы в безопасном режиме без разрешений; объём файла здесь больше, и время чтения/записи тоже.
Особенности работы с запросом
=====================================
* Параметры запроса и описания врем. таблиц заполняются автоматически (по кнопке Заполнить).
Колонки таблиц значений из описаний врем. таблиц создаются автоматически, тип значения указывается самостоятельно.
* Тип значения параметра запроса устанавливается автоматически при заполнении.
Согласно задумке редактировать тип значения параметра после автозаполнения не нужно. "Расширение" типа значения указывается в одноимённой колонке.
Например, чтобы преобразовать значение параметра типа Дата в Границу можно выбрать расширение "Дата включая" (граница с датой), "Момент включая" (граница с ссылкой).
В общем случае (за некоторыми исключениями) доступно расширение "Список значений" (наверно здесь уместней флаг типа "Доступен список значений", но эта мысль пришла позже).
Тем не менее, редактирование типа значения параметра технически возможно. Выбор типа производится через специальную форму, где доступно указание некоторых типов, которые невозможно выбрать через стандартную форму выбора.
* Некоторые типы значений параметров запроса преобразуются при передаче между формой и запросом (туда и обратно).
Так, тип МоментВремени в форме это ссылка на документ, тип Тип это ОписаниеТипов. При передаче в запрос ссылка на документ преобразуется в МоментВремени, ОписаниеТипов в Тип. При перехвате запроса выполняется обратное преобразование.
* В дерево запросов добавлена колонка "Исключение". Означает, что произошло исключение при установке текста схемы запроса. Понадобилась в связи с тем, что рабочий текст запроса может быть не прочтён схемой запроса (и обычным конструктором запроса тоже): такое может случиться из-за особенностей написания вложенного запроса в условии отбора виртуальной таблицы (сокращённый синтаксис / поле через точку / может, что-то ещё).
Конечно, если запрос проектируется в консоли, то он должен открываться в конструкторе запроса, и эта колонка не нужна, но если запрос перехвачен, то информация полезна. Если текст запроса вызывает исключение в схеме запроса, но сам запрос выполняется, и выполняется пакетно, в заголовке вывода будет указано "Сформировано без схемы запроса", а вместо наименований временных таблиц будут номера запросов.
Нюансы работы с временными таблицами
====================================
* В табличной части обработки Врем. таблицы добавлена колонка Используемая ВТ. Здесь можно выбрать "предопределённую" врем. таблицу. Чтобы добавить выбор предопр. врем. таблицы, нужно доработать модуль обработки.
Сейчас добавлена одна предопр. врем. таблица ВидыСубконто (видоизменённая функция из типовой конфигурации). Эта врем. таблица формируется при отражении документа в рег. учёте и не может быть помещена из таблицы значений, так как содержит тип колонки Тип.
* При перехвате запроса также может быть, что описание типа колонки пустое. Может произойти, если в запросе выбирается Неопределено. В этом случае перед обратным помещением врем. таблицы описание типов формируется как "Null, Число".
Протестировано на платформе 8.3.20.
Обновление Январь 2023
В консоль запросов добавлен свой конструктор запроса.
Мотив разработки — такой же: нарисовать удобную обработку для практического использования (насколько это возможно). Решение оригинальное.
Разработка растянулась по времени: в том числе приходилось и откладывать надолго, и менять концепт, и переписывать.
Исторически у этого конструктора сформировалось наименование "Схема запроса". Наверно потому, что сначала это было просто дерево, отображающее объектную схему запроса. В то же время название достаточно удобно, чтобы отличать его от встроенного тонкого конструктора запроса. На командной панели обработки они и соседствуют с названиями "Конструктор" и "Схема".
На главной странице расположено дерево схемы запроса. Его составными элементами являются запрос, оператор и источник. Рядом отображается текст текущего запроса. В дерево можно добавить запрос, оператор и источник-вложенный запрос. Удалить можно запрос или оператор. Текст текущего запроса может быть изменён — при этом будет изменено и дерево схемы.
Оператор запроса открывается в отдельной странице. Слева расположены источники, справа — страницы с разнообразными свойствами. Там же находится дерево таблиц. Его структура не обязательно соответствует структуре доступных таблиц схемы запроса. Например, внешние источники данных было решено подчинить общей ветке, перерасчёты - продублировать рядом с регистрами расчёта, виртуальные таблицы связать с физическими.
В источники можно добавить таблицу из дерева таблиц и описание временной таблицы. Можно удалить источник, переименовать, заменить (как в привычном конструкторе).
Особенность работы с вложенным запросом такова, что добавить его возможно в дереве схемы (он будет подчинён оператору как источник, но в то же время являться и вложенным запросом), а удаление происходит из оператора.
У одного запроса может быть несколько операторов. В дереве схемы главным является первый оператор (с индексом 0). Только при открытии главного оператора доступны некоторые свойства и изменение состава/порядка колонок. Если операторы поменять местами, то главным станет другой оператор, т.е. признак завязан только на порядковый номер.
При работе с полями выборки можно включить "режим замены" (если оператор не главный, режим включен по умолчанию). В этом случае можно только устанавливать выражения полей (перетаскиванием или редактированием).
Как правило, добавление строк таблиц формы (источников, выбираемых полей, соединений, отборов и проч.) происходит через перетаскивание. Может быть так, что добавить строку можно и через перетаскивание, и через кнопку Добавить.
Для таблицы соединений реализован следующий приём добавления соединения: перетаскиваем на таблицу по порядку поле источника и поле приёмника (в обработке так называются левая и правая таблицы).
У группировок схемы запроса есть такие особенности:
— если указано поле, содержащее агрегатную функцию, то группировки формируются автоматически
— если указано хотя бы одно выражение группировки, то остальные формируются автоматически
Поэтому по умолчанию первая группировка именуется в обработке как "Авто". Стоит понимать так, что не обязательно указывать группировки явно.
Чтобы применить агрегатную функцию, нужно выделить нужную строку (из "выбираемых полей") и вызвать соответствующую команду.
Параметры источников для удобства вынесены в одну общую таблицу.
У таких свойств запроса как Порядок и Контрольные точки итогов элементом коллекции могут выступать как произвольные выражения схемы запроса, так и колонки запроса. Колонка добавляется перетаскиванием из выбираемых полей, выражение — перетаскиванием или через кнопку Добавить.
Находясь в форме схемы запроса, можно передать и выполнить в консоли текст схемы запроса по текущий запрос. Если форма схемы будет закрыта без сохранения, то в консоли восстанавливается исходный текст запроса текущей строки.
Из нюансов внутренней реализации выделю следующее.
Во время разработки было потрачено много времени на попытки разобраться в корректном управлении составом вложенных таблиц, когда это выходит за рамки обычного добавления колонок табличных частей — но не удалось: что-то работало как надо, а что-то искажало текст запроса. Для тестирования использовались, может, совсем уж выдуманные запросы с объединением нескольких вложенных таблиц (включая пустые) с произвольными полями. Был даже совершён небольшой экскурс в типовой конструктор в поисках какого-то хинта, но без результата (скажем так, что там своя система). Хорошо, что у запроса выбора есть методы получения и установки текста запроса, которые позволили обойти это затруднение.
В то же время обработка не использует присваивание и установку выражения схемы запроса полю, чтобы не породить неперехватываемое исключение.
У соединений есть такая особенность, что при чтении схемы условие связи раскладывается на операнды (к примеру какое-то составное И). При обратной установке соединений это может привести к ошибке ("противоречивая связь"). Поэтому при чтении схемы условия с одинаковой связью объединяются.
При работе с запросом используется "ленивое" обновление схемы запроса. Так, при простом перетаскивании поля в таблицу обращения к серверу и обновления схемы запроса не будет. При вызове окна редактирования произвольного выражения схема будет обновлена частично. Перед переименованием, удалением, заменой источника схема обновляется полностью. В этом есть свои плюсы и минусы. Такой способ был выбран, т.к. было лень возиться с динамическим обновлением схемы (не знаю насколько оно вообще уместно).
При обновлении схемы свойства запроса и оператора заполняются заново: например, выбираемые поля полностью очищаются.
Чтобы предупредить возможное исключение "Неоднозначное поле", таблицы операторов заранее анализируются на предмет этой ошибки. Желательно сразу же переименовать конфликтующую таблицу. Иначе может быть такой случай: перетащили таблицу (получили предупреждение), перетащили поля, добавили какие-то соединения, при обновлении схемы запроса уже получаем исключение, переименовываем таблицу, и форма обновляется из необновлённой схемы запроса: исчезают некоторые выбираемые поля, соединения и проч.
Резюмируя, некоторый условный минимум необходимых функций класса конструктора запроса в данной обработке присутствует. Что-то не реализовано: например, компоновка данных.
Настоящую версию было решено интегрировать с главной обработкой Консоль запросов. Как и ранее, обработка может быть выгружена и использоваться независимо от расширения.
P.S. Какой-то ворох ошибок исправлен, но что-то могло и остаться.