Mempemp/DSH-CodeEditor_BSL

DSH-CodeEditor_BSL

interactive CodeEditor for BSL

Uncategorized

dsh-bsl-editor

Редактор кода 1С (BSL) внутри DeepSeek Harness.

Выгрузка конфигурации 1С открывается во вкладке чата DSH: дерево метаданных, редактор Monaco с раскраской BSL, вкладки файлов, фильтр изменённых файлов, переход к определениям и отправка кода в чат.

Возможности

🌲 Дерево метаданных 1С

Левая панель переключается между деревом файлов и деревом метаданных 1С:Предприятия с иконками типов — Подсистемы, Справочники, Документы, Регистры, Общие модули, … → объекты → Реквизиты / Табличные части / Формы / Команды / Макеты / Модули. Клик по модулю открывает его в редакторе. Есть поиск по имени объекта.

Поддерживаются три формата выгрузки: EDT (.mdo), XML-выгрузка из Конфигуратора (ConfigDumpInfo.xml) и пообъектная XML-выгрузка. Формат определяется автоматически. Дерево ленивое: узел парсится при раскрытии.

🗂 Вкладки файлов

Каждый открытый файл — вкладка в верхней полосе редактора: имя файла, индикатор несохранённых правок, закрытие крестиком или средней кнопкой мыши. При переключении вкладок сохраняются текст правок, позиция курсора и скролл; состояние вкладок восстанавливается при повторном открытии редактора. Справа — кнопки «перечитать с диска» и «сохранить»; Ctrl+S сохраняет файл.

🔎 Изменённые файлы

Переключатель «Все файлы» / «Изменённые» над деревом: в режиме «Изменённые» показывается плоский список файлов с git-статусом (M / A / D / +). Наведение показывает полный путь; клик открывает файл во вкладке. Файлы, которых ещё нет в git, показываются наравне с изменёнными и помечены +.

Режим «Изменённые» работает и в дереве метаданных: остаются только группы и объекты, в которых есть изменённые файлы. Поиск в этом режиме ограничен изменёнными файлами.

Статусы также отображаются у файлов в дереве; изменённые строки помечаются маркерами в редакторе.

🌆 Тема Monokai

Редактор использует палитру Monokai: фон #272822, ключевые слова — розовые, функции и классы — зелёные, строки — жёлтые, числа — фиолетовые.

🎨 Раскраска BSL

Раскраска построена на официальной TextMate-грамматике 1С (1c-syntax) через monaco-textmate + onigasm. Грамматика, Monaco и воркеры отдаются плагином из resources/vendor; внешние CDN-источники оставлены запасным вариантом. Подсветка охватывает ключевые слова, строки, комментарии, &Аннотации, #Область.

⚡ Переход к определению по F12

Определение ищется по модели метаданных — без language server:

  • ОбщийМодуль.Метод() / Справочники.Товары.Метод() → модуль и позиция;
  • имя метода без точки → поиск в текущем модуле;
  • повторный F12 перебирает несколько кандидатов.

F12 обрабатывает плагин; нативный Ctrl+Click Monaco не перехватывается, тост «No definition found» на промахе не показывается.

«Peek Definition» из контекстного меню доступен только при включённом LSP.

💬 Отправка кода в чат

Выделите фрагмент в редакторе → правый клик → «Добавить к обсуждению» → код попадает в композер DSH.

🔵 Диффы изменений в редакторе

Изменения рабочей копии видны прямо в открытом файле: добавленные строки — зелёным фоном, удалённые — красными блоками между строк с их текстом. Файл, которого ещё нет в git, показывается как полностью добавленный, в панели навигации — подпись «новый файл». Панель в правом верхнем углу (↑ / ↓ / счётчик) и хоткеи Alt+↑ / Alt+↓ перемещают по изменениям. Счётчик считает блоки изменений и следует за позицией при скролле. Блок можно принять или отклонить — см. раздел «Принять или отклонить изменения». Открытие файла с изменениями позиционирует на первый из них.

✅ Принять или отклонить изменения

У каждого блока изменений, сразу под ним справа — кнопки Принять и Отклонить. Дифф считается против HEAD (последнего коммита), а не против состояния «до правки», поэтому:

Границы блока — по-настоящему изменённые строки: дифф берётся без строк контекста, поэтому две правки, разделённые хотя бы одной неизменённой строкой, — это два разных блока со своими кнопками, а не один общий.

  • Принять — блок считается просмотренным: подсветка и красный блок удалённых строк убираются, счётчик и переход по Alt+↑ / Alt+↓ оставляют только непросмотренное. Сам файл не меняется — правка уже лежит в нём, коммит для этого не нужен.
  • Отклонить — к HEAD возвращается ровно этот блок (git apply -R по одному изменению diff). Работает и для правок, попавших в индекс (git add): там откат идёт и по индексу, и по файлу. Если в редакторе есть несохранённые правки, откат не выполняется — сначала Ctrl+S.

По файлу целиком — кнопки в полосе вкладок над редактором: Принять все, Отклонить все (возвращает файл к HEAD, срабатывает по второму клику) и Просмотрено: N — показывает просмотренные блоки приглушённым серым, чтобы ошибочно принятый блок можно было вернуть кнопкой «Вернуть». Отметки «просмотрено» хранятся на машине и опознают правку по её содержимому: сдвиг строк от правок выше по файлу отметку не сбрасывает. После коммита отметки остаются у тех правок, что в коммит не попали, — у уехавших в коммит они уходят вместе с ними.

📤 В индекс и коммит

Просмотренное можно не только спрятать, но и довести до коммита, не выходя из редактора:

  • В индекс (в полосе вкладок) — в индекс уходят только помеченные изменения, остальные строки файла не трогаются. Непросмотренная правка в индекс не попадёт: она остаётся в рабочей копии. Новый файл (его ещё нет в git) индексируется целиком — отдельных правок от git у него ещё нет. Ответ кнопки называет, что именно произошло: «В индекс отправлено 5 изменений». Изменения, которые уже лежат в индексе (их отправили раньше), называются отдельно — «9 изменений уже в индексе», и это не ошибка. Про неотправленные кнопка говорит прямо: «4 изменения отправить не удалось — файл правился после просмотра, обновите вид и отметьте их заново». Если просмотренных изменений нет вовсе, так и сказано: «Нет просмотренных изменений — отметьте их кнопкой «Принять»».
  • Всё просмотренное в индекс (над списком «Изменённые») — то же по всем изменённым файлам проекта: идёшь по списку, отправляешь принятое, список тает.
  • Коммит — окно со списком того, что лежит в индексе, и полем для сообщения. Коммитится индекс целиком, сообщение пишет человек.

Отправленное в индекс изменение уходит из вида файла и из счётчика: оно уже в индексе и ждёт коммита, а «Просмотрено: N» считает только то, что ещё не отправлено. Ответ кнопки всплывает полоской сверху, под полосой вкладок: появляется и затухает плавно, сам гаснет через 5 секунд и закрывается крестиком. Клики по коду сквозь неё проходят — перехватывает только сама плашка. Перед отправкой файл должен быть сохранён (Ctrl+S) — иначе в индекс ушла бы версия с диска, а не то, что на экране.

💬 Открытие файлов из чата

Клик по ссылке на .bsl / .xml в сообщении чата открывает файл в редакторе плагина: дерево раскрывается до файла и подсвечивает его, активной становится вкладка Editor. Ссылки на файлы других форматов и пути вне workspace обрабатываются дальше — другим плагином либо системным приложением. Отключается настройкой «Перехватывать открытие файлов из чата».

🔄 Автообновление открытых файлов

Если открытый файл изменили вне редактора (агент, внешний редактор), вкладка обновляется при переключении на неё или возврате в окно DSH — со сохранением скролла и курсора. При наличии несохранённых правок появляется плашка «Файл изменён на диске» с кнопкой «Перезагрузить с диска»: автозамены правок нет.

🔌 LSP

Поддержка bsl-language-server (диагностика, автодополнение, hover, форматирование) через WebSocket. По умолчанию выключена; включается в Settings DSH → «1С-редактор». Плагин не скачивает bsl-language-server — ожидается установленный бинарник. На больших конфигурациях сервер может зависать при построении модели конфигурации.

⚙️ Настройки

Раздел «1С-редактор» в настройках DSH:

Настройка · По умолчанию · Значение LSP · выключен · bsl-language-server Перехватывать открытие файлов из чата · включено · клики по ссылкам на .bsl / .xml открываются в редакторе плагина Порт сервера · 8025 · порт WebSocket bsl-language-server Путь к bsl-language-server.exe · *(пусто)* · явный путь к бинарнику

Установка

Скачайте dsh-bsl-editor-0.6.2.tgz со страницы релизов (или соберите сами: cd dsh-bsl-editor && npm pack) и установите:

dsh plugin --profile web add dsh-bsl-editor-0.6.2.tgz

Либо по прямой ссылке на архив релиза:

dsh plugin --profile web add https://github.com/Mempemp/DSH-CodeEditor_BSL/releases/download/v0.6.2/dsh-bsl-editor-0.6.2.tgz

Затем перезапустите dsh web и обновите вкладку браузера.

Если pnpm сообщает об ошибке стора (ERR_PNPM_UNEXPECTED_STORE) — добавьте --store-dir="" к команде установки.
По умолчанию путь к бинарнику: %LOCALAPPDATA%\Programs\bsl-language-server\bsl-language-server\bsl-language-server.exe. Другой путь задаётся в настройках.

Требования

  • DeepSeek Harness (dsh web)
  • Node.js ≥ 20

Поддерживаемые форматы выгрузки

Формат · Признак · Примечания EDT · Configuration/Configuration.mdo · объекты из файлов .mdo (реквизиты, табличные части, формы, команды, макеты) XML-выгрузка (Конфигуратор) · ConfigDumpInfo.xml + Configuration.xml · дерево из списка метаданных Пообъектная XML-выгрузка · корневой Configuration.xml + папки типов (Catalogs/, Documents/, …) · разделы восстанавливаются из файловой системы: Формы / Команды / Макеты / Модули / Предопределённые

Сопоставление модулей: CommonModules//Ext/Module.bsl, Catalogs//Ext/ObjectModule.bsl, Forms//Ext/Form/Module.bsl, корневой Ext/ManagedApplicationModule.bsl и т.д.

Структура репозитория

  • lib/index.js — host-часть (ESM): маршруты /bsl/* (tree, read, search, git, meta, find-symbol), запуск bsl-language-server.
  • lib/metadata.js — модель метаданных 1С: определение формата, парсеры трёх форматов, статическое разрешение символов.
  • lib/client.js — клиентская часть: вкладка «Редактор» в conversation-view (вкладки файлов, дерево, Monaco, фильтр изменений).
  • resources/ — иконки узлов метаданных, TextMate-грамматики 1С.
  • tests/ — HTTP и LSP smoke-тесты.

Благодарности

Структура дерева метаданных и иконки узлов адаптированы из (MIT License, © Ilya Bushin).