Униформальная консоль запросов

Программирование - Инструментарий

73
Минималистичная и функциональная консоль запросов, которая выглядит и работает одинаково, как в обычных формах, так и в управляемых.

Обработка протестирована на следующих версиях платформы: 8.3.7, 8.3.11

Долгое время сомневался, стоит ли выкладывать очередную консоль запросов на Инфостарте, но теперь решился. Понравится тем, кто ценит простоту и функциональность. Консоль успешно эксплуатируется более 2х лет командой из примерно 5 человек, поэтому багов там минимум (если найдете, пишите, исправлю).

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

 

Интерфейс:

1. Дерево запросов. Здесь все просто, управляем структурой запросов в виде дерева как и раньше. Основная доработка — качественный Drag&Drop мышкой элементов дерева, с учетом вложенных элементов. Ещё добавлена информация о количестве строк в текущем запросе в шапку дерева запросов.

2. Текст запроса. Отличий нет, но здесь переработана функция получения кода с запросом в части установки параметров.

3. Панель информации. Здесь выводится количество строк в результате выполнения запроса и время выполнения (время выполнения также дублируется в заголовке формы). Убрано поле переключения на просмотр результата запроса в виде дерева (почти бесполезная функция, которая захламляет форму обработки). Также здесь расположена кнопка, вызывающая конструктор запроса, чтобы не лазить каждый раз в контекстное меню для вызова конструктора. Горячая клавиша для её вызова Ctrl+D, такое сочетание не назначено на что-то критичное в 1с и его легко нажать.

4.Таблица результата. Как и раньше результат запроса выгружается в таблицу значений (в управляемых формах тоже), что по моему мнению гораздо удобнее выгрузки в табличный документ, который реализован в некоторых консолях запросов. При таком способе выгрузки результат легко отсортировать по нужному полю, а при необходимости можно выгрузить в тот же табличный документ. Главный плюс выгрузки в таблицу в скорости работы, отличия заметны когда результат запроса содержит много строк, при этом выгрузка в табличный документ начинает сильно тормозить. В контекстное меню добавлена новая функция выполнения произвольного кода. Вообще мне не нравится идея комбайнов, которые могут делать всё, но не очень хорошо, и здесь напрашивается отдельная обработка для выполнения алгоритмов над выбранными объектами, но на практике бывает так, что результат выполнения сложного запроса надо обработать по-быстрому без лишних телодвижений (например распровести все выбранные документы), в таком случае простая обработка в консоли может пригодиться. В целях повышения удобства просмотра данных типа хранилище значения, в представлении значения такого типа в скобках отображается содержимое хранилища, и при нажатии на значение такого типа открывается соответствующая форма просмотра значения. Аналогично для таблиц значений в представлении отображается количество строк в таблице и при нажатии на значение открывается форма просмотра таблицы.

 

5. Панель команд. Изменен порядок кнопок и удалены лишние на мой взгляд команды. На все кнопки назначены горячие клавиши, при этом запрос можно выполнить как нажатием на F5 (как в MSSQL Management Studio), так и нажатием сочетания Ctrl+Enter, которое вызывает последний способ выполнения запроса (выполнение, выполнение пакета или просмотр временных таблиц). Добавлены кнопки копирования в буфер/вставки из буфера обмена, при этом сериализуется текст запроса со всеми параметрами запроса, включая таблицы, что бывает удобно для копирования отдельных запросов с большим количеством параметров. Также можно добавить простую функцию сериализации запроса в буфер в общий модуль любой конфигурации, тогда запрос можно будет копировать при отладке.

Функция ЗапросВКонсоль(пЗапрос) Экспорт;
   рез = Новый Структура;
   рез.Вставить("Текст",пЗапрос.Текст);
   рез.Вставить("Параметры",пЗапрос.Параметры);
   строкаРез = ЗначениеВСтрокуВнутр(рез);
   Попытка
      Объект = Новый COMОбъект("htmlfile");
      Объект.ParentWindow.ClipboardData.Setdata("Text", строкаРез);
   Исключение
      Возврат Ложь;
   КонецПопытки;
   Возврат Истина;
КонецФункции

6. Форма параметров запроса. Как и в исходной консоли выполнена в виде отдельной открывающейся формы без модальности. Для каждого параметра можно указать один из 3х вариантов: 1) Значение — обычное значение любого типа. 2) Список — список значений содержащий элементы любого типа, при этом если параметры заполнены кнопкой «Получить из запроса», то в целях удобства значения ограничены типом параметра, если это не составной тип. 3) ТаблицаЗначений — таблица значений, редактирование которой осуществляется в отдельной форме. Форма сделана максимально простой, сверху указываются имена колонок и их тип, снизу задается значение строк. Во всей консоли в представление таблицы выводится количество строк, чтоб бывает удобно для быстрой оценки размера таблицы.

Кнопка «Получить из запроса» - работает как и типовой консоли, но сделаны некоторые изменения. Улучшена работа с параметрами типа список значений, раньше такой параметр очищался от списка объектов при перезаполнении. Для отсутствующих в запросе параметров пользователю задается вопрос об удалении таких параметров из таблицы. Перед закрытием формы параметров происходит проверка на наличие дублирующихся по имени параметров и выдается предупреждение, если такие есть.

7. Форма настройки. Настройки «Использовать автосохранение» и «Использовать только выделенную область текста запроса» работают как в консоли Чистова. Добавлена настройка «Использовать бэкап запросов перед выполнением», которая перед каждым выполнением запроса сохраняет редактируемый файл запросов во временный файл и если запрос так и не завершился, то после открытия консоли все изменения будут восстановлены из файла. Такая функция должна решать проблему потери текста большого запроса из-за падения программы во время выполнения запроса (например по причине ошибочного соединения больших таблиц без условий). Теоретически функция автосохранения запроса может помочь с этой проблемой, но есть нюансы: если интервал автосохранения достаточно большой и обработчик не успел сработать после изменения текста запроса, то изменения потеряются, бэкап запроса в этом случае гарантирует сохранение перед выполнением. Еще один нюанс - автосохранение работает только для существующих файлов запросов, к которым указан путь, бэкап же может работать и с несохраненными файлами.

Внутренние улучшения/адаптация под УФ:

- проработана совместимость формата хранения файлов .sel с консолью запросов ИР

- для тонкого клиента в целях ускорения добавлена архивация перед пересылкой на сервер(опция вынесена в настройки)

Контакты

Адрес проекта на GitHub: github.com/Synoecium/Uniform-query-console-1C

UPD 28.05.2018

- для толстого клиента вызывается классический конструктор запросов (работает даже если отключена модальность), для тонкого и веб клиента конструктор запросов не изменился

UPD 15.06.2018

- реализовано отображение результата выполнения запроса в виде дерева ОФ/УФ. Вариант вывода в дерево или таблицу определяется автоматически, по наличию итогов в выполняемом запросе. Проработаны команды контекстного меню для разворачивания/сворачивания дерева до произвольного уровня. Работает выполнение произвольного кода, дерево при этом обходится полностью по иерархии.

- исправлен баг на УФ при выделении пустой строки нового запроса

- исправлен баг с автосохранением нового и незаписанного файла(бесконечно возникал диалог сохранения) 

- проект выложен на GitHub

73

Скачать файлы

Наименование Файл Версия Размер
Униформальная консоль запросов:
.epf 94,97Kb
22.05.18
138
.epf 1.2.2 94,97Kb 138 Скачать

См. также

Комментарии
Сортировка: Древо
1. uri1978 122 23.05.18 14:02 Сейчас в теме
Убрано поле переключения на просмотр результата запроса в виде дерева (почти бесполезная функция, которая захламляет форму обработки)

Жаль.
kadild; Кадош; pereligins; Nuobu; Tavalik; chumavik; корум; gubanoff; ahachak; Mi4man; fancy; baton_pk; medvedev8; Dream_kz; serwk; +15 Ответить
3. Synoecium 383 23.05.18 20:51 Сейчас в теме
(1) в принципе можно сделать отключаемой опцией в настройках и добавить такой функционал, у нас тоже есть человек, который
пользуются деревьями в результате запроса и он пояснил в каких ситуациях они полезны (например когда хочешь видеть итоги по группе и разворачивать нужные ветви для детализации в одном месте). Если бы я придумал как расположить такой функционал на форме не занимая лишнего места, то сделал бы в исходном варианте.
6. Dream_kz 77 24.05.18 07:50 Сейчас в теме
10. Mi11er 75 24.05.18 10:57 Сейчас в теме
(3) да, дерево нужная штука.

Итоги то строить =) и смотреть группы.
26. Synoecium 383 15.06.18 15:14 Сейчас в теме
(1) Реализовал данную функцию. Сам попробовал, довольно удобно для просмотра итогов :)
28. uri1978 122 15.06.18 16:04 Сейчас в теме
1. Результаты могут выводится в виде дерева. Спасибо. Теперь не хватает переключателя. Сейчас я так понимаю определяет автоматически. А хотелось бы указывать самому.
2. "Просмотр временных таблиц". Если выбран этот режим, то просматривать временные таблицы можно, но результата запроса нет. Часто нужно видеть итоговый результат запроса + возможность просмотреть временные таблицы. В типовой обработке если честно удобнее.
3. "Просмотр временных таблиц". Если несколько временных таблиц, то просмотреть можно только первую таблицу, остальные пустые.
4. "Просмотр временных таблиц". Нельзя открыть несколько временных таблиц одновременно.
5. "Выполнить пакет", вообще не понял как работает. Две таблицы значений "ТаблицаЗначений(1)" при открытии которой одна запись в таблице "Количество" = 5759. Вторая таблица "ТаблицаЗначений(28926)", при открытии пустая таблица с колонкой "Количество". В общем вообще не понял что происходит.
6. Из эстетических - кнопку "Настройки" поставьте последней, а не первой.

Экспериментировал на простейшем запросе (УТ, обычные формы), без какого либо смысла, просто просмотреть как работает.
Запрос


Остаюсь на стандартной консоли. Просьба хотя бы чуть-чуть тестировать обработки перед публикацией.
kadild; purgin; +2 Ответить
29. Synoecium 383 15.06.18 16:39 Сейчас в теме
(28) просьба - читать описание публикации перед использованием. Там ясно указано, что используется логика из консоли Чистова, которая тщательно перенесена в УФ.
30. uri1978 122 15.06.18 17:03 Сейчас в теме
(29) Ок. Понял. Но увы заявленный функционал совсем на работает. Прошу вернуть уплаченный $m
2. serwk 32 23.05.18 14:25 Сейчас в теме
Добрый день! Пару вопросов:
1 Конструктор запроса открывается для конфигураций с режимом использования модальности - Не использовать. Например, ЗУП 3.1.6.37;
2 В управляемом приложении открывается полноценный конструктор запроса. В нем связи настраиваются на отдельной закладке?
Прикрепленные файлы:
16. Synoecium 383 25.05.18 10:59 Сейчас в теме
(2) спасибо за наводку, в ближайшее время сделаю доработку, чтобы при возможности открывался классический конструктор запросов, новый мне тоже очень не нравится, особенно то, что сделали со связями.
4. rpgshnik 834 24.05.18 03:59 Сейчас в теме
Да этот вид консоли более удачный не желе другие. Я чувствую вы зря сомневались в выкладывание и это будет бомба!)))
12. Synoecium 383 24.05.18 21:36 Сейчас в теме
(4)
(11)
Спасибо за поддержку)
Если можно, пишите пожалуйста, что понравилось, а что нет. Тогда будет понятно, какая фишка действительно удачная и стоит её развивать, а чего возможно не хватает. Главное чтобы предложения соответствовали подходу функционального минимализма, к которому я стремился во время создания обработки.
19. serwk 32 25.05.18 14:40 Сейчас в теме
(12) Добавьте, пожалуйста, вывод результата запроса в виде дерева :)
7. Mi11er 75 24.05.18 10:20 Сейчас в теме
Удобнее консоли, чем в ИР, я чет не видел ...
kuzyara; CSiER; ABudnikov; JohnConnor; Неопределено; uri1978; +6 Ответить
8. Synoecium 383 24.05.18 10:23 Сейчас в теме
(7) попробуйте, вдруг понравится. Раньше пользовался в том числе ИР консолью.
11. Tanis 24.05.18 20:45 Сейчас в теме
Огромное спасибо! Очень нужная вещь.

Пытался найти несколько раз....
13. TrinitronOTV 25.05.18 05:36 Сейчас в теме
Спасибо, попробую вашу консоль, может по душе придётся
14. user741393 25.05.18 10:07 Сейчас в теме
Добрый день, а как сделать что бы закладка связи отображалась, как на скриншоте у Сергей Бондаренко
15. Synoecium 383 25.05.18 10:47 Сейчас в теме
(14) актуальный вопрос, он меня как раз натолкнул на небольшое исследование, оказывается можно открывать классический конструктор в управляемых формах(но только в толстом клиенте). Как закончу доработку - выложу. Пока можете использовать следующий код в обработчике команды вызова конструктора:
	#Если ТолстыйКлиентУправляемоеПриложение  Тогда
		Если Не ЗначениеЗаполнено(ТекстЗапроса) Тогда 
			Конструктор = Новый КонструкторЗапроса(); 
		Иначе 
			Конструктор = Новый КонструкторЗапроса(ТекстЗапроса); 
		КонецЕсли;
		рез = Конструктор.ОткрытьМодально();
		Если рез = Истина Тогда
			ТекстЗапроса = Конструктор.Текст;
			Модифицированность = Истина;			
		КонецЕсли;
	#Иначе
		Если Не ЗначениеЗаполнено(ТекстЗапроса) Тогда 
			Конструктор = Новый КонструкторЗапроса(); 
		Иначе 
			Конструктор = Новый КонструкторЗапроса(ТекстЗапроса); 
		КонецЕсли;
		ОповещениеОЗакрытии = Новый ОписаниеОповещения("ВыполнитьПослеЗакрытияКонструктора", ЭтаФорма);
		Конструктор.Показать(ОповещениеОЗакрытии);	
	#КонецЕсли
Показать
17. user741393 25.05.18 11:29 Сейчас в теме
(15) Сделал так не работает

Процедура КнопкаКонструкторЗапросаНажатие(Элемент)
     ТекстЗапроса = ЭлементыФормы.ТекстЗапроса.ПолучитьТекст();
	Если ТолстыйКлиентУправляемоеПриложение  Тогда
        Если Не ЗначениеЗаполнено(ТекстЗапроса) Тогда 
            Конструктор = Новый КонструкторЗапроса(); 
        Иначе 
            Конструктор = Новый КонструкторЗапроса(ТекстЗапроса); 
        КонецЕсли;
        рез = Конструктор.ОткрытьМодально();
        Если рез = Истина Тогда
            ТекстЗапроса = Конструктор.Текст;
            Модифицированность = Истина;            
        КонецЕсли;
    Иначе
        Если Не ЗначениеЗаполнено(ТекстЗапроса) Тогда 
            Конструктор = Новый КонструкторЗапроса(); 
        Иначе 
            Конструктор = Новый КонструкторЗапроса(ТекстЗапроса); 
        КонецЕсли;
        ОповещениеОЗакрытии = Новый ОписаниеОповещения("ВыполнитьПослеЗакрытияКонструктора", ЭтаФорма);
        Конструктор.Показать(ОповещениеОЗакрытии);    
    КонецЕсли
	
КонецПроцедуры
Показать
18. Synoecium 383 25.05.18 11:31 Сейчас в теме
(17) что пишет? проверьте что значок # скопировался в коде
20. XXIVek 23 30.05.18 10:17 Сейчас в теме
Спасибо. Было лень переделывать самому, а на управляемых страдал.
21. TODD22 17 09.06.18 08:35 Сейчас в теме
Как просматривать содержимое временных таблиц?
В консоли для ОФ у меня есть кнопка по которой выводится список временных таблиц, можно выбрать любую и просмотреть содержимое.

В этой консоли нажимаю на временные таблицы, внизу выводится результат две временные таблицы. Как посмотреть их содержимое?

И вот сильно режет глаза и слух слово "униформальная", как то не по "русски" звучит может конечно есть такое слово но я значение такого слова не нашёл.
22. Synoecium 383 09.06.18 08:46 Сейчас в теме
(21) двойным кликом по ячейке колонки "РезультатЗапроса", там где написано "ТаблицаЗначений(N)"
Униформальный - такого слова нет, я его сам придумал.
23. TODD22 17 09.06.18 08:49 Сейчас в теме
(22)По двойному клику открывает новое окно, в котором так же одна строка "ТаблицаЗначений(4)", если и по ней кликаю то открывается окно с кнопкой окей и цифрой 4. Таблица не расшифровывается.
25. Synoecium 383 09.06.18 08:52 Сейчас в теме
(23) давайте разберемся в вашей проблеме, пишите в личку
24. TODD22 17 09.06.18 08:51 Сейчас в теме
По двойному клику расшифровывает только последнюю таблицу значений.
ВТ не расшифровывает, может я конечно что то не так жму.
27. Synoecium 383 15.06.18 15:19 Сейчас в теме
TODD22: Спасибо за помощь в борьбе с багами, исправил в новой версии.
31. leobrn 102 27.07.18 10:42 Сейчас в теме
конструктор запроса открывается стандартный? или где связи неудобно сделаны?
32. Synoecium 383 27.07.18 12:31 Сейчас в теме
(31) если есть возможность, запускается классический конструктор (для этого должен быть запущен толстый клиент)
33. WalterMort 279 27.07.18 13:56 Сейчас в теме
А если в результате 100000 строк, будет работать?
34. Synoecium 383 27.07.18 14:41 Сейчас в теме
(33) легко, такой запрос "ВЫБРАТЬ ПЕРВЫЕ 100000 * ИЗ РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный" выполнился за секунду с небольшим (миллион уже подольше, около 15 сек, из них 6 сек ушло на выгрузку в таблицу на форме)
35. nomadon 286 28.07.18 09:15 Сейчас в теме
Примерно 5 разработчиков это как?) Кто-то полупрозрачный, или не полноценный?
38. Synoecium 383 31.07.18 11:18 Сейчас в теме
(35) написал так, потому что некоторые не работали полностью 2 года, некоторые не сразу стали использовать эту консоль. Условно 10 человеко-лет использования тогда :)
36. V_V_V 31.07.18 09:49 Сейчас в теме
Обработка результата запроса возможна?
37. Synoecium 383 31.07.18 11:16 Сейчас в теме
(36) да, но на примитивном уровне, вызывается окно, куда можно вписать произвольный код, выполняемый для каждой строки результата запроса. В п. 4 кратко описана эта функция.
39. vowg 61 01.08.18 09:42 Сейчас в теме
Спасибо, давно такую искал
Оставьте свое сообщение