8.3 — контекстная подсказка по параметрам процедуры или функции

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

Давайте скорей разбираться в том, как это работает.

В момент редактирования процедуры или функции в редакторе текстов модулей отображается всплывающая подсказка, как на рисунке:

Итак, контексная подсказка сообщает нам:

1. Мы работаем с Функцией;

2. Сейчас необходимо ввести параметр ТекстВопроса — это обязательный параметр;

3. ТекстВопроса может принимать значения с типом ФорматированнаяСтрока, Строка;

4. Отображает все остальные параметры, которые необходимо передать функции.

Некоторые особенности: 

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

— Очень хочется, но пока возможности отображения типа возвращаемого элемента функции нет;

— Если процедура/функция/конструктор имеет несколько вариантов определения, отображается переключатель:

— В контекстной подсказке отображатся ссылки на описание типа текущего параметра в синтаксис-помощнике;

— Если используется подсказка по конструктору, то отображается почему-то «Функция»;

— Если используется подсказка по процедуре, то само слово «Процедура» почему-то не выделяется красным цветом, как «Функция»;

— По умолчанию, контекстная подсказка отображается автоматически при наборе «(» и «, «. Есть возможность управлять этой опцией в параметрах конфигуратора:

— Принудительно вызвать контексную подсказку можно нажатием клавиш (Ctrl + Shift + Space) — упоминания об этом во встроенной справке не нашел :(;

— Контекстная подсказка работает для как для встроенных процедур/функций/методов объектов/конструкторов, так и для пользовательских, но при этом, для того, чтобы получить информацию о типах параметров и их описание, требуется соответствие формату комментирования, описанных в документе Система стандартов и методик разработки конфигураций — о формате оформления во встроенной справке также ничего не нашел 🙁 Методом «тыка»:

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

Как видим, не очень-то информативно, но хоть что-то.

2. Если опишем комментарий перед функцией:

То есть, формат оформления должен быть следующим:

// %

// Параметры:

// {НаименованиеПараметра} % (тип параметра) % (описание параметра)

// {НаименованиеПараметра} % (описание параметра)

где:

    %любой набор символов

     «жирным» выделены обязательные «литералы»

54 Comments

  1. Новиков

    Если мне память не изменяет, то вроде VS 2003 умела еще это делать в каком году? в 2003 вроде? не? 🙂 И вроде, насколько я помню, в комментах перед методами ничего не нужно было ставить, а параметры методов сами расчухивались.

    Хотя сейчас да, прикольно стало. Особенно сворачивание кусков кода в секции.

    Осталось дождаться когда можно будет отладчиком в обратную сторону ходить, и все — можно уходить на пенсию. Жизнь прожили не зря!

    Reply
  2. Поручик

    (1) (0) Неужели грядёт долгожданный штатный Телепат, от того самого, которого все знают.

    Если мне память не изменяет, что-то подобное уже было в Delphi, VisualFoxpro и ещё где-то в начале 2000-х.

    Reply
  3. orefkov

    Это было еще в Visual C++ 4.2, 1996 или 97 года.

    А так да, дождались!

    Хотелось бы еще уточнить, как подсказка ведет себя, если не может вычислить тип выражения?

    Reply
  4. awk

    (3) orefkov, Да как обычно. ЗабЪет на все. А браузер рефакторинга (выделение метода) еще для smalltalk в 90-х был. 1С на запад собралось. Глядишь в 9.0 не будет русского языка.

    Reply
  5. awk

    (4) Да ты что? Возьми современный IDE и посмотри как JavaScript и посмотри, как они типы переменных подсказывают.

    Reply
  6. asved.ru

    Хехе, теперь имеет смысл заполнять каменты к функциям 🙂

    Reply
  7. TrinitronOTV

    спасибо автору за предоставленный материал в статье, очень полезно и информативно

    Reply
  8. pumbaE

    Имхо, в некоторой степени надо благодарить Орефкова Александра, за снегопат и за тот волшебный пинок компании из 2 букв.

    Reply
  9. ShantinTD

    Было информационное письмо о выходе платформы 8.3, в самом низу которого есть раздел «новые инструменты для разработчика». Там про контекстную подсказку и про авторские комментарии написано. Коротко и без картинок, естественно. И про авторские комментарии там написано лишь что

    Стандарты разработки подразумевают, что каждая процедура/функция, написанная разработчиком, должна предваряться комментариями, составленными по определенным правилам.

    Сами стандарты и правила оставлены «на самостоятельное изучение».

    Автору СПАСИБО за потраченное время, за наглядную заметку.

    Reply
  10. xzorkiix

    [здесь должна была быть фотография магнита с холодильника]Инфостарт разрешил[/здесь должна была быть фотография магнита с холодильника]

    Благая весть.

    Reply
  11. xzorkiix

    (1) Новиков,

    Осталось дождаться когда можно будет отладчиком в обратную сторону ходить

    Это простите как?

    Reply
  12. a_plastinin

    (6) awk, Вы о чем?

    Reply
  13. awk

    (13) Да бред сумасшедшего. Понять может лишь другой сумасшедший и психиатр. Не обращай внимания. 😉

    Reply
  14. Новиков

    (4) спасибо за разъяснения.

    (12) xzorkiix,

    Это простите как?

    Сейчас вы можете трейсить по ходу выполнения алгоритма. Однако, часто бывают случаи, когда вам очень бы хотелось посмотреть картинку, прокрученную назад.

    Напр., из последнего: сидите вы где-то в типовой конфе с внедренной БСП. И где-то там в потрохах, внезапно вам потребовалось разобраться с вопросом — а почему вот эта штука вот тут работает так? Вы начинаете «слаломить» по какому-то ключевому слову. Нашли все вхождения — затем начинаете открывать их, читать, фтыкать. Затем начинаете промечать точками останова все эти места. И наконец, когда все это вы проделали, далее, вы начинаете трейсить. Естественно, что даже где-то там в потрохах вы остановитесь, но возникает вопрос — а как вы туда попали? Сейчас это можно посмотреть по стеку вызову. Однако, следует понять, что стек вызова — только помогалка. Он вам скажет — я залетел сюда из вот этой процедуры/функции. Вы заходите туда, ставите опять точку останову, опять читаете-фтыкаете, и так — каждый раз. Рекурсивно, без выхода из цикла, пока, наконец, у вас в голове не построится четка цепочка алгоритма для трейсинга. В VS на эту тему давно придумали отладку назад — т.е. вы первый раз попали на точку останова, и уже дальше в обратную сторону по шагам, начинаете проматывать алгоритм. Уходит тысяча лишних и не нужных движений, которые я описал выше…Но на все это можно забить, если вы серьезно, что-то не трейсили типовое :))

    Reply
  15. xzorkiix

    (15) Новиков,

    VS 2010: отладка с IntelliTrace

    А ведь действительно такое есть. Каждый день что-то да новое.

    Reply
  16. tormozit

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

    Reply
  17. DoctorRoza

    Предлагаю не благодарить разработчиков за разработку оного! Ибо это должно и так быть! Вопрос в другом: почему этого механизма не было раньше? ИМХО, подушки безопасности должны быть в автомобиле по факту, если нет, то значит хрень!

    Reply
  18. Новиков

    (17) tormozit,

    есть куча вещей которые невозможно корректно восстановить, например удаленный или измененный файл

    Не понятно, зачем только трейсить это, а не сам процесс формирования значений для записи

    VS предполагаю фиксирует только состояния переменных

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

    Естественно, это не серебряная пуля 🙂

    Reply
  19. maxkisa

    (15) Новиков,

    В большинстве случаев или как минимум для сокращения геморроя достаточно будет воспользоваться «стеком вызовов».

    Reply
  20. tormozit

    (19) Почитал более подробно описание. В общем все ожидаемо, как я и описал. Куча не очевидных ограничений. Если не понимаешь, как это все устроено, то рискуешь запутаться еще сильнее, чем при итерационном смещении назад точки остановки.

    Повторяю. Согласен, что польза от этого будет. Но ты явно преувеличиваешь ее полезность. Эта фича из разряда «грязных», т.е. при ее использовании появляются некоторые негативные эффекты.

    Думаю неплохо бы привести пример, как это работало бы в 1С.

    Reply
  21. Новиков

    (21) tormozit,

    Но ты явно преувеличиваешь ее полезность. Эта фича из разряда «грязных», т.е. при ее использовании появляются некоторые негативные эффекты.

    я не думаю, что невозможность поднять записанный куда-то поток чего-то, это негативный эффект. Нужно просто с умом подойти к процессу. Это не серебряная пуля.

    Думаю неплохо бы привести пример, как это работало бы в 1С.

    Я уже описал все в (15). Если при отладке используется «слалом», тогда тебе нужно прометить как-то абсолютно все места — сначала по глобальному поиску, затем в каждом случае, по стеку вызовов, подниматься выше и опять промечать. Если такого промеченного кода становится много, то теряется весь эффект слалома. Нужно начинать стартовать от самой розетки, если оную ты еще сможешь найти. В случае, если бы был обратный откат, то достаточно в первом глобальном поиске прометить все места, забрейкпоинтиться в нужных по смыслу, ткнутся туда, и включить запись всех параметров. За второй проход ты поднимешь весь контекст выполнения по логу, и уже без тысячи-кратных перезапусков сможешь посмотреть разворачивание событий. Опять же в свете автоматизации тестирования в 8.3, можно было подумать как-то на тему увязки теста со сбором лога.

    Вот так как-то, на основе опыта подобной работы в VS, я себе представляю как бы это могло быть в конфигураторе. И да, коллеги — это доп.функционал все же. Если вы хотите, вы его юзаете. Нет — считает грязным и не уместным и не юзаете 🙂 Я бы его юзал, если бы он примерно таким, как я его описал. И наверное, были бы люди, которые это тоже юзали. Ведь в VS юзается и активно.

    Reply
  22. m.bolsun

    Удивительно конечно, что такие возможности появляются в IDE в 2013 году. Но в любом случае, лучше позже чем никогда. Сделали бы еще API для конфигуратора, тогда вообще счастье настанет.

    Reply
  23. Stim213

    (15) Новиков, молодой человек, отдел фантастики на втором этаже

    Reply
  24. xzorkiix

    Когда Конфигуратор станет самостоятельной коробкой. Тогда можно требовать (ждать) что-либо. А пока радоваться мелочам — чем не занятие? «Улыбаемся и машем. Улыбаемся и машем.»

    Reply
  25. pumbaE

    (23) m.bolsun, А кто-то API будет использовать… Кто будет следить, что бы конфигуратор работал стабильно и всякие API пользователи не насели удар по престижу фирмы 1С?

    Reply
  26. m.bolsun

    (26) pumbaE, Microsoft вот не боится удара по престижу и их Visual Studio полностью открыта для доработки.

    Reply
  27. orefkov

    (27)

    Ну не знаю, насколько сейчас студии открыты для доработки, давно их API не смотрел.

    Но вот в 6ой студии через родное апи сделать можно было ровно нихрена, и VisualAssist работал точно также, как опенконф — внедряясь и хача все что только можно, благо она, как и 7.7, была на MFC написана.

    И почему-то мне кажется, что и Assist, и Resharper до сих пор не все делают только через API.

    Reply
  28. orefkov

    (25)

    Конфигуратор вряд ли станет отдельной коробкой.

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

    И будем закупать — N лицензий для рабочих мест, M лицензий для администрирования, К лицензий разработчика.

    Либо все остается как было, но появится Конфигуратор+ какой-нибудь.

    Reply
  29. m.bolsun

    (28) orefkov, ну думаю точно не через SendKeys и Dll Injection 😉

    Reply
  30. m.bolsun

    (29) orefkov, судя по тому сколько лет понадобилось на подсветку параметров, скорее всего не раньше 1С 10.

    Reply
  31. pumbaE

    (31) m.bolsun, Александру стоит добавить работу с подсказками после точки (это не просто) и получиться опять «жареный петух клюнул в » .

    Reply
  32. m.bolsun

    (32) pumbaE, издержки динамической типизации. Да, можно сделать определенную поддержку, для локальных переменных, но узнать тип переданного параметра или возвращенного функцией значения, в 100% случаях уже не получится.

    Reply
  33. orefkov

    (33)

    Со 100% нет. Но вот процентов 80 — достижимо, путем более глубокого анализа (для параметров — вызывателей, для возвращаемого значения — оператора Возврат). Для функций-обработчиков событий типы параметров сразу известны.

    Остальные 20 — закрываются явным указанием типа в комментариях, как делали в 7.7:

    Код
    таб = ВызовМетода(); //:ТаблицаЗначений
    

    Показать полностью

    У tormozit’а вроде уже неплохо работает контекстная подсказка, скоро дам ему возможность портировать ее в снегопат 🙂

    Reply
  34. m.bolsun

    (34) orefkov, про 80% согласен, можно сделать и будет работать, но что правда кто-то будет писать тип переменной в комментариях, чтобы потом получить подсказку через точку? Такой костыль — ИМХО уже перебор. Плюс как быть с таким выражением КакойТоПараметр.КакаяТоФункция().КакаяТоПроцедура(); Или обращение к значениям коллекций с разными типами.

    Reply
  35. orefkov

    (35)

    Почему не будут? Будут, вот даже здесь есть «хитрость» — http://infostart.ru/public/65470/

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

    Reply
  36. orefkov

    (35)

    [quote]

    Плюс как быть с таким выражением КакойТоПараметр.КакаяТоФункция().КакаяТоПроцедура();[/quote]

    Ну как обычно. Сначала анализировать КакойТоПараметр.

    Если смогли, анализировать, что возвращает КакаяТоФункция(). И так далее.

    Возможен еще один поход — если название «КакаяТоФункция» уникально и встречается только в одном типе.

    Говорю, масса эвристик может применяться.

    Reply
  37. m.bolsun

    (36) orefkov, ну я же привел пример, где не будет работать комментарий. Да я в общем то не против. Уж мне то, как и тебе, к костылям для 1С не привыкать.

    Reply
  38. markgenuine

    Неважно когда, главное разработчики не стоят на месте и двигаются вперед, только уж что-то мелкими шагами, наверное им штата не хватает, чтобы все успеть, это как обычно=)

    Reply
  39. It-developer

    Зашибись! Все никак не доберусь до 8.3. Еще 8.2 не до конца прочитал %))

    Reply
  40. It-developer

    То что в С++ Builder и Delphi было 10-12 лет назад сейчас появилось и в 1с…

    Reply
  41. Yashazz

    Да, и 20 лет не прошло. Нахрен это теперь надо, когда все привыкли обходиться имеющимся, а для особо требовательных давно уж есть снегопат… Да ещё и объявление выписывать, когда тупейший VB 3.0 уже в 1998 году всё читал из объявления самой функции, а у VB тоже типизация вольная. Короче, прикрутили безделушку, радуемся и громко заявляем о продвинутом софте.

    Reply
  42. Новиков

    (42) Yashazz,

    Нахрен это теперь надо, когда все привыкли обходиться имеющимся

    Что-то работающее, вместо нуля — все же всегда лучше. Это как лучше хренова сидеть, нежели круто стоять, т.к. в ногах правды нет 🙂

    Я думаю, со временем, до делают до уровня продвинутых стандартных IDE.

    А про снегопат интересно узнать у разработчика: почему 1С лавочку не прикроет его? 🙂 Ведь, видимо прикрыть можно же. Хотя, не удивлюсь, если и в самой 1С юзают его.

    P.s.: сам не пробовал оный не разу. Может не знаю — чего потерял ))))

    Reply
  43. pumbaE

    (43) Новиков, не знаешь, не знаешь. Последняя демка снегопата, очень даже функциональная — попробуй сравни. (Особенно переназначь Ctrl+F3 на расширенный поиск, а Ctrl+Shift+F3 на глобальный фоновый поиск)

    Судя по добавленному функционалу, 1С взяла старую демку снегопата почерпнула идеи и реализовала.

    Reply
  44. wunderland

    Всегда уважал первопроходцев

    Reply
  45. vano-ekt

    (0)убийца снегопата 🙁

    Reply
  46. ShantinTD

    (46), ИМХО, Снегопат вне опасности. Для тех, кто знаком со снегопатом, конечно.

    Reply
  47. awk

    (46) vano-ekt, Да щас… Если 1С так раскачиваться и дальше будет, то снегопату жить, да жить.

    Reply
  48. SeiOkami

    Вот такой косячек в этой подсказке имеется:

    http://www.forum.mista.ru/topic.php?id=667344

    Reply
  49. AlexO

    (24) Stim213,

    отдел фантастики на втором этаже

    Вообще-то, описаны элементарные функции ЯП, реализованные в других ЯП еще в конце 90-х — как винда на ноги встала.

    Называется это — «отладочный запуск части кода».

    Reply
  50. sashocq

    Вот я удивляюсь: кто-то старается, делает что-то новое, полезное, или пишет что-то, что никто до него не писал. А кто-то просто переписывает документацию — и сразу получает кучу плюсов.

    Тоже, что-ли, что-нибудь из справки запостить…

    Reply
  51. xzorkiix

    (51) sashocq, ещё можно гневные Комменты писать, тоже выхлоп даёт не плохой.

    Reply
  52. Новиков

    (52) xzorkiix, угу. Если б еще карма росла с поправочным коэффициентом > 1, тогда бы все взяли фамилию Белинского, и пустились во все тяжкие 🙂

    Reply
  53. Новиков

    А между тем появился Анонс Visual Studio 2013

    Заметьте что среда развивается с учетом средств групповой разработки и автоматического тестирования, а также сборки релизов. Уже получается целое окружение 🙂

    Reply
  54. Gureev

    Картинки не отображаются.

    Работа сайта http://aplastinin.ru приостановлена.

    А разве на инфостарт картинки выложить нельзя? Зачем тянуть с левых сайтов.

    Reply

Leave a Comment

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