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





Вот уже много лет я использую замечательный инструмент для работы с запросами — Запросник. Однако, с переходом на управляемые формы для его использования пришлось запускать базы в устаревшем толстом клиенте, да еще и разрешать в свойствах конфигурации использование обычных форм. В 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 не будет опубликован. Обязательные поля помечены *