Консоль запросов "Запросник" для управляемых форм с подсветкой синтаксиса





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

С самого начала киллерфича — подсветка синтаксиса запроса с помощью текстового редактора CodeMirror, написанного на javascript. Редактирование запроса происходит в поле html документа, что создает некоторые трудности и ограничения, но об этом позже. На данный момент используется самый ненагруженный функционалом вариант текстового редактора, просто корректная подсветка ключевых слов и выделением текущей строки, однако возможности для развития огромные.

В планах на развитие

— Автодополнение ключевых слов

— Подсветка объектов метаданных и реквизитов

— Подсказка параметров виртуальных виртуальных таблиц

— Позиционирование на первую строку с ошибкой, подсветка строк с ошибками

— Сворачивание запросов в пакете


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

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

— Добавлено поле поиска запроса по наименованию. 

— Расположение основных кнопок приведено к более привычному виду, похожему на оригинальный запросник, с его шикарной эргономикой. Увы, полностью повторить пока невозможно,  но мысли как улучшить эргономику есть

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


Теперь о плохом. Наш мир далек от идеала, в процессе работы пришлось преодолеть множество трудностей и некоторые только с помощью костылей

— Самая главная проблема — неполноценность поля html документа как браузера, в частности оно не позволяет нормально обрабатывать нажатия некоторых клавиш, таких как кнопки со стрелками, home, end, insert. Решить ее удалось с помощью внешней компоненты, перехватывающей нажатия кнопок на клавиатуре и отдающей их напрямую скриптам. Большой костыль, но если в 1С однажды появится браузер на базе webkit (как в линукс клиенте, ага) этот костыль будет не нужен

— Еще одна проблема — странное поведение мыши при выделении текста в старых релизах. Мы ставим курсор, тянем мышь и замечаем что выделена только первая буква. Начиная с релиза 8.3.5.1385 этой проблемы не существует

— Третья серьезная проблема, привязка к версии браузера системы. Если у вас WinXP и браузер ни разу не обновлялся, то скорее всего зрелище будет печальным. Минимальная версия IE в системе при которой все должно корректно работать — IE8.

Уверен, что есть еще несколько проблем, оставшихся мной незамеченными, также я не тестировал разработку в веб-клиенте , линукс-клиенте и релизах версии 8.2. Надеюсь на обратную связь в комментариях.


В данной разработке использованы:

Запросник

Запросник на управляемых формах

CodeMirror

ВК для перехвата клавиатуры


Версия 2.1.2

— Поддержка долгово нажатия клавиш со стрелками на современных релизах (8.3.5.1385 и новее)

— Отображение номеров строк 

— Подчеркивание слов, совпадающих с тем, на котором установлен курсор

— Пофиксен баг с удалением корня дерева запросов

— Пофиксен баг, приводящий к зацикливанию при переключении между колонками результата запроса


Версия 2.1.3

— Отрезана поддержка обычного приложения и целая гора легаси кода, связанного с ней

— Разбор запроса по временным таблицам с помощью схемы запроса, а не сомнительного анализа текста, часто дающего сбой

— Автодополнение ключевых слов по Ctrl+Пробел 

  

ВНИМАНИЕ! Из за особенностей поля html документа не получилось сделать подтверждение выбранного варианта по нажатию на Enter. Нажатие на Enter переводит курсор на следующую строку и обойти этот момент без совсем феерических костылей мне пока не удалось. Для выбора в всплывающем списке следует использовать стрелку вправо или мышь. Это непривычно только первую сотню раз (Больше неактуально, исправлено в версиии 2.1.4)

— Подсветка групп метаданных (Справочник, Документ, Регистр…) полужирным шрифтом, автодополнение их по Ctrl+Пробел

— Мгновенное обновление результата при переключении способа отображения таблица/дерево (Раньше надо было заново выполнить запрос)

— Исправлена ошибка с таблицей значений в параметрах для тонкого клиента

— Исправлена ошибка с выполнением алгоритма при пустом результате


Версия 2.1.4

— Доработана внешняя компонента для перехвата клавиатуры в результате чего удалось добиться правильного поведения клавиши энтер в контекстной подсказке и более корректного поведения курсора при переходе на новую строку

42 Comments

  1. Yashazz

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

    Reply
  2. Darklight
    Reply
  3. 1С_Мастер
    Reply
  4. Darklight
    Reply
  5. 1С_Мастер

    (4) Darklight, Не буду отвечать на каждый пункт, предложения по большей части вкусные и частично уже находятся в todo листе. Отвечу только на то, что сам первоначально принял за баг взятой за основу разработки

    12. В форме настройки параметров не работает задание списка параметров (не сохраняется настроенный в форме список в значении параметра)!!!

    На самом деле все работает, но кнопка «Сохранить» не помещается на форме редактирования списка значений, надо растянуть форму пошире и кнопка появится.

    Такое случается в такси на формах изначально сделанных под старые УФ. Конечно, логичнее было бы, сохраняйся список при закрытии, доберусь и до этого

    Reply
  6. Darklight

    Ещё десяток багов и замечаний :))))

    21. Криво работает поиск в тексте запроса. При поиске вниз ищет только самое первое вхождение. Причём всегда сверху. Поиск ищет перебирая слова снизу вверх как и положено, но тоже не умеет определять текущую позицию начала поиска. Странно работает поиск по выделенному фрагменту. Вроде как ищет. Но даже при поиске назад сбивается. Выделение при этом тоже может сбиться. Если в выделенном блоке нет искомой подстроки поиск идёт далее по коду.

    22. Есть проблема и с обратным поиском (к текущему направлению) по комбинации Shift+F3

    23. Поиск с учетом регистра регистр не учитывает (но вроде это только при поиске назад).

    24. Кнопки команд поиска не вынесены ни на форму ни в подменю. Работают только горячит клавиши Ctrl+F, F3, Shift+F3 (ещё какие-то, какие я не знаю?)

    25. Нет «Поиска и замены» (вообще нет, даже Ctrl+H, Ctrl+R не помогает)

    26. Горячие комбинации не показаны в меню и подсказках к кнопкам

    27. Нет номеров строк по вертикали (нигде нельзя посмотреть даже текущую позицию курсора)

    28. Нет команды перехода к строке №

    29. Я бы выполнение запроса поставил бы на клавишу F5 — привычнее для 1С. А на клавишу F7 вызов конструктора запроса. А аа F10 переход к выполнению алгоритма

    30. В некоторых окнах (например окне работы с типами или списками) нет кнопки «Закрыть»/»Применить»/»ВЫБРАТЬ»/»ОК» — не хватает для удобного восприятия/использования. (а лучше бы пара кнопок включая «ОТМЕНА»).

    Reply
  7. Darklight
    На самом деле все работает, но кнопка «Сохранить» не помещается на форме редактирования списка значений, надо растянуть форму пошире и кнопка появится.

    Да, не заметил. Как и большинство, скорее всего не заметит сразу. Может перенести эту ОЧЕНЬ важную кнопку левее! И вообще перейти на кнопки с иконками, вместо текста.

    Или можно просто у формы «СписокЗначенийУпр» увеличить ширину в конфигураторе с 50 до 60. И сделать кнопку «Сохранить» кнопкой по умолчанию (соотв. флагом) — будет работать по Ctrl+Enter

    Пункты 11 и 13 это баги — нужно исправлять 😉

    Reply
  8. cleaner_it

    (6) Darklight, в 29 пункте F7 — это стандартный запуск исполнения запроса в консоли. Изменять на F5 не нужно

    Reply
  9. Darklight
    Reply
  10. 1С_Мастер

    Мда, легаси код кроме плюсов того, что его не надо писать имеет свои недостатки.

    Я планирую переделать работу с анализом временных таблиц на СхемуЗапроса, баг уйдет. При этом, правда, отвалится поддержка релизов, старше чем 8.3.5, но не думаю что на них сидит так уж много народа.

    Второй баг «исправлен в тестовой версии»

    Reply
  11. Darklight

    (10) в предыдущем комментарии я добавил ещё одну важную ошибку (после Вашего ответа на него)

    Reply
  12. Darklight

    Использование объекта «СхемаЗапроса» это, конечно, хорошо, но… уж больно он кривой. ОЧЕНЬ КРИВОЙ и чувствительный к изменениям структуры запроса (особенно при работе с временными таблицами). Хотя в режиме «Только чтение» работает хорошо! Но его API очень сырой и неудобный!

    Reply
  13. Darklight

    38. Нашёл внтури вот такую функцию АлгоритмВыполняетсяНаСервере()

    ну и процедуру ВыполнитьАлгоритм(Команда)

    Это что за фигня такая там написана?

    То есть, если алгоритм не выполняется в транзакции и весь находится внутри цикла («Для Каждого СтрокаРезультата Из РезультатТаблица Цикл»), то он выполняется построчным перебором на клиенте с серверным вызовом на каждую обрабатываемую строку. НА КАЖДУЮ! А если их будет миллион…. будет миллион серверных вызовов!

    Это просто кошмар! И жуткое падение производительности.

    Я уж промолчу про возможность распараллеливания на фоновых процессах….

    Нужно просто сделать переключатель, говорящий где нужно обрабатывать алгоритм: на сервере или на клиенте.

    Ну у расппаралелливание тоже не помешало бы (как один из вариантов серверной обработки алгоритма)

    Reply
  14. 1С_Мастер
    Нашёл внтури вот такую функцию АлгоритмВыполняетсяНаСервере()

    ну и процедуру ВыполнитьАлгоритм(Команда)

    Это что за фигня такая там написана?

    Проклятый легаси код. Есть планы все эти конюшни вычистить, но прикручивать новые фичи к текстовому редактору интереснее.

    Ну у расппаралелливание тоже не помешало бы (как один из вариантов серверной обработки алгоритма)

    Таки да, это запланировано, наравне с фоновым выполнением самих запросов

    Reply
  15. 1С_Мастер

    (6)

    36. Ещё одна серьёзная ошибка — возникает при изменении (существующего) параметра типа «ГраницаЗначений» …

    Хотелось бы уточнить в виду имелась Граница или Таблица Значений. Если таблица значений, то этот баг я только что пофиксил в тестовой версии, он был связан с недоступностью ТЗ в тонком клиенте, а если Граница, то повторить его мне не удалось.

    Reply
  16. kddvad1m

    Есть ли возможность выгрузить результат запроса в файл?

    Reply
  17. YuraMatasov

    Можете пожалуйста скинуть на: j21r01a91@mail.ru

    Reply
  18. YuraMatasov

    Можете пожалуйста скинуть на: j21r01a91 (собака)майл.ру

    Reply
  19. murenysh

    в обработке отсутствует Модуль объекта и Модуль менеджера. Соответственно нет обещанной функции отладки Дамп

    ВнешниеОбработки.Создать(«d:zapr.epf»,Ложь).Дамп(Запрос)

    Reply
  20. viplelik

    Можете поделиться Вашей разработкой (в личку)? К сожалению еще не набрал 1$m

    Спасибо.

    Reply
  21. viplelik

    А можете сделать подсветку синтаксиса в «Выполнить алгоритм» как у Тезина?

    и довести функционал до его последней версии?

    Reply
  22. 1С_Мастер

    (21) viplelik, Дайте ссылку на публикацию, посмотрю что возможно

    Reply
  23. viplelik

    http://infostart.ru/public/72969/ tezin Тезин (tezin)

    Сайт Запросника: https://sites.google.com/site/vtezin/zaprosnik-1s

    Основа — консоль запросов ИТС

    Reply
  24. 1С_Мастер

    (23) viplelik, Понял о чем вы. Цели полностью повторить функционал оригиального запросника на управляемых формах я себе не ставил. Целью было именно реализовать подсветку синтаксиса для управляемых форм. Прикрутить недостающие фишки, конечно, можно но, отнимет слишком много свободного времени, столько энтузиазма у меня нет. Да и взял за основу я далеко не лучшую консоль для управляемых форм. По хорошему стоит начать разработку с нуля, а не бороться с наследственными болезнями, но тут снова проблема мотивации. С подсветкой синтаксиса в поле для выполнения кода та же проблема

    Reply
  25. ybatiaev

    Вошёл. Нажал СКАЧАТЬ за стартмани. С меня списалось $m и нет ничего. ((((

    HELP!

    Reply
  26. starik-2005

    (25)

    HELP!

    На почту письмо пришло со ссылкой на скачивание?

    Reply
  27. ybatiaev

    (26) Вот только что… скачал. Просто привык к нормальному, что приходит в течении 2-3 минут. Извините!

    Если удастся удалить эти файлы, чтобы других не смущать, удалите плиз!

    Reply
  28. karpik666

    Идея хорошая, но перехватчик клавиатуры работает ужасно, передвижение курсора по стрелочке работает через раз, либо курсор может перескакивать через слова, нажатие ctrl+пробел может сработать, а может передвинуть курсор на символ вправо, а затем обработка может вообще на некоторое время зависнуть, очень жаль, что нужно теперь самому копаться в коде.

    Reply
  29. KandKonst

    Запросник2_1_4

    В верхнем окне где должно быть поле ввода запроса ошибка:

    Не удается отобразить эту страницу

    {ВнешняяОбработка.КонсольЗапросовИОбработчик.Форма.ФормаУпр.Форма(167)}: Метод объекта не обнаружен (GetQuery)

    ТекстЗапроса.УстановитьТекст(ОкноБраузера().GetQuery(«»));

    Что не так?

    Reply
  30. KandKonst

    (29) проблема устранилась ручной чисткой папки temp. Видимо проблема в некорректном завершении работы 1с.

    Reply
  31. DC

    Не хочет регистрировать компоненту…

    {Обработка.КонсольЗапросовИОбработчик.Форма.ФормаУпр.Форма(42)}: Тип не определен (AddIn.Hook.KeyboardHook)

    мКомпонентаKeyBoardHook = Новый(«AddIn.Hook.KeyboardHook»);

    Reply
  32. DC

    (31) Платформа 8.3.10.2667

    Reply
  33. lepth

    (31)

    Не хочет регистрировать компоненту…

    Такая же беда

    Reply
  34. shurkav

    Так же «Тип не определен» (платформа 8.3.11, если важно)

    Reply
  35. Demitry

    Что делать с ошибкой Тип не определен (AddIn.Hook.KeyboardHook)?

    Reply
  36. 1С_Мастер
    Тип не определен (AddIn.Hook.KeyboardHook)

    Подозреваю, что у вас x64 клиент

    Компонента писалась во времена, когда его не существовало. Попробуйте клиент х32

    Reply
  37. Demitry

    (36)

    На клиенте х32 та же ошибка.

    Reply
  38. Demitry

    (36)

    Что еще может быть? Такая ошибка не только у меня.

    Reply
  39. Demitry

    Итого, пробовали на разных ПК, на разных системах, пытались вручную зарегистрировать компоненту — результата не достигли. Закомментировали процедуру по подключению внешней компоненты, удалось запустить обработку, однако работать с ней невозможно по следующим причинам:

    1. Не работают горячие клавиши от слова «Совсем».

    2. Не работают стрелки перемещения по тексту.

    3. При нажатии на enter курсор устанавливается в начало строки всегда.

    Полагаю, за все эти функции как раз и отвечает внешняя компонента.

    Пока проблема с компонентой не будет устранена — пользоваться невозможно.

    Пробовали на платформах 8.3.11 и 8.3.12.

    Reply
  40. InWith

    (35) тоже самое

    Reply
  41. JohnConnor

    (35)попытка-исключение

    Reply
  42. p.ugrumov

    Не работает.

    1С:Предприятие 8.3 (8.3.12.1714)

    {ВнешняяОбработка.КонсольЗапросовИОбработчик.Форма.ФормаУпр.Форма(43)}: Тип не определен (AddIn.Hook.KeyboardHook)

    мКомпонентаKeyBoardHook = Новый(«AddIn.Hook.KeyboardHook»);

    И 1с зависает и больше не реагирует.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *