Возможности текущей версии:
- базовый функционал (редактирование запросов, исполнение, сохранение в файл, работа с параметрами, и т.д.)
- полноценная работа в режиме управляемых форм в режиме толстого и тонкого клиента
- поддержка всех типов 1С, в том числе момента времени, границы, уникального идентификатора, типа «Тип», вида движений, таблиц значений (табличные части), и т.д.
- поддержка списков, массивов, таблиц значений в параметрах, удобное их редактирование
- перехват любых запросов из отладчика вместе с параметрами и временными таблицами
- возможность получения всех результатов запроса («ВыполнитьПакет»)
- просмотр перехваченных временных таблиц, изменение их данных для отладки запроса
- вывод результата в виде таблицы, дерева, а так же в табличный документ
- работает при запрете синхронных методов (использует только асинхронные методы клиента)
- отладка запросов, получающих большое количество данных: два варианта ограничения количества строк в режиме отладки
- сохранение комментариев в запросах после конструктора
- запоминает последний файл, с которым производилась работа
- просмотр временных таблиц, формируемых запросом
- перехват фоновых и регламентных заданий, в том числе, запущенных под другим пользователем
- получение в результате запроса уникальных идентификаторов ссылок
- вставка предопределенных значений
- передача результата запроса в параметрами
- генерация текста запроса для создания временной таблицы из таблицы-параметра
- обработка результата запроса кодом
- генерация кода на встроенном языке для исполнения запроса (с параметрами)
- получение текста запроса СУБД, плана запроса, отображение текста и плана запроса в терминах 1С
- работа в составе дополнительных внешних обработок (с некоторыми ограничениями)
- возможность работы в составе расширения
Консоль мечты
Как известно, любой разработчик в среде 1С значительное время проводит в консоли запросов. Все мы работаем с 1С, а одна из основных функций 1С – это извлечение данных из базы. Наверное, каждый из нас хоть раз как-то модифицировал консоль запросов. А консолей этих развелось уже видимо-невидимо.
Сам я пробовал работать во многих консолях запросов. Но вот беда – ни одна из них меня не устраивает. Причины разные. Начиная от мелочей, и заканчивая принципиальными вопросами. Например, есть замечательная консоль, которая устраивает абсолютно всем – но вот беда, она не работает в режиме управляемых форм. Смотрю еще одну, другую… Тоже весьма неплохие, но опять есть какие-то «но»… Например, нет развитых средств обработки кодом, или поддерживаются не все типы, или что-то еще… Ни одна консоль на управляемых формах не сохраняет комментарии в запросе после конструктора...
Последней каплей было то, что я не нашел консолей, которые поддерживают перехват запросов, загрузку временных таблиц и все типы данных в них. Все, что я пробовал, сломались на перехвате отражения документов ERP в регламентированном учете, где используется тип «Тип». И я решил создать свою консоль, которая будет поддерживать все типы 1С, и сможет перехватить совершенно любой запрос для отладки его в консоли. И, конечно же, что бы там было все остальное, что мне не хватало в других консолях.
Предлагаю всем желающим скачать первую версию моей консоли запросов, в которой я постарался реализовать поддержку максимального числа типов. Возможно, кто-то найдет в ней то, чего не хватало в других консолях. Для работы с этой консолью необходима версия платформы не ниже 8.3.12. Режим совместимости возможен, начиная с 8.3.8.
Возможности первой версии
В начале, напишу кратко, что умеет первая версия:
- базовый функционал (редактирование запросов, исполнение, сохранение в файл, работа с параметрами, и т.д.)
- полноценная работа в режиме управляемых форм в режиме толстого и тонкого клиента
- поддержка всех типов 1С, в том числе момента времени, границы, уникального идентификатора, типа «Тип», вида движений, таблиц значений (табличные части), и т.д.
- поддержка списков, массивов, таблиц значений в параметрах, удобное их редактирование
- перехват любых запросов из отладчика вместе с параметрами и временными таблицами
- возможность получения всех результатов запроса («ВыполнитьПакет»)
- просмотр перехваченных временных таблиц, изменение их данных для отладки запроса
- перехват через функцию БСП ЗапросВСтрокуXML
- вывод результата в виде таблицы, дерева, а так же в табличный документ
- работает при запрете синхронных методов (использует только асинхронные методы клиента)
- отладка запросов, получающих большое количество данных: два варианта ограничения количества строк в режиме отладки
- сохранение комментариев в запросах после конструктора
- запоминает последний файл, с которым производилась работа
Как видим, в первой версии есть все базовые возможности, необходимые для работы. Из функций, которых мне не хватает как разработчику в первой версии - это обработка результата запроса кодом. Это будет во второй версии.
Ну а дальше пройдем по всем возможностям немного подробнее.
Базовый функционал, главное окно
Организация основного рабочего пространства основывается на эргономике, как я ее понимаю. Необходимо, что бы все самое главное было под рукой. Основная часть работы – это редактирование запроса и просмотр результата. Поэтому, фактически, экран разделен на две основные части – текст запроса и результат. Причем результату нужно отдавать максимально возможную ширину экрана, ее всегда не хватает. Тексту запроса хватит меньшей ширины, поэтому рядом с ним расположилось вспомогательное окошко с деревом запросов и опциями. Параметры и временные таблицы «живут» в том же окне, что и запрос. В общем, получился классический вид, какой имела самая первая консоль запросов времен 1С 8.0. Границы между окнами, естественно, можно двигать.
Редактирование текста запроса
Тут все стандартно. Обработка текста: добавить/удалить комментарии, добавить/удалить перенос строки. Есть команды вызова конструктора, синтаксического контроля и форматирования. Команда форматирования обрабатывает текст примерно так же, как делает это конструктор запросов. Наверное, многие после ручного редактирования вызывают конструктор без сохранения для контроля синтаксиса, или с сохранением для форматирования. В этой консоли для этого не нужно вызывать конструктор, для этого есть отдельные команды со своими горячими клавишами. Вообще, стоит отметить, что все команды и здесь, и вообще везде во всей консоли запросов имеют горячие клавиши, которые совпадают, по возможности, с общепринятыми.
Стоит отдельно отметить три команды для перехвата запросов из отладчика. Одна из них такая-же, как и в типовой консоли запросов - "Заполнить из XML". Для ее использования нужно в отладчике выполнить функцию БСП ЗапросВСтрокуXML(Запрос), получившийся результат скопировать в поле текста запроса и выполнить команду "Заполнить из XML". При этом в консоль будет перенесен текст запроса, и все параметры запроса. Но временные таблицы перенесены не будут, поэтому лучше пользоваться другим способом, он описан подробно далее, в разделе, посвященном перехвату запросов.
Параметры
На закладке параметров можно увидеть три колонки – имя, тип и значение. Рядом с типом находится иконка, обозначающая тип контейнера – одиночное значение, список, массив, или таблица значений.
Параметры можно загрузить из запроса или добавить вручную. При изменении типа параметра, делается попытка преобразовать один тип в другой, если это возможно. Например, число всегда преобразовывается в строку. Наоборот – если преобразование возможно. Если преобразовать одиночное значение в массив или список, старое значение окажется в этом списке. Большинство значений в параметры вводятся непосредственно, но для некоторых значений открывается форма редактирования. Например, граница, момент времени, уникальный идентификатор.
В первых двух формах понятно все без комментариев. В форме уникального идентификатора можно задать идентификатор непосредственно (строкой), а так же выбором ссылочного значения из базы данных. При выборе значения мы сразу увидим его идентификатор. А если указать идентификатор и нажать кнопку поиска, по нему будет найдено значение. Таким образом, это окошко можно использовать, что бы узнать идентификатор ссылки, а так же наоборот - что бы по уникальному идентификатору найти объект в базе.
Окно выбора типа выглядит так:
Если выбрать тип контейнера «список» или «массив», то невозможно задать некоторые типы, такие как «момент времени» или «граница». Но, если честно, я не могу представить ситуацию, когда необходимо передать в запрос массив моментов или границ. Это одно из немногих ограничений консоли по работе с типами.
Если указать тип контейнера «Таблица значений», то произойдет переключение в режим редактирования структуры таблицы.
После задания структуры таблицы, так же просто можно заполнить содержимое.
Похожим способом способом задается содержимое массивов и списков.
Вывод результатов запроса
На мой взгляд, с результатами запроса при его отладке удобнее всего работать с помощью таблицы или дерева. Но, почему-то, большинство консолей на управляемых формах позволяют выводить результат только в табличный документ. Консоль запросов 9000 делает базовый вывод в таблицу или дерево, и дополнительно есть возможность вывести результат в табличный документ в отдельное окно.
Есть возможность выбрать любой результат в пакетном запросе, а так же сделать ограничение для вывода строк. Присутствуют стандартные возможности - поиск и вывод в список. Результат, выведенный в табличный документ можно сохранить в формате, поддерживаемом 1С для табличного документа (mxl, Excel, Word, pdf, и т.д.).
На ограничении вывода результата стоит остановиться отдельно. Консоль позволяет ограничить вывод двумя различными способами. Первый способ - это установка значения "ПЕРВЫЕ" рядом с кнопкой "Выполнить". В этом случае перед выполнением запроса в него добавиться "ПЕРВЫЕ" во все пакеты, за исключением формирования временных таблиц. Этот способ подходит для отладки очень тяжелых запросов, в которых получение данных занимает значительное время. Можно отладить запрос на небольшом количестве строк, не ожидая каждый раз выполнения запроса над всем массивом данных. С использованием этого варианта ограничения есть небольшой нюанс - при ошибке в запросе курсор может немного не точно позиционироваться в место ошибки. Возможно, удастся это победить в следующих версиях.
Второй способ ограничения строк результата - на скрине выше. В этом случае происходит получение всего набора данных, но ограничивается лишь вывод в таблицу результата. Заданное таким образом ограничение строк и вид результата можно в любой момент изменить, при этом мы сразу увидим изменения в окне результата, но запрос повторно выполняться не будет - будут выведены уже полученные данные.
При клике на ячейку в результате открывается соответствующее значение или его представление. Например, для ссылки справочника или документа откроется соответствующий элемент справочника или документ. В результате запроса поддерживаются даже такие типы, как подзапрос. Их содержимое так же можно просмотреть, кликнув на ячейку. Они открываются, как вложенная таблица значений.
Перехват запросов в отладчике
Перехват запросов осуществляется максимально просто. Для этого выбираем меню для получения кода, и копируем в буфер обмена. Кстати, горячая кнопка для этого меню - Shift+F9. Код для Shift+F9 получаем по Shift+F9 :)
После этого в отладчике, на точке останова выполняем этот код, вызвав "Вычислить выражение" (Shift+F9). У пользователя, под которым делаем перехват запросов, должна быть отключена защита от опасных действий. Не забываем исправить имя переменной, содержащей запрос. И еще один важный момент - перехват нужно осуществить ДО выполнения запроса. В противном случае запрос может создать временные таблицы, и его не удастся сразу выполнить в консоли - будет ошибка при создании временных таблиц с одинаковым именем. Если все же вы совершили такую ошибку, и перехватили запрос после его выполнения, необходимо создаваемые им временные таблицы удалить в консоли вручную. Это можно сделать на закладке "Менеджер временных таблиц", о ней поговорим чуть позже.
Перехват запросов можно сделать сразу несколько раз. К примеру, на скрине выше - отражение в регламентированном учете приобретения товаров и услуг, там выполняются почти подряд четыре запроса. Я сделал четыре точки останова и последовательно перехватил запрос на каждой точке. После этого идем в консоль запросов и вызываем там функцию "Получить перехваченные запросы" (Ctrl+F9). Не имеет значения - запущена консоль в этом же сеансе или другом. Важно, что бы это была та же база и тот же пользователь. При вызове этой функции будут загружены все перехваченные запросы.
После загрузки перехваченных запросов с ними можно работать точно так же, как и с обычными запросами, созданными вручную. Но одно отличие все же есть - для них загружаются временные таблицы, если они были созданы. Временные таблицы находятся на закладке "Менеджер временных таблиц". Можно открывать и просматривать их содержимое, а так же изменять их данные. Можно изменять даже такие экзотические значения, как значения типа "Тип" или момент времени. Загруженные временные таблицы можно удалять, переименовывать или копировать под другим именем. Структуру загруженных временных таблиц изменять нельзя.
Сохранение комментариев после конструктора запросов
Текст запроса - это такой же программный код, как и код встроенного языка. Довольно часто хочется оставить в нем комментарии. Кроме того, комментарии в языке запросов нередко встречаются и в типовых конфигурациях, например ERP. Но вот беда - они полностью теряются, если запрос отредактировать с помощью конструктора. По хорошему, что бы комментарии не терялись, их должен поддерживать конструктор запросов. Но изменить мы его не можем. Поэтому Консоль запросов 9000 пытается сохранить комментарии эвристическими методами. По сути, это напоминает объединение текстов модулей. Просматриваются строки запроса до конструктора и после. При наличии совпадений, комментарии восстанавливаются на тех же местах. Но даже если совпадений нет, комментарии потеряны не будут. Просто они могут оказаться на других местах. Если текст запроса изменится очень сильно - алгоритм поместит такой "потерянный" комментарий в конец текста запроса. При необходимости, сохранение комментариев можно отключить в опциях.
В общем, попробуем такую эвристику и посмотрим, насколько это будет полезно и удобно.
Сохранение и автосохранение
Консоль запросов 9000 придерживается стандартных правил работы с файлом. Например, при выходе она спрашивает, сохранить ли файл, если он был изменен и не сохранен. Такой же вопрос будет задан при нажатии на кнопку "Новый", или при открытии файла.
Существует так же автосохранение. Оно осуществляется с периодом, настраиваемым в опциях, а так же перед выполнением запроса (тоже опционально). Автосохранение происходит в ту же папку, в файл с таким же форматом, что и основной, но с другим расширением. Если в процессе работы происходит сбой, файл автосохранения остается. При открытии основного файла (или автооткрытии в момент запуска) консоль проверяет наличие автосохранения. Если оно найдено - то восстанавливается состояние на момент последнего автосохранения. Данные в консоли будут на момент автосохранения, с признаком модификации, но основной файл запросов при этом изменен не будет. Если нужно вернуться к состоянию основного файла пакета запросов - нужно просто не сохранять данные в консоли после восстановления - например, просто выйти без сохранения. Если же нужно это состояние сохранить, нажимаем "Сохранить" - в общем-то, все просто :)
Насчет автосохранения стоит отметить один момент. Консоль запросов хранит все данные на клиенте, в данных формы. При сохранении эти данные должны сходить на сервер - у платформы много нюансов работы с данными, и я пока не нашел, как всех их обойти. Поэтому, если в пакете много данных (например, во временных таблицах или в таблицах в параметрах запросов), то в момент автосохранения может создавать ощутимое торможение. В таком случае, возможно, стоит его отключить.
Дальше просто приведу окно опций, там все понятно без комментариев.
Заключение
Ну вот, пожалуй и все о Консоли запросов 9000 первой версии. Так сказать, базовая модель. Конечно, многое можно добавить к текущему функционалу. Пробуйте, пишите пожелания в комментариях. Если будут баги - пишите обязательно. Все баги исправлю оперативно. Ну а остальное - по мере возможности.
Из глобальных вещей - обработка кодом. Она обязательно будет во второй версии.
01.03.2020 Продолжение. Версия 1.1.1
Кратко об изменениях
- Добавлена возможность просмотра временных таблиц, формируемых запросом. Ранее можно было просмотреть только перехваченные временные таблицы
- Изменен перехват запросов - теперь есть возможность перехвата фоновых и регламентных заданий, в том числе, запущенных под другим пользователем
- Добавлена возможность получения в результате запроса уникальных идентификаторов ссылок
- Множество небольших исправлений в интерфейсе (добавлены иконки типов, кнопок, и др.)
- Исправлены найденные ошибки
А теперь подробнее.
Просмотр временных таблиц, сформированных запросом.
Тут все просто, привожу только скрин.
Перехват запросов
Перехватывать стало можно запросы любого пользователя, в том числе регламентные и фоновые задания. Правило простое - консоль загрузит все запросы, перехваченные полученной у нее строкой.
Получение уникального идентификатора
На самом деле, добавлен механизм макроколонок, с помощью которого можно получать значения, которые не может возвращать запрос. Сейчас консоль умеет получать таким образом только уникальный идентификатор.
Возникает вопрос - зачем это нужно, если можно получить кодом? Да, когда будет добавлена обработка кодом, в ней можно будет сделать все что угодно. Но часто требуется что-то более простое, и хочется сделать быстро и без заморочек. Что бы сказать - вот для этих колонок хочу УИД, и нажать кнопку.
Как это работает. Вместо обычного выражения, для колонки пишем специальное выражение, похожее на параметр. Такое выражение не мешает обычной работе, можно использовать, например, конструктор. Выражение для получения уникального идентификаторы выглядит так:
&__УИД_КолонкаИсточника
КолонкаИсточника - это уже существующая в результате колонка. Вот пример запроса, который получает уникальный идентификатор для номенклатуры.
Таким образом, можно получить идентификаторы для нескольких колонок. Важно понимать, что обработка таких колонок производится после получения результата. Поэтому, это неприменимо для временных таблиц. И с таким выражением нельзя производить никаких действий - можно только указать как выражение для колонки.
При желании, поддержку макроколонок можно отключить - появилась новая настройка в "Опциях".
Некоторые доработки и исправления ошибок
Значительно переработано окно выбора типа - добавлены иконки, поиск. Устранено не совсем адекватное поведение при смене простого типа на составной, и другие мелочи.
Доработано преобразование массива/списка в таблицу и обратно, а так же редактирование структуры таблицы. Теперь, при преобразованиях не теряются данные (если, конечно позволяют типы колонок). Список попадает в первую колонку созданной таблицы, и наоборот. При редактировании структуры таблицы можно менять имена колонок - данные при этом сохраняются. В общем, данные сохраняются, насколько это возможно.
02.03.2020 Версия 1.1.2
Исправление ошибки. При возникновении ошибки в запросе, использующем временные таблицы, пользователю выдавалось сообщение "временная таблица уже существует".
07.03.2020 Версия 1.1.3
Исправлены выявленные ошибки.
Далее по новым возможностям.
Вставка предопределенного значения
По нажатию Alt+P или кнопки позволяет вставить предопределенное значение, системное перечисление или ссылку на тип.
Передача результата запроса в параметр
Результат запроса можно преобразовать в таблицу значения - параметр.
Запрос для создания временной таблицы из параметра - таблицы значений
Если в качестве параметра используется таблица значений, то в запросе на основе ее создается временная таблица. Можно быстро создать такой подзапрос, нажав на специальную кнопку. Текст созданного подзапроса будет добавлен в конец редактируемого запроса.
31.05.2020 Версия 1.1.5
Исправлены некоторые ошибки.
Добавлена обработка результата кодом.
10.06.2020 Версия 1.1.6
- Исправлены ошибки, проявляющиеся при выполнении в фоне на некоторых версиях БСП.
- Добавлена возможность при обработке кодом обращаться к параметрам запроса. Для этого можно использовать переменную Параметры.
- Сообщения об ошибках выполнения кода в фоне стали более информативными.
16.06.2020 Версия 1.1.7
- Исправлены некоторые ошибки
- Добавлены миллисекунды во время исполнения запроса (изменение от kuzyara)
- Добавлена генерация кода для исполнения запроса на встроенном языке (с параметрами):
27.06.2020 Версия 1.1.8
Изменения в интерфейсе.
Появилось окно со списком результата запроса (временные таблицы и выборки). Можно увидеть сразу все результаты, количество строк, и время выполнения каждого запроса в пакете. Окно открывается по кнопке слева внизу (см. скрин).
Так же появилась возможность отобразить параметры запроса рядом с текстом. Вариант размещения параметров управляется так же кнопкой, она находится вверху справа.
Окно помощи в написание кода обработки.
Содержит структуру записи и параметры.
03.11.2020 Версия 1.1.9
Изменения в версии
- Добавлена возможность получения текста запроса СУБД, плана запроса, отображения текста и плана запроса в терминах 1С (пока только MS SQL)
- Появилась возможность работы в режиме веб-клиента
- Появилась возможность работы в качестве дополнительной внешней обработки (с ограничениями: без перехвата запросов в отладчике и без выполнения кода в фоне)
- В окне редактирования типа отображаются идентификаторы типов, как в конфигураторе
- Исправлены ошибки
Все изменения не требуют пояснений, кроме получения плана запроса.
Получение плана запроса
Для получения плана запроса необходимо включить технологический журнал. Делается это с помощью нажатия на кнопку. При этом файл настроек технологического журнала дополняется новой секцией, специально для консоли. В этой секции применяются очень избирательные фильтры. Логируются только события консоли, да и они не все, а только выполнение запросов в определенной строке кода. Объем дополнительных логов очень мал, так же, как и дополнительная нагрузка на сервер. Поэтому, в большинстве случаев, это можно делать на продуктивной базе. Но, в любом случае, получение планов запросов связано с манипуляциями с настройками технологического журнала, и вы должны понимать, что вы делаете. Это касается любой консоли запросов, не только этой. Настройки технологического журнала восстанавливаются при его выключении, а так же при закрытии консоли.
Итак, включаем технологический журнал, нажимая на кнопку "ТЖ".
Кнопка окажется в нажатом состоянии, но реально настройки вступают в силу не сразу, это может занять до одной минуты. Когда настройки заработают, кнопка подсветится красным цветом.
После этого можно выполнять запросы, смотреть тексты запросов, отправляемых в СУБД, а так же планы их выполнения. Эту информацию можно получить, нажав гиперссылку "План".
... или нажав на информацию о выполнении подзапроса в списке результатов.
В окне плана запроса можно увидеть сам план запроса в виде дерева, а так же текст запроса к СУБД. Текст запроса к СУБД предоставляется в двух вариантах: в оригинальном виде, и в терминах 1С. Так же можно увидеть фрагмент технологического журнала с исходными данными (на скрине свернут).
Многие предпочитают анализировать план запроса не в виде дерева, а в обычном текстовом виде. Для этого можно использовать соответствующие закладки, где будет такой план запросов в удобном форматировании.
Выключение технологического журнала консоли происходит в обратном порядке. Кнопка "отжимается", а через некоторое время гаснет. Подсветка кнопки выключается, когда реально выключается технологический журнал консоли.
09.01.2021 Версия 1.1.10
Изменения в версии
- Добавлена возможность работы в составе расширения. Функциональность точно такая же, как и у внешней обработки.
- Добавлено получение плана запроса Postgres, только в текстовом виде. Вообще, я сомневаюсь в полезности планов запросов в виде дерева в 1С. По моим наблюдениям используют либо текстовый вид, либо графическое представление в MS SQL.
- Добавлена поддержка момента времени во временных таблицах перехваченных запросов.
- Исправлены ошибки.