OneStyle. Улучшенное форматирование кода в конфигураторе












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

Это один из множества инструментов проекта v8CfgAddsAhk. Описание на Инфостарт, на сайте, в гитхабе, мой форк.

Так же использована обработка для форматирования кода от 1С. Которую можно взять с ИТС.

О правомерности использования

Всегда последние изменения в дев-ветке основного проекта или в фиче-ветке моего форка

Что умеет

Выделяете нужный фрагмент кода, нажимаете Ctrl+Alt+F и происходит следующее

1. Вызывается стандартное форматирование Shift+Alt+F

2. Приводит комментарий к виду из стандартов разработки

Добавляет пробелы после // и перед текстом, если их нет, делает заглавной первую букву, переносит комментарии, длиннее 120 символов (длина задается в настройках)

3. Приводит ключевые слова к каноническому виду

4. Приводит ключевые слова в запросе к каноническому виду

5. Добавляет пустые строки вокруг ключевых конструкций, таких как Если, Для, Функция

Можно отключить в настройках

6. Удаляет внутри кода лишние пробелы и табы

7. Добавляет нужные пробелы вокруг арифметических знаков, запятых и скобок

Добавление пробелов у скобок можно отключить в настройках. Результат будет как в ВЖУХ2

8. Удаляет пробельные символы справа

В отличие от многих альтернатив не превращает пустые строки с отступами в пустые строки.

9. Выполняет форматирование перенесенных выражений

Это именно тот пункт, ради которого все и затевалось. Все ведь любят тот момент, когда форматируешь код и все сдвигается влево до упора?

Способ выравнивания запросов задается в настройках

// 0 - не выравнивать.
Запрос.Текст = "ВЫБРАТЬ
| Пользователи.Ссылка КАК Пользователь
|ПОМЕСТИТЬ втПользователи


// 1 - добавлять таб
Запрос.Текст = "ВЫБРАТЬ
| Пользователи.Ссылка КАК Пользователь
|ПОМЕСТИТЬ втПользователи


// 2 - выравнивать по равно
Запрос.Текст = "ВЫБРАТЬ
| Пользователи.Ссылка КАК Пользователь
|ПОМЕСТИТЬ втПользователи

Запрос = Новый Запрос( "ВЫБРАТЬ
| Пользователи.Ссылка КАК Пользователь
|ПОМЕСТИТЬ втПользователи" );

10. Разбивает длинные выражения на несколько строк

Так же выравнивает с учетом Знач. И сразу видно, что кое где их забыли проставить.

Если после форматирования код начал выглядеть странно. Это повод задуматься над его рефакторингом. 

11. Выравнивает код по «=», «(«, «,», «//»

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

Выравнивания можно отключить в настройках.

Как начать пользоваться

Нужно скачать и установить autohotkey https://autohotkey.com/

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

Если вы в гите разбираетесь чуть лучше, чем никак, то лучше проект себе склонировать или форкнуть, и тогда изменения можно получать более автоматически.

Запустить файл v8CfgAdds.ahk в корне проекта.

В конфигураторе выделить нужный текст и нажать Ctrl+Alt+F

Как изменить настройки

В папке проекта есть файл configsOneStyle.json , все немногочисленные настройки там.

Как поучаствовать в развитии, изменить под себя

Весь проект OneStyle написан на oscript и легко может быть доработан среднестатистическим 1Сником.

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

Новое 2024.06.20

Исправлены выявленные ошибки.

Добавлены настройки для выравнивания. См. п.11

Добавлены настройки для выравнивания многострочных строк. См. п. 9

Подробный список изменений с возможность посмотреть изменения в коде

45 Comments

  1. nixel

    Огонь! Спасибо огромное.

    Будут ещё пожелания по переносу по скобкам, но это детально лучше в ишузе обсудить

    Reply
  2. boln
    Выравнивает код по «=», «(«, «,», «//»

    Только на партнерке про это не говорите — там есть ух какие противники такого выравнивания. Заклюют 🙂

    Reply
  3. headMade

    (2)чем на партнере не нравится такое выравнивание?

    Reply
  4. YOr!k

    (2) думаю многие аргументы против такого выравнивания вполне обоснованы

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

    тут, конечно, поступать надо так как заведено на конкретном проекте, без фанатизма.

    Reply
  5. TODD22

    (4)

    если нужно найти все места, где присваиваются значения конкретного реквизита

    Для этого можно воспользоваться поиском по коду и подсветкой выделенной переменной…..

    Reply
  6. boln

    (3)

    чем на партнере не нравится такое выравнивание?

    Один из аргументов приведен в (4). Среди других: создается излишняя нагрузка на хранилище конфигураций.

    Впрочем, вот, у кого есть доступ, примеры возражений:

    https://partners.v8.1c.ru/forum/topic/1578315

    https://partners.v8.1c.ru/forum/t/1429490/m/1550876

    Reply
  7. Stepa86

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

    Хотя доводы смешные. Макконнелл, когда ругал выравнивание, единственным аргументом против называл необходимость менять вручную соседние строчки кода из-за изменения в одной. При этом он соглашался, что код выглядит чище и приятнее. А раз тут автоматом будет выравниваться, то и программист не устает.

    Reply
  8. orefkov

    (4)

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

    Конечно, ведь реализовать поиск регулярными выражениями непосильная задача 🙂

    Reply
  9. Артано

    Честно говоря, некоторые подходы к форматированию весьма спорные.

    Например оформление структур продемонстрированное на функции «НАЙТИСИМВЛОСКОНЦА». В данном конкретном примере больше помогло бы выключение капслока у программиста с параллельным битьем по голове (все равно он в неё только ест).

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

    Если на указанные нюансы можно влиять настройками, то можно пользоваться, иначе — смена шила на мыло.

    Reply
  10. Stepa86

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

    А то претензии выглядят как «Мы потратили на этот проект кучу денег, а он не делает того, что мы хотим. Срочно реализуйте!!!»

    Reply
  11. Stepa86

    (4) А если в коде присваивание сделано как ПарамПамПам=1; ? Или ПрисвоитьЗначениюЕдиничку( ПарамПамПам ) ? Или через ЗаполнитьЗначенияСвойств ?

    Reply
  12. Артано

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

    Reply
  13. infosoft-v
    очень усложняется работа с поиском при работе с незнакомым кодом, например, если нужно найти все места, где присваиваются значения конкретного реквизита

    Никак не могу взять в толк, почему?

    Reply
  14. JohnConnor

    останусь на снегопаде

    Reply
  15. Stepa86

    (14) Под снегопатом тоже должно работать. Я не проверял, правда

    Reply
  16. Stepa86

    (2) (4) (6) (9) Добавил настройки для выравнивания запросов и отключения выравниваний по знакам.

    Reply
  17. YOr!k

    (13)

    Никак не могу взять в толк, почему?

    присвоение удобно искать по строке «ИмяРеквизита =», поиск просто по «ИмяРеквизита» найдёт все места использования реквизита, а не случаи его инициализации

    (8)

    Конечно, ведь реализовать поиск регулярными выражениями непосильная задача 🙂

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

    (10)

    ПарамПамПам=1; ? Или ПрисвоитьЗначениюЕдиничку( ПарамПамПам ) ? Или через ЗаполнитьЗначенияСвойств

    кажется, это не аргумент, чтобы ещё больше усложнять себе жизнь доп. выравниваниями ) в большинстве случаев этот прием работает и позволяет быстро локализовать нужное место в коде.

    Это всё не в качестве холивара.

    Красота и опрятность кода — это очень субъективные понятия, у каждого есть свои «железные» аргументы почему он делает так, а не иначе, и я специально оговорился, что нужно следовать оговорённым стандартам, выравнивать так как это заведено на конкретном проекте, хуже когда это не соблюдается, и каждый выравнивает так, как ему больше нравится, устраивая при этом «войну правок» (выравниваний) в модулях, которые разрабатывают несколько человек.

    Reply
  18. orefkov

    (17)

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

    Я это и имел ввиду. Вместо того, чтобы реализовать в платформе возможность поиска регулярками (что не так и сложно), чтобы это было доступно везде всем и всегда — лучше говорить о том, что выравнивать по знаку равно это плохо.

    Reply
  19. orefkov

    (15) Надо мне всё-таки допилить интеграцию 1Script и нового снегопата. Тогда твой код с небольшими переделками сможет работать в снегопате нативно. Он же у тебя на OneScript сделан?

    Reply
  20. Stepa86

    (19) Да, целиком на oscript написано. Там с помощью автохоткея получается выделенный текст, записывается в файл, запускается oscript и опять автохоткеем читается и возвращается в выделенное. А запуск скрипта выглядит вот так

    systemOneScriptinoscript.exe scriptsOneStyleMain.os tmpmodule.txt

    Заменить автохоткей на снегопат не должно быть проблемой

    Reply
  21. orefkov

    Просто со снегопатом можно напрямую текст текущего модуля получить и потом вставить.

    Да и форму для настроек удобно сделать.

    Reply
  22. ret-Phoenix

    Форму настроек можно и у меня сделать, OneScript + GUI, сейчас вся визуальная часть на это переводится.

    Reply
  23. roofless

    из коробки должно работать?

    другие скрипты выполняются, а «ctrl+alt+f» только форматирует стандартным «alt+shift+f»

    Reply
  24. Stepa86

    (23) Если форматирует только стандартным и дальше ничего не происходит, то это так скрипт крашится. В 90% случаев это изза неправильного файла настроек configsOneStyle.json . Он должен быть корректного формата json. Про оставшиеся 10% ничего не могу сказать — нужно разбираться детальнее.

    Если что скрипт отрабатывает не мгновенно, подгрузка движка оскрипта занимает около секунды

    Reply
  25. roofless

    (24)вижу, что поехали наименования файлов(( как восстановить?

    Reply
  26. Stepa86

    (25) Попробуй скачать с гитхаба https://github.com/Stepa86/v8CfgAddsAhk/archive/feature/OneStyle.zip

    Reply
  27. Stepa86

    (25) Хотя дело наверно в архиваторе. Попробуй чем нить другим распаковать

    Reply
  28. roofless

    (27) верно, всё работает. спасибо!

    Reply
  29. CheBurator

    по п.3

    Превратить

    (Парам1, -Позиция, Парам3) в

    (…, — Позиция, …)

    мое чувство прекрасного протестует

    -А — это все-таки унитарная операция. и отрывать минус от операнда — фу-фу-фу…

    Reply
  30. kare

    (28) у меня тоже самое было, спасибо за комментарии ! 7z решил проблему.

    Reply
  31. bsi

    (19) Даешь 1Scrip в Cнегопат!!!

    Reply
  32. orefkov

    (31) Работаю над этим.

    Reply
  33. Stepa86

    Лайфхак для тех, кто не хочет всегда при форматировании выравнивать по равно, но иногда все таки выравнивает избранные куски (думаю таких не много, 80-95% всего лишь). Отключаете выравнивание в настройках уанстайла и ставите себе маленькую программку TNice https://habrahabr.ru/post/229833/ https://github.com/MrShoor/TNice , которая умеет выравнивать более точечно.

    Reply
  34. Akbis

    Полезная штука, форматирование текста очень пригодилось. Спасибо!

    Но вышло несколько моментов — Во первых запускается только с региональными настройками Russia.Без этого странно глючит.

    В OneStyle.json задал

    «ВыравниватьПоРавно»: true,

    «ВыравниватьПоСкобке»: false,

    «ВыравниватьПоЗапятой»: false,

    «ВыравниватьПоКомментариям»: false

    — то есть хочу выравниваться только по Равно. По скобкам вообще не хочу. Но эти настройки не вступают в силу.

    Далее остальные функции работают не совсем стабильно. Например Вызов списка методов: {ctrl +1} нажимаю список выходит, далее как мне прокликать и попасть в выбранный метод? Не получается чтото..

    Reply
  35. Stepa86

    (34) Про региональные настройки ничего не скажу. Глючить в стеке может AHK, скрипт под AHK, оскрипт и скрипт под оскрипт. Ну и умеет работать только с русским текстом, под английский я его не адаптировал и не планирую.

    По настройкам: то есть все равно выравнивается и по скобке и по запятым и по равно? Гляну, как время будет

    По остальным функциям лучше спрашивать автора http://infostart.ru/public/339035/ . Сейчас, насколько я знаю, эти списки заточены под работу клавиатурой и не ловят мыша, но Сергей планирует переписать все диалоги на оскрипт и вообще отказаться от AHK. Если интересен проект, то можно его пообсуждать тут https://gitter.im/v8CfgAddsAhk/Lobby

    Reply
  36. inf012

    (6) Спасибо за ссылочки с партнерской конфы.

    Да, про выравнивание, наверное, вечный вопрос.

    1С в типовых конфах не выравнивает по равно или по запятой.

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

    // Нужно добавить новую строку (2) «Грязь» в коде, выравнивание становится бессмысленным
    ДиалогВыбора.ПолноеИмяФайла = ИмяФайла;
    ДиалогВыбора.Каталог        = ИмяПути;
    ДиалогВыбора.Заголовок      = НСтр(«ru = ‘Выберите файл со списком запросов'»);
    ДиалогВыбора.Фильтр         = НСтр(«ru = ‘Файлы запросов (*.sel)|*.sel|Все файлы (*.*)|*.*'»);
    ДиалогВыбора.Расширение     = «sel»;
    ДиалогВыбора.НовоеДлинноеНазвание = НекоеЗначение;
    // «Правильный» код — выравнивания не используются, изменения всегда минимальные, код однотипный
    ДиалогВыбора.ПолноеИмяФайла = ИмяФайла;
    ДиалогВыбора.Каталог = ИмяПути;
    ДиалогВыбора.Заголовок = НСтр(«ru = ‘Выберите файл со списком запросов'»);
    ДиалогВыбора.Фильтр = НСтр(«ru = ‘Файлы запросов (*.sel)|*.sel|Все файлы (*.*)|*.*'»);
    ДиалогВыбора.Расширение = «sel»;
    ДиалогВыбора.НовоеДлинноеНазвание = НекоеЗначение;
    

    Показать

    Хотя, если надо не выравнивать, то это не принципиально.

    Reply
  37. inf012

    Но, все таки, сама 1С разрешает (допускает) использование выравнивания:

    https://its.1c.ru/db/v8std#content:2149184090:hdoc

    Reply
  38. Stepa86

    (29) Пофиксил. Теперь унарный минус всегда прилипает к операнду. На данный момент изменения только в моем форке

    Reply
  39. gubanoff

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

    (20) через файлы идет. Тогда можно было бы сразу всю конфигурацию привести к приличному виду.

    Тогда и автохоткей не понадобиться. Это тоже плюс.

    Reply
  40. ret-Phoenix

    (39) Вообще-то AHK используется только для запуска скрипта с параметрами.

    systemOneScriptinoscript.exe scriptsOneStyleMain.os %fileName%

    Источник = «tmpmodule.txt»;
    Если Параметры.Количество() > 0 Тогда
    Источник = Параметры[0];
    КонецЕсли;
    Приемник = Источник;
    Если Параметры.Количество() > 1 Тогда
    Приемник = Параметры[1];
    КонецЕсли;
    

    Показать

    Можете спокойно натравить на нужные Вам файлы.

    Пакетная обработка модулей конфигурации, примерно так:

    Файлы = Найти(…);
    Для каждого Файл из Файлы цикл
    // обработать текст
    КонецЦикла;
    

    P.S. Обновил статью на ИС и выложил комплексное обновление.

    Reply
  41. gubanoff

    (0) попробовали, нашли ряд случаев, когда форматирование выполняется некорректно — операторы разрываются на две строки, что приводит к синтаксическим ошибкам. Примеры прилагаю. Прошу исправить.

    Reply
  42. Stepa86

    (41) Это опенсорс. Если что то не нравится — можете сами у себя поправить. Если хотите этим поделиться с другими — готов рассмотреть ваши пулл-реквесты в https://github.com/Stepa86/v8CfgAddsAhk

    У меня сейчас нет ни желания ни времени дорабатывать этот проект для других. Меня текущая работоспособность устраивает.

    Reply
  43. Rustig

    (14) видео сделайте как вы на снегопаде решаете конкретную задачу

    до сих пор ничего не использовал, интересно увидеть фильм от начала до конца, а не отдельные обрывки Если Тогда КонецЕсли

    Reply
  44. Rustig

    (0) у вас на сайте

    Нужно скачать и установить autohotkey https://autohotkey.com/

    фон кода черный — скажите , это нормально для вас так программировать? на черном фоне, желтыми буквами….

    Reply
  45. Rustig

    (42)

    Меня текущая работоспособность устраивает.

    видео снимите пож-та как вы программируете — «насколько ваша разработка ускоряет программирование»

    Reply

Leave a Comment

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