neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
Редактор текста запросов 1С:Предприятия на Monaco
Translation pending
Developer toolsTypeScript · ANTLRGitHub @musabiiiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Редактор запросов 1С на Next.js и Monaco: подсветка, форматирование, структура пакета, ИИ-помощник
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Веб-редактор текста запросов 1С:Предприятия 8 на Next.js и Monaco Editor. Откройте http://localhost:3000. Образ (standalone-сборка Next.js, Dockerfile) собирает GitHub Actions при каждом пуше в master и публикует в ghcr.io/musabiii/queryeditormonaco — на сервере сборки нет, нужна только загрузка. Контейнер queryeditor подключается к внешней сети nginx-net, порт наружу не публикуется — к нему обращается nginx из своего контейнера:Read the full README ↗
Веб-редактор текста запросов 1С:Предприятия 8 на Next.js и Monaco Editor.
Таблица, набранная в списке полей, сразу присоединяется левым соединением с подобранным условием:
Псевдоним, изменённый после «КАК», меняется во всём запросе:
npm install
npm run dev
Откройте http://localhost:3000.
Образ (standalone-сборка Next.js, Dockerfile) собирает GitHub Actions при каждом пуше в master
и публикует в ghcr.io/musabiii/queryeditormonaco — на сервере сборки нет, нужна только загрузка.
Контейнер queryeditor подключается к внешней сети nginx-net, порт наружу не публикуется —
к нему обращается nginx из своего контейнера:
docker network create nginx-net # если сети ещё нет
docker compose pull && docker compose up -d
Кнопка «Поделиться» сохраняет запрос и даёт ссылку https://сайт/<id> — как pastebin: запрос
хранится 30 дней файлом в томе queryeditor-data (SHARE_DIR=/app/data/shares) и переживает
обновления образа; не больше 200 КБ на запрос и 30 ссылок в час с одного адреса. На Vercel
ссылки недоступны — там файлы между запросами не сохраняются.
Аналитика на своём сервере — Яндекс Метрика: номер счётчика задаётся переменной
YANDEX_METRIKA_ID (например, в файле .env рядом с docker-compose.yml), пересобирать образ
не нужно — после изменения docker compose up -d. Вебвизор выключен: он записывал бы тексты
запросов из редактора. На Vercel работает Vercel Analytics.
Вместо Метрики или вместе с ней — Umami на своём сервере: переменные
UMAMI_URL (адрес Umami, например https://umami.musabii.dev), UMAMI_WEBSITE_ID (идентификатор
сайта из настроек Umami) и необязательная UMAMI_DOMAINS (query.musabii.dev — не считать
запуски на localhost). Кроме посещений отправляются события (src/lib/analytics.ts): «Поделиться»,
«Форматирование», «Текст для кода 1С», «Убрать оформление кода 1С», «Очистить», «ИИ-помощник»,
«Проверка синтаксиса», «Цветовая схема», «Конфигурация» (название типовой или «своя»), «Загрузка
своей конфигурации». Тексты запросов не отправляются.
Пакет в GitHub Container Registry по умолчанию приватный: либо сделайте его публичным
(страница пакета → Package settings → Change visibility), либо войдите на сервере
docker login ghcr.io с токеном, у которого есть право read:packages.
location / {
proxy_pass http://queryeditor:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Ответы ИИ-помощника идут потоком; маршрут /api/ai/chat отдаёт X-Accel-Buffering: no, поэтому
nginx не копит их целиком. Запросы к провайдерам ИИ делает сервер — с сервера в РФ API OpenAI,
Anthropic и Google, скорее всего, недоступны.
Monaco без CDN. Скрипт scripts/copy-monaco.mjs копирует сборку monaco-editor/min/vs
в public/monaco (запускается на postinstall, predev, prebuild; папка в .gitignore).
Интерфейс редактора — на русском (src/lib/monaco-loader.ts).
Язык sdbl (src/lib/query-language/):
vocabulary.ts — ключевые слова, функции, типы, объекты метаданных, виртуальные таблицы
в русском и английском написании;grammar.ts — токенизатор Monarch и настройки языка (комментарии //, скобки, автозакрытие);themes.ts — темы Monaco, построенные из цветовых схем src/lib/color-schemes.ts;lexer.ts — лексер для разбора текста вне Monaco;batch.ts — разбор пакета на запросы для панели «Структура запроса»;formatter.ts — форматирование в стиле конструктора запросов (Shift+Alt+F).Цветовые схемы (src/lib/color-schemes.ts): 1С (классическая), VS Code Light/Dark (по умолчанию — по теме системы),
GitHub Light/Dark, Solarized Light/Dark, Dracula, One Dark, Monokai, Nord, Tokyo Night.
Схема задаёт цвета подсветки, редактора и интерфейса; новая схема — одна запись в этом файле.
Метаданные конфигурации (src/lib/metadata/): кнопка «Конфигурации» загружает выгрузку
конфигурации в XML (Конфигуратор → «Выгрузить конфигурацию в файлы»). Из выгрузки читаются только
Configuration.xml, описания объектов верхнего уровня (Catalogs/Имя.xml и т.п.) и предопределённые
элементы справочников и планов (Catalogs/Имя/Ext/Predefined.xml), разбор идёт
в Web Worker собственным разборщиком XML (xml.ts), модель сохраняется в IndexedDB браузера —
файлы никуда не отправляются. Выгрузка ЗУП 3.1 (≈2300 файлов, 65 МБ) разбирается за ~3 с
в модель 5,2 МБ.
Встроенные типовые конфигурации (public/configurations/): готовые сжатые модели, которые
всегда доступны в списке «Конфигурации» и скачиваются при первом выборе. Сейчас это
«Зарплата и управление персоналом» 3.1.20.97, «Медицина. Больница» 2.0.16.1,
«1С:Университет ПРОФ» 2.2.15.20 и «Управление торговлей» 11.5.27.95.
Добавить или обновить (выгрузки лежат в confexample/, папка исключена из git, ESLint, tsc и образа Docker):
Подсветка учитывает контекст: после точки идёт имя поля (Док.Ссылка, Т.Количество),
после КАК — псевдоним или тип, функции выделяются только перед скобкой (СУММА(...)),
ССЫЛКА считается оператором, только если справа путь к метаданным.
| и удвоенные кавычкиnpm run configuration:build -- confexample/<папка выгрузки> --slug zup
Скрипт сохраняет <slug>-<версия>.json.gz и обновляет manifest.json; прежняя версия с тем же
slug заменяется. Пересобранную модель браузер скачает заново: кэш сверяется с датой сборки в манифесте.
Проверка синтаксиса (syntax-check.ts, syntax.worker.ts, src/components/syntax-markers.ts): по
грамматике SDBL из 1c-syntax/bsl-parser (grammar/sdbl,
LGPL-3.0-or-later; разборщик генерирует ANTLR — npm run grammar:build). Через 0,6 с после паузы в наборе
текст разбирается в фоновом потоке, ошибки подчёркиваются красным, а их текст виден в конце строки
красным курсивом, как комментарий // … (в сам запрос не попадает); по одной на запрос пакета,
повторно разбираются только изменённые запросы. В строке состояния — «Ошибок: N» (клик и F8 — к следующей),
на панели команд — переключатель проверки (запоминается). С ошибкой форматирование не выполняется.
npm run syntax:corpus -- <выгрузка> прогоняет проверку по запросам из модулей конфигурации: на ~21 тыс.
полных запросов трёх типовых ложных ошибок нет, остаются только шаблоны, которые код дособирает.
Автодополнение (src/lib/query-language/completion/): объекты после Справочник., виртуальные
таблицы и табличные части, поля по псевдониму с переходом по ссылкам, поля временных таблиц
и вложенных запросов, значения перечислений и предопределённые элементы (ЗНАЧЕНИЕ(Справочник.Вид.);
без точки — псевдонимы, ключевые слова, функции. Реквизит, выбранный из списка в новом поле ВЫБРАТЬ,
вставляется сразу с именем: С.Наименование КАК Наименование (ГоловнаяОрганизацияНаименование для
С.ГоловнаяОрганизация.Наименование, Наименование1 при повторе), как у конструктора. В условии ГДЕ (после ГДЕ,
И, ИЛИ, НЕ) выбранный реквизит вставляется как Т.Поле = и сразу открывается список значений. После ВЫБРАТЬ и СГРУППИРОВАТЬ ПО (и запятой в их списках),
ГДЕ, ИМЕЮЩИЕ, ПО соединения, И/ИЛИ/НЕ в этих условиях (кроме МЕЖДУ … И), КОГДА, ТОГДА, ИНАЧЕ,
а также после скобки функций вроде СУММА(, ЕСТЬNULL(, ГОД( — с пробелом, Enter или Tab сразу открывается
список псевдонимов таблиц запроса (в порядке ИЗ); выбранный дополняется точкой и списком полей. После Т.Поле = (или <>, <, >, <=, >=) и пробела — сразу
список: параметр &ИмяПоля (в условии ПО соединения вместо него — псевдонимы таблиц), для булевых — ИСТИНА и ЛОЖЬ, для ссылочных — ЗНАЧЕНИЕ(...) перечисления, предопределённые
элементы и ПустаяСсылка.
Заготовка запроса по таблице (new-query.ts, new-query-preview.ts): в блоке без запроса (или только
с ВЫБРАТЬ) набран путь Справочник.МедицинскиеКарты или имя временной таблицы пакета — под строкой серым показывается готовый запрос
ВЫБРАТЬ МедицинскиеКарты. ИЗ Справочник.МедицинскиеКарты КАК МедицинскиеКарты, курсор встаёт после
МедицинскиеКарты. и сразу открывается список реквизитов. Таблица, выбранная из списка подсказок, подставляется
сразу; набранная руками — серой заготовкой по Tab. В запросе с ИЗ набранная
в списке ВЫБРАТЬ таблица (РегистрСведений.АдресПациента) показывается серым как ЛЕВОЕ СОЕДИНЕНИЕ
с подобранным условием; Tab присоединяет её и заменяет путь псевдонимом с точкой (выбранная из списка —
присоединяется сразу). Нужна загруженная конфигурация.
Следующий запрос пакета: в конце пакета набрано /// — серым показывается разделитель на всю ширину
и ВЫБРАТЬ; Tab ставит ; после последнего запроса (если её нет), дописывает разделитель и ВЫБРАТЬ,
курсор — строкой ниже.
Связанная правка псевдонима (linked-aliases.ts): курсор на псевдониме после КАК в ИЗ — правка
сразу меняет его во всём запросе, во всех путях ФЛ.… (правка ФЛ в самом ФЛ.Поле — обычная); другие запросы пакета,
подзапросы со своими таблицами, поля вида Т.ФЛ и комментарии не затрагиваются.
Так же правится имя временной таблицы после ПОМЕСТИТЬ: оно меняется в следующих запросах пакета
(источники, УНИЧТОЖИТЬ, пути ВТ.Поле, псевдоним в ИЗ ВТ КАК ВТ) — до УНИЧТОЖИТЬ или повторного
создания таблицы с тем же именем; псевдоним другой таблицы КАК ВТ не меняется.
Подсказка группировки (group-by.ts): если в выборке есть агрегатные функции и поля вне них,
а СГРУППИРОВАТЬ ПО нет, серым текстом предлагается раздел с этими полями — когда курсор
на пустой строке в конце запроса, в начале строки с ; или следующим разделом, или в конце
последней строки ИЗ/ГДЕ. Tab вставляет, Esc или продолжение набора — отклоняет. После применения
агрегатной функции из дерева к полю та же заготовка сразу показывается серым на своём месте
в конце запроса (group-by-preview.ts), курсор остаётся на поле.
Дерево конфигурации (src/components/metadata/ConfigurationTree.tsx, smart-insert.ts):
перетаскивание вставляет имя (реквизит — с псевдонимом своей таблицы, если она уже есть в запросе
в месте вставки: Сотр.Код); двойной клик добавляет в запрос под курсором — реквизит в список
ВЫБРАТЬ, его таблицу (если её ещё нет) и таблицу целиком — ЛЕВОЕ СОЕДИНЕНИЕ с условием
по типам реквизитов (иначе ИСТИНА, выделено); без ИЗ таблица становится первым источником,
вне запроса создаётся новый. У ссылочных объектов первой идёт «Ссылка», в группе «Предопределенные» —
предопределённые элементы (вставляются как ЗНАЧЕНИЕ(...), наименование — во всплывающей подсказке).
Кнопка-воронка в заголовке оставляет только объекты, которые уже есть в тексте запроса
(used-objects.ts: источники, ЗНАЧЕНИЕ(...), ССЫЛКА, ВЫРАЗИТЬ; комментарии и строки не в счёт).
В конце дерева, как в конструкторе 1С, — «Временные таблицы» из текста (ПОМЕСТИТЬ) с их полями;
двойной клик соединяет их с таблицами запроса по общим полям ссылочного типа.
ИИ-помощник (src/lib/ai/, src/components/ai/, src/app/api/ai/): чат справа от редактора
с быстрыми действиями и вставкой ответа в редактор. Провайдеры: Anthropic (Claude) — через
@anthropic-ai/sdk; OpenAI, Google Gemini, DeepSeek, OpenRouter, Ollama и LM Studio — через
OpenAI-совместимый API (openai). Запросы идут через маршруты /api/ai/chat и /api/ai/models:
ключ хранится только в браузере (localStorage) и передаётся серверу вместе с запросом.
Галка «Реквизиты таблиц» добавляет к сообщению поля и типы таблиц конфигурации, которые есть
в запросе (table-structure.ts), — модель не придумывает имена реквизитов; повторно описание
уходит, только если изменилось.
Адреса облачных провайдеров зафиксированы на сервере; свой адрес можно указать только для
Ollama и LM Studio. Если выкладываете редактор в общий доступ, учтите: сервер будет обращаться
к указанным адресам локальных моделей от своего имени.