XBSL для VS Code
Расширение VS Code для 1С:Элемент: подсветка синтаксиса, линтинг на лету с Quick Fix, визуальный конструктор форм, обозреватель метаданных и навигация по проекту – всё на движке xbsl.
Подсветка синтаксиса и проверка исходников 1С:Элемент (.xbsl) на лету движком
xbsl. Вместе с ней – конструктор форм, дерево метаданных,
панель документации платформы, создание метаданных, отладка и кнопка деплоя.
Хотите посмотреть всё сразу на небольшом проекте? Откройте папку
demo/репозитория. Это крошечное приложение 1С:Элемент с формой и несколькими намеренными находками линтера.
Проверка буфера YAML ограничена настроенным корнем проекта и его словарём перевода. Быстрые исправления доступны для YAML и модулей. Сохранение отменяет ожидающие ответы по буферу: запоздавший результат не заменит новый отчёт проекта и его исправления.
Каркас формы показывает ОбычныеКоманды в подвале и признаки Наклонный, Подчеркивание,
Зачеркивание абсолютного шрифта. Подсказки используют написания свойств исходной формы.
Расширение использует движок xbsl 1.0.0. Установите его в Python, выбранный настройкой xbsl.linter.pythonPath.
Значок обновления в строке состояния заново строит индекс и проверяет все исходники проекта.
Во время проверки рядом с вращающимся значком видны этап и его процент, например
4/8 Файлы · 43%. Подсказка показывает выполненные и оставшиеся файлы или правила, текущее
правило проекта и прошедшее время, обновляемое раз в секунду. У каждого этапа свой процент.
После публикации диагностик и завершения проверки кнопка снова показывает только значок обновления.
Как это устроено
Расширение – тонкий клиент движка xbsl. В
режиме LSP, который включён по умолчанию, к одному долгоживущему
серверу xbsl-lsp обращается всё: диагностика, навигация, панель документации и создание
метаданных. Без сервера те же проверки и создание метаданных идут через CLI:
В режиме CLI одну коллекцию диагностик наполняют два источника. Расширение выбирает источник по состоянию буфера.
- Пока вы печатаете. У несохранённого буфера модуля, YAML проекта или файла словаря перевода расширение
запускает
xbsl --stdin --filename <имя> --format jsonпо тексту, который сейчас в редакторе. Работают только пофайловые правила, поэтому ответ приходит быстро; сам запуск отложен на задержку. Результат замещает диагностики только этого буфера. - По сохранению. Сохранение любого
.xbslили.yamlзапускает в фонеxbsl <корень проекта> --format json. Если словарь перевода лежит вне корня, рядом запускаетсяxbsl <словарь>, и проектные правила словаря не видят. Запуск тоже отложен, и одновременно идёт не больше одной проверки: сохранение посреди проверки отменяет устаревшую и начинает заново. Результат покрывает и пофайловые, и проектные правила, поэтому замещает диагностики всех файлов, которые проверка прочитала. Буферы, к тому моменту снова несохранённые, до следующего сохранения остаются с картиной от--stdin. Модули, открытые вне корня проекта, тоже сохраняют свою картину: проверка их не читает.
Так не появляется ни дублей, ни потерянных правил. У сохранённого файла видна полная картина
проверки по всей папке, у редактируемого – мгновенная пофайловая, и каждое сохранение сводит
их вместе. Обе проверки отдают один JSON-контракт {diagnostics, summary} – тот же, что и
MCP-сервер линтера.
Фоновая проверка, которая упала или превысила xbsl.workspaceLintTimeout, попадает только в
панель вывода XBSL. Всплывающих окон на каждое сохранение нет.
Возможности
- Подсветка синтаксиса
.xbsl: ключевые слова (русские и английские формы), объявления, операторы,@-декораторы, числа, комментарии и строки с интерполяцией%имя/${...}. - Живые диагностики при наборе (с задержкой) и по сохранению. Сюда попадает всё, что
видит линтер: баланс скобок и блоков, неиспользуемые переменные, типографика, соглашения по
стилю. У подчёркивания есть идентификатор правила (например,
code/brackets) и важность. - Диагностики по всему проекту. Сохранение любого
.xbsl/.yamlзапускает линтер по всей рабочей папке в фоне, поэтому проектные правила (code/unknown-type,yaml/unknown-type, уникальностьИд) видны в редакторе сразу по всем файлам. Управляется настройкойxbsl.workspaceLint(включено по умолчанию). - Проверка всего проекта по требованию – команда XBSL: проверить весь проект.
- Переход к определению, поиск всех ссылок и автодополнение по проекту. Отвечает языковой сервер по своему индексу проекта. См. Навигация и автодополнение.
- Quick Fix для механических находок. Лампочка на исправимой диагностике (хвостовые
пробелы, типографские символы) применяет ровно ту правку, которую сообщил линтер. Действие
исправить все (
source.fixAll.xbsl) чинит весь файл и умеет запускаться по сохранению черезeditor.codeActionsOnSave. См. Quick Fix. - Деплой на стенд. Команда XBSL: деплой на стенд (elemctl) и кнопка-облачко в заголовке
дерева метаданных запускают
elemctl deployтерминальной задачей: сборка из исходников → загрузка → применение → перезапуск → проверка того, что сборка действительно применилась. См. Деплой на стенд. - Конструктор формы – панель из трёх областей: дерево структуры слева, данные формы справа, каркас формы под ними. Панель следует за активным редактором и обновляется при наборе. Выделение связано между областями, курсором в yaml и панелью свойств. Палитра компонентов стоит рядом с деревом метаданных, пока панель открыта. См. Конструктор формы.
- Обозреватель метаданных – дерево объектов проекта в основной боковой панели, по видам, с поддеревьями (реквизиты, измерения, формы, значения перечисления …). Есть редактируемая панель свойств, создание объектов, полей и подсистем, отбор по подсистемам и пакетам. См. Обозреватель метаданных.
- Документация – вид во вторичной боковой панели: справка 1С:Элемент как на сайте. Дерево “Содержание” (руководства разработчика и администратора, справочники типов, свойств и языка запросов), полнотекстовый поиск, просмотр страницы с картинками и ссылкой на первоисточник. Правый клик на типе или переменной открывает её документацию. См. Документация.
Раскладка панелей. Расширение объявляет два контейнера, и раскладка со снимка выше
получается сама. 1С:Элемент • Проект (дерево метаданных и палитра) встаёт в основную
боковую панель слева, 1С:Элемент • Инспектор (свойства и документация) – во вторичную
справа, рядом с чатом. Раскладка не закреплена: значок контейнера перетаскивается между
панелями, а команда Вид: сбросить расположение представлений возвращает умолчание.
Вторичная панель показывается и скрывается по Ctrl+Alt+B (Вид > Внешний вид >
Дополнительная боковая панель).
.yaml-описания элементов сохраняют встроенную подсветку YAML.
Требования
Расширение – тонкий клиент над CLI xbsl, проверку оно не встраивает. Нужны:
- Python 3.10+ и линтер:
pip install xbsl. Если линтер не найден, расширение предложит установку прямо из сообщения об ошибке. - Данные языка Элемента. Они генерируются один раз из вашего дистрибутива 1С:Элемент, см. шаг 1 README линтера. Без них большинство правил не работает; ошибку линтера расширение показывает один раз.
По умолчанию расширение зовёт xbsl из PATH. Перенаправить можно настройками
xbsl.linter.command (исполняемый файл) или xbsl.linter.pythonPath (интерпретатор – линтер
тогда запускается как <python> -m xbsl).
Движок и расширение ставятся по отдельности. При обновлении расширения обновляйте и движок
командой pip install -U xbsl.
Новый проект
Команда XBSL: новый проект 1С:Элемент (xbsl.project.new) заводит проект с нуля. Мастер
спрашивает четыре вещи: имя проекта, поставщика, вид проекта (приложение или библиотека) и
папку. Дальше он создаёт заготовку через тот же движок, что и остальные операции с
метаданными, и открывает готовый Проект.yaml.
Поставщик запоминается между запусками: у одного разработчика он обычно один и тот же. Если проект создан вне открытой папки, расширение предложит открыть его – свежий проект редко оказывается частью текущего окна.
Структурный поиск по формам
Команда XBSL: структурный поиск по формам (xbsl.forms.search) ищет не по тексту, а по
структуре. Задаётся тип компонента и, если нужно, условия по свойствам вида ключ=значение.
Расширение собирает формы проекта вместе с несохранёнными буферами, отдаёт их движку и
показывает совпадения списком. Выбор перемещает курсор на строку компонента в его yaml.
Поиск нужен, когда вопрос звучит как “где у нас поля ввода с таким-то свойством”. Текстовым поиском такое не находится: в yaml свойство и тип компонента лежат на разных строках.
Требует режима LSP: подбор совпадений выполняет движок, а в режиме CLI он не запущен.
Навигация и автодополнение
Навигацию даёт движок. Индекс проекта держит языковой сервер, он же отвечает на переход к определению, поиск ссылок, автодополнение и подсказки. Второй реализации у расширения нет, поэтому навигация знает ровно то же, что движок: типы возврата проектных методов, члены платформенных типов. Без режима LSP навигации нет – в режиме CLI спрашивать некого.
Переход к определению (F12 / Ctrl+клик), в .xbsl и .yaml:
- имя объекта проекта (голое или корень точечной цепочки) → его
.yaml; Объект.ЛокальныйТип→ объявление типа;Объект.ТабличнаяЧасть→ секция в yaml объекта;Перечисление.Значение→ строка значения;Модуль.Метод(включая модули менеджера, названные по объекту) и голое имя метода внутри своего модуля → метод;Компоненты.Имя→ узел компонента в yaml текущей формы;Компоненты.Имя.Метод→ метод модуля этой формы;- в yaml значение
Обработчик: Имя→ обработчик в парном.xbsl.
Найти все ссылки (Shift+F12 или Перейти к ссылкам / Найти все ссылки в контекстном меню), для методов, объектов и компонентов интерфейса – все использования по тому же индексу:
- метод → его вызовы внутри модуля,
Модуль.МетодиКомпоненты.Модуль.Метод, а также обработчикиОбработчик: Имяв yaml; - объект → все места, где он корень точечной цепочки;
- компонент → его обращения
Компоненты.Имяв модуле формы.
Поиск ссылок идёт по индексу имён, а не по типам, поэтому цепочку он не разбирает. Переход к определению устроен так же.
Автодополнение (по . и :, а в строке /// – по @ и /):
- после
Объект.– семейство типов (Ссылка,Объект, …), табличные части, локальные типы и методы модуля менеджера; для перечисления – его значения; - после
Компоненты.– компоненты текущей формы; послеКомпоненты.X.– методы модуляX; - в yaml после
Тип:– имена объектов проекта (вид объекта показан в подсказке).
Дополнение по типам работает только в режиме LSP. Разбор идёт
по токенам, поэтому ключевые слова понимаются в обеих формах – пер/var, новый/new:
- внутри
Запрос{ ... }после таблицы – её поля: стандартные поля вида, реквизиты и табличные части. Таблица узнаётся и по алиасу:ИЗ Акция КАК А→ послеА.те же поля; - после переменной цикла по результату запроса (
для С из Результат→С.) – колонки выборки (алиасыВЫБРАТЬ ... КАК; у поля без алиаса именем становится последний сегмент); - после переменной известного типа (
пер Список = новый Массив<Строка>()→Список.) – члены этого типа. Тип берётся из аннотации, изновый, из литерала (знч Ключ = ""– этоСтрока) или из вызова: и через модуль (Модуль.Метод()), и без квалификатора – вызов метода того же модуля. Годятся и параметры метода; - после значения проектного типа – его поля и методы: структура модуля, тип, описанный в
метаданных, компонент интерфейса (у формы – её
Свойства, методы её модуля и члены платформенного типа изНаследует); - внутри
новый Тип(– имена того, что тип несёт: подстановка сразу пишетИмя =; - после типа или глобали stdlib (
КонтекстДоступа.) – её члены. Свойства и методы показаны раздельно: у метода свой значок, и вставляется он со скобками.
Цепочка проходится до конца, а не на один уровень: Разбор.Файл!.Прочитать(). отвечает членами
результата, настойчивая операция цепочку не обрывает. Переменная цикла берёт элемент из
записанного типа коллекции (Массив<Каталог.Карточка> → Каталог.Карточка), в том числе когда
коллекция пришла из вызова.
Члены типов stdlib берутся из данных Элемента (каталог --data-dir), остальное – из индекса
проекта. Имя в области видимости сильнее одноимённого типа: если объявлена переменная Список,
то Список. – это про её тип, а не про компонент Список.
Документирующие комментарии. Метод, описанный строками ///, читается в редакторе так же,
как в среде разработки:
- подсказка при наведении на метод проекта показывает описание и раздел для каждого вида тегов – “Параметры”, “Возвращает”, “Выбрасывает”, “Смотреть также”; параметры и исключения идут списком Имя - текст;
- справка по сигнатуре при вызове метода проекта (по
(и,) показывает сигнатуру, а для аргумента, который сейчас пишется, – текст его тега@параметр; - в строке
///по@предлагаются теги на языке модуля; после@параметр– параметры метода ниже, которые блок еще не описал; в единственной строке блока или в пустой строке прямо над объявлением – блок, который пишет шаблон самой среды: описание, строка на каждый параметр, результат; - слово тега и имя после него подсвечиваются так, как подсвечивается тег JSDoc.
Правила comment/doc-tag-* сверяют теги с сигнатурой и с тем, что покажет среда разработки.
Известные пределы. Вне режима LSP индекс знает объявления, а не типы, поэтому дополнения после
переменных нет. Тип не выводится там, где его неоткуда взять: у обобщённого метода платформы,
где результат задаётся аргументом-типом; у выражения с операциями ("а" + Х – это операция, а
не литерал); у имени, которого нет в каталоге платформы. Члены платформенных типов
подсказываются русскими написаниями и в проекте на английском, потому что английской пары в
каталоге у них нет. Переименования нет. В неоднозначном контексте подсказка не появляется
вовсе.
Quick Fix
Находки, которые линтер чинит механически, несут правку, и расширение превращает её в Quick Fix:
-
Лампочка на диагностике (
Ctrl+.) – Исправить:<правило>– применяет точную правку: снятые хвостовые пробелы, длинное тире → среднее,…→..., кудрявые кавычки → прямые. -
Действие “исправить все” – Исправить все (xbsl) – чинит все исправимые находки файла одной правкой. Чтобы запускать его по сохранению, добавьте в настройки:
"editor.codeActionsOnSave": { "source.fixAll.xbsl": "explicit" }
Движок передаёт правки в JSON. Предлагаются только
однозначные правки и только к тому тексту, на котором они были вычислены: снимок с версией
защищает от применения смещения к изменившемуся тексту. Правки всего файла (смешанные переводы
строк) остаются за xbsl --fix в командной строке.
У находки, чинить которую надо в другом файле, своя лампочка. Правило
conventions/missing-translation предлагает записать слово в словарь проекта –
см. Словарь перевода.
Настройки
| Настройка | По умолчанию | Значение |
|---|---|---|
xbsl.linter.run |
onType |
Когда проверять: onType (с задержкой) / onSave / off. |
xbsl.linter.command |
xbsl |
Исполняемый файл линтера (PATH или абсолютный путь). |
xbsl.linter.pythonPath |
– | Интерпретатор Python; если задан, запуск <python> -m xbsl. |
xbsl.linter.dataDir |
– | Корень данных Элемента (папка с index.json); пусто = автопоиск. |
xbsl.linter.lang |
авто | Язык диагностик: (авто) / ru / en. |
xbsl.linter.asCi |
false |
Судить тем же набором правил, что и задача CI проекта. Ключи --select/--ignore/--enable и список принятых замечаний берутся из команды xbsl в файле конвейера – .gitlab-ci.yml или рабочий процесс GitHub рядом с проектом. Без этого панель “Проблемы” судит набором по умолчанию, а merge request – другим. Файла конвейера нет – остаётся набор настроек, причина пишется в канал вывода XBSL. Строка состояния говорит, что из двух случилось: CI: <задача>, пока действует набор задачи, и предупреждение, когда он не взят. По нажатию открывается файл конвейера, в котором стоит задача. |
xbsl.linter.asCiJob |
– | Какую задачу этого файла брать. Конвейер запускает линтер дважды, как только проект проверяет второе дерево (перевод), и судят эти задачи разными наборами. Имя можно назвать частью, пока подходит одна задача; заполненное значение включает xbsl.linter.asCi. |
xbsl.rules |
{} |
Единая таблица правил. Ключ – правило (code/brackets), группа (style), буква тира (A) или *; значение – off или уровень. Приоритет: правило → группа → тир → *. Уровень, заданный самому правилу, включает выключенное по умолчанию; у группы и тира он только красит; {"*": "off"} – “только перечисленные”. См. Правила. |
xbsl.linter.debounce |
300 |
Задержка (мс) перед проверкой при наборе. |
xbsl.projectRoot |
– | Корень исходников для проверок по проекту и для индекса навигации, относительно рабочей папки (или абсолютный). Пусто – вся папка. Задайте, если рядом с проектом лежат примеры или копии: иначе проектные правила (уникальность Ид и другие) стреляют между каталогами. |
xbsl.baseline |
– | Файл со списком принятых замечаний, относительно рабочей папки (или абсолютный). Пусто – .xbsllint-baseline в рабочей папке, если он существует. См. Исключение находки. |
xbsl.workspaceLint |
true |
Полная проверка рабочей папки при каждом сохранении .xbsl/.yaml. |
xbsl.workspaceLintTimeout |
60000 |
Прервать фоновую проверку через столько мс (0 – без предела). |
xbsl.checkForUpdates |
true |
Раз в сутки спрашивать Open VSX, не опубликовано ли расширение свежее. Расширение ставится из vsix, а редактор ходит за обновлениями в Marketplace, поэтому отставшую версию иначе не замечает никто. Проверка только подсвечивает строку состояния; команда “Проверить, вышло ли новое расширение” работает независимо от неё. |
xbsl.deploy.* |
– | Настройки деплоя: исполняемый файл elemctl, .env, целевое приложение. См. Деплой на стенд; путь к elemctl и идентификатор приложения общие с отладкой. |
xbsl.debug.* |
– | Отладка: каталог адаптера платформы, исполняемый файл Java, открытие приложения при старте. См. Отладка. |
В режиме LSP yaml-файлы выбираются относительно вычисленного корня проекта. Относительный корень разрешается от первой папки рабочей области. На Windows регистр пути корня не учитывается, на Linux используется чувствительное к регистру сопоставление VS Code.
Правила: уровни и отключение
Старые настройки (xbsl.groups.*, linter.select / .enable / .ignore) код читает
по-прежнему, но в формах их больше нет. Перенести их в таблицу разом – команда
XBSL: перенести настройки правил в одну таблицу.
Таблицу не обязательно править руками. Команда XBSL: правила открывает панель: все правила
движка списком по группам, у каждого свой уровень или “по умолчанию”, поиск по имени, фильтр
“только изменённые” и кнопка сброса. Область записи выбирается явно – настройки пользователя
или рабочей области. Пишет панель ровно в xbsl.rules, второй модели настроек нет.
По группам – в UI настроек. Секция “Группы правил” (наберите xbsl.groups в поиске
настроек или пройдите Расширения → XBSL) даёт выпадающий список на каждый тип находок: код,
описания yaml, стиль, типографика, пробелы, кодировка, структура, формы, запросы, именование,
проект, безопасность. Из списка выбирают одно из трёх: оставить собственные уровни правил
группы, показывать все её находки одним уровнем (error / warning / info / hint) либо выключить
группу целиком. Значение off не просто прячет находки, а исключает правила из проверки.
По отдельным правилам – с находки. У каждой находки в лампочке (Ctrl+.) есть действие
“Настроить правило…”: отключить правило или переопределить его уровень, не уходя со
строки. Проверка тут же перезапускается. Выбор сохраняется в настройку xbsl.rules – словарь
из идентификатора правила (whitespace/trailing) или целой группы (style) в уровень или
off. Точный идентификатор сильнее группы, а любой ключ xbsl.rules сильнее выпадающих
списков групп. Работает и в режиме CLI, и в режиме LSP.
У группы правил, добавленной надстройкой движка, своего выпадающего списка нет – списки
перечисляют встроенные группы движка. Такая группа настраивается через xbsl.rules по своему
имени ({"conventions": "off"}) либо действием “Настроить правило…” на любой её находке. Оба
пути работают с группой надстройки точно так же, как со встроенной.
Исключение находки (список принятых)
Отключение правила глушит его везде. Иногда же исправлять нужно не всё: одна находка законна,
код правильный намеренно. Для этого у каждой находки в лампочке (Ctrl+.) есть действие
“Исключить эту находку (в список принятых): <правило>”. Введите причину, и находка вместе с
причиной попадёт в файл принятых замечаний – по её приметам, то есть по файлу, правилу и
тексту сообщения. Исключается только она одна: правило продолжает проверять остальные файлы и
имена. Чтобы выключить правило целиком, есть действие “Настроить правило…”. Находка исчезает
из редактора, и проверка CI по тому же файлу (xbsl ... --baseline) перестаёт её показывать.
Файл – .xbsllint-baseline в рабочей папке (создаётся при первом исключении) либо тот, на
который указывает xbsl.baseline. Причина хранится рядом с замороженной находкой, и
xbsl --write-baseline сохраняет её при перезаписи:
"acme/site/Основное/Заметки.yaml": {
"naming/number": {
"Имя 'Заметки' в единственном числе – ...": { "count": 1, "reason": "историческое имя" }
}
}
В режиме LSP список принятых применяет сервер, в режиме CLI – ключ --baseline.
В приметы находки входит текст сообщения,
поэтому файл принятых привязан к языку вывода: записывайте и проверяйте под одним
xbsl.linter.lang.
LSP-режим (по умолчанию)
Расширение работает через долгоживущий сервер xbsl-lsp и не запускает CLI на каждое событие.
Данные языка Элемента и индекс проекта живут в памяти, поэтому диагностика при наборе отвечает
за миллисекунды. Появляется hover – карточка объекта проекта, метода или компонента формы
при наведении – и дополнение по типам. Переход к определению,
проектная диагностика по сохранению и quick fix работают как раньше, только быстрее. Нужен
линтер с extra [lsp] (pip install "xbsl[lsp]"). Сервер ищется как xbsl-lsp в PATH,
через xbsl.linter.pythonPath (запуск модулем) или явной командой xbsl.lsp.command.
Если сервера нет, расширение молча продолжает в прежнем режиме CLI. Подробности пишутся в
панель вывода XBSL, а действующий режим виден в строке состояния. Выключить сервер совсем –
"xbsl.lsp.enabled": false; смена настройки требует перезагрузки окна.
Шаблоны кода
Команда XBSL: шаблоны кода (xbsl.templates.manage) открывает панель управления набором.
Это аналог диалога Параметры – Шаблоны в 1С:EDT: слева список, справа редактор, кнопки
добавить, изменить, удалить, импортировать и выгрузить.
Набор состоит из двух частей. Встроенные шаблоны идут с инструментом, пользовательские лежат в
файле .xbsl-templates.json в корне рабочей папки – путь меняется настройкой
xbsl.templates.file. Пользовательский набор дополняет встроенный, а шаблон с тем же именем
замещает встроенный: так правится поведение по умолчанию, ничего не ломая.
Формат файла – тот же, что у выгрузки шаблонов 1С:EDT, поэтому набор переносится между средой и редактором в обе стороны:
- XBSL: импорт шаблонов кода (
xbsl.templates.import) – влить выгрузку EDT в свой файл; - XBSL: экспорт шаблонов кода (
xbsl.templates.export) – выгрузить набор в файл того же формата.
Панель не пишет файлы сама: и чтение, и запись идут через xbsl templates – тот же механизм,
что у консольной команды. Поэтому набор одинаков в обоих режимах расширения, а из оболочки с
ним можно работать теми же средствами (xbsl templates list / export / import).
Подстановка шаблонов при наборе работает в режиме LSP. В режиме CLI панель и обмен файлами доступны, а автодополнения по шаблонам нет.
Словарь перевода
Проект, который переводит исходники на английские написания (xbsl translate), держит свои
имена, строки комментариев и строковые литералы в словаре. Словарь – это каталог
xbsl-translation рядом с проектом или выше: несколько файлов yaml, тысячи записей. Команда
XBSL: словарь перевода (xbsl.translate.dictionary) открывает его таблицей из пяти колонок:
Вид, Ключ / Перевод, Вхождений, Где встречается, Файл словаря. Каждая
запись растянута на две строки: сверху ключ и остальное содержимое строки, под ним во всю
ширину – само поле перевода. Места нужно много: там стоит настоящее имя или целая строка
комментария. Названия колонок служат ручками сортировки, кроме “Вида” – это просто подпись,
хотя ширину и у него можно тянуть. Граница между колонками тянется мышью, ширины запоминаются
между открытиями панели, а двойной клик по границе сбрасывает одну эту колонку к умолчанию.
- Поле перевода редактируется. Введённое пишет движок (
xbsl translate --set) – в нужный файл и с нужной областью; очищенное поле удаляет запись. При отказе панель показывает сообщение движка и оставляет таблицу как была. - Литерал пишется так, как он стоит в исходнике – текст между кавычками, кавычка внутри как
\", обратный слеш как\\. Значение возвращается между двумя кавычками модуля, поэтому движок проверяет, что оно вообще может там стоять, и отвергает всё, что закрыло бы литерал раньше времени. Отказ показывается вместе с причиной, а поле остаётся с прежним значением. - Два отбора: строка поиска по ключам и переводам и только незаполненные – то, что словарь ещё не покрывает. Переключатель рядом сужает таблицу до имён, до строк комментариев или до литералов.
- Предложение стоит серым прямо внутри пустого поля, как его собственная подсказка. Это
платформенное написание, если движок его предлагает, иначе догадка сервиса машинного перевода
(см. ниже). Галочка справа принимает предложение – щелчком или клавишей
Enter, пока поле ещё пустое. Стоит начать печатать – подсказка пропадает, как и положено подсказке поля. У литерала такая подсказка бывает, только когда его текст заполнился локально из уже принятого имени (см. ниже): таблицы платформы называют имена, а не целое сообщение между кавычками. - Место – ссылка: открывает файл исходника на этой строке. Файл словаря рядом – нет: там короткое имя, полный путь во всплывающей подсказке, щёлкать не по чему.
- Строка над таблицей считает строки, незаполненные среди них и покрытие проекта. Это то самое
число, которое отдаёт
xbsl translateи по которому CI останавливает сборку. Литералы посчитаны рядом, как их считает движок: в покрытие они не входят, иначе проект читал бы 100% с кириллическими сообщениями внутри. - Длинный литерал не рвёт строку таблицы. В настоящем проекте литерал бывает в сотни символов; ячейка ключа обрезается до четырёх строк, а целиком текст показывает всплывающая подсказка.
Панель не пишет словарь сама: чтение – это xbsl translate --entries и --gaps, запись –
--set. Устройство словаря – в какой файл попадёт новая запись, области, ключи ресурсов –
остаётся делом движка, поэтому панель и консольная команда не могут разойтись.
Перевод прямо на находке
Правило conventions/missing-translation (по умолчанию выключено – включается в таблице правил)
показывает каждое непокрытое имя, каждую строку комментария и каждый строковый литерал там, где
они стоят. Его лампочка (Ctrl+.) предлагает:
- Перевести как “<написание>” – платформенная подсказка, запись в один щелчок. Действие появляется, только когда подсказка есть, поэтому у литерала его не бывает;
- Перевести “<ключ>”… – спрашивает слово, подставив в поле ту же подсказку; у литерала подсказка поля объясняет, как текст пишется между кавычками;
- Открыть словарь переводов – панель выше, отобранная по этому ключу.
Находка несёт точный ключ словаря и его вид в своих данных. Поэтому починка не угадывает ни того, ни другого по тексту сообщения – ни для имени, ни для строки комментария, которая в сообщении урезана, ни для литерала. После записи проект проверяется заново: сервер сам перечитывает словарь, перезапуск не нужен, и находка уходит.
Предложения машинного перевода
Рядом с именем или строкой комментария, которых словарь ещё не покрывает, стоит кнопка
“Запросить машинный перевод”. Она просит внешний сервис (Yandex Translate или Google Translate)
заполнить, что получится. Догадка появляется там же, где всегда стояло платформенное написание,
– серым внутри пустого поля перевода. Щелчок по галочке или Enter записывает её ровно так же,
как ручную правку поля; до этого ничего не меняется. Литерал сервису не отправляется никогда:
он заполняется локально и только тогда, когда его текст целиком совпадает с уже принятым
именем. Одно нажатие обходит весь проект. Ограничить обход нечем и остановить на полпути
нельзя, а каждая отправленная порция это платный запрос к сервису.
Отчёт остаётся на экране. Сколько ответов пришло из кэша, сколько запрошено, сколько сервис отклонил – те же три числа, что на пять секунд появляются строкой состояния, – стоят и в сводке самой панели. Держатся они там до следующего запуска, а не только до исчезновения сообщения. Наведение на эту строку называет причину каждого отказа. Когда спрашивать было решительно не о чем, строка говорит об этом словами, а не тремя нулями; когда все предложения дали локальные совпадения литералов и сервис не спрашивали вовсе, сказано и это.
Ключ задаётся командой “XBSL: Задать ключ машинного перевода” (xbsl.translate.setKey). Она
спрашивает, какой из трёх завести – ключ Yandex, каталог Yandex или ключ Google – и кладёт
значение в SecretStorage, никогда в настройку и никогда в командную строку движка. Если
настроено больше одного сервиса, какой из них использует --suggest, решает настройка
xbsl.translation.provider.
Палитра кода
Команда XBSL: палитра кода (xbsl.choosePalette) перекрашивает синтаксис XBSL одной из
популярных палитр: стиль веб-среды 1С:Элемент (красные ключевые слова, синие строки), One Dark,
Monokai, Dracula, GitHub Dark. Она же возвращает цвета активной темы редактора. Выбор
применяется правилами editor.tokenColorCustomizations, адресованными только областям *.xbsl,
поэтому глобальная тема и другие языки не затрагиваются. Расширение управляет только своими
правилами (префикс xbsl-palette) и сохраняет ваши собственные настройки.
Конструктор формы
Команда XBSL: конструктор формы (xbsl.previewForm, она же кнопка в заголовке редактора у
yaml форм – файлов с КомпонентИнтерфейса) открывает панель формы. Форма зависит от
собственных свойств, поэтому её структура и данные правятся там же, где она показана: слева
дерево структуры, справа данные, под ними каркас формы. Между областями – перетаскиваемые
разделители, их положение запоминается.
Панель – на каждую форму. Вторая форма открывается своей вкладкой рядом с первой; у каждой
панели своё дерево, выделение и память раскрытия. Панель и её yaml связаны: выбор вкладки с
одной стороны выводит вперёд другую, а закрытие панели закрывает yaml формы (несохранённый
остаётся). Клавиши работают в самой панели: стрелки по дереву, Alt+Вверх/Alt+Вниз, F2,
Delete, Ctrl+C/Ctrl+V и Ctrl+Z/Ctrl+Y.
Структура – дерево слотов и компонентов с иконкой по виду и метками линтера. Контекстное
меню и клавиши: Alt+Вверх/Alt+Вниз двигают компонент, F2 переименовывает, Delete
удаляет, Ctrl+C/Ctrl+V переносят фрагмент yaml. Есть оборачивание в контейнер, дублирование,
фокус на поддереве и фильтр именованных. Узел перетаскивается на другой узел: контейнер
принимает вложением, лист – следом за собой.
Данные – собственные Свойства: компонента и реквизиты объекта-владельца. Двойной клик или
перетаскивание записи на узел структуры создаёт компонент ввода с готовой привязкой (Булево
–> флажок, иначе поле ввода с Значение: =...).
Каркас формы рисует по yaml вложенные вертикальные и горизонтальные группы, надписи, поля ввода
с подписями и привязками =..., кнопки (основная залита), флажки и переключатели в том виде, в
каком их рисует платформа, таблицы с настоящими колонками, переключаемые вкладки (Страницы),
карточки, заглушки картинок и HTML-контейнеров, панель команд формы. Неизвестные и собственные типы
компонентов рисуются рамкой с подписью типа и содержимым внутри, так что ничего не пропадает. В
шапке области – масштаб (−/+, колесо над регулятором и Ctrl+колесо над каркасом) и переключатель
темы: светлая (вид веб-клиента платформы, по умолчанию), тёмная или тема редактора. Выбор
запоминается.
Выделение общее для трёх областей. Клик по блоку каркаса и движение курсора в yaml
раскрывают свёрнутые группы по пути к узлу, встают на него в структуре и наполняют панель
“Свойства”. Выбранный узел светится полным цветом выделения независимо от того, где сейчас
фокус. Обратный ход следует только за уже открытым yaml и сам по себе закрытый не открывает:
клик по узлу структуры или по блоку каркаса переводит туда курсор, не забирая фокус. Открывает
закрытый yaml только явная просьба – двойной клик по узлу структуры или Ctrl+клик по блоку
каркаса. Тогда он встаёт рядом с панелью, никогда в её собственной колонке, поэтому не может
оказаться позади формы, которой принадлежит.
Палитра компонентов стоит рядом с деревом метаданных и появляется, пока панель формы открыта. Двойной клик по компоненту палитры вставляет его в выделенный узел структуры. Перетащить из палитры в панель нельзя: платформа не переносит перетаскивание из своего дерева в webview. Поэтому вставка сделана кликом.
Панель свойств. Клик по элементу выделяет его и открывает отдельную панель “Свойства” –
самостоятельную вкладку, которую можно перетащить вниз или в сторону. Устроена она как в
веб-редакторе платформы: перечисления выпадающими списками (Компоновка, выравнивания,
интервалы, ширина, вид кнопки), Растягивать* – переключателем Авто / Истина / Ложь, остальное
текстом. Показывается стандартный набор компонента плюс все свойства из yaml; значения-объекты
только для чтения. Правки применяются к yaml-документу точечными заменами, поэтому обычный undo
работает; пустое значение или (авто) снимает свойство. Выбор элемента и каждая правка
позиционируют yaml-редактор на затронутой строке, не забирая фокус. Ctrl+клик или кнопка
Показать в yaml переводят в редактор – это удобно в больших формах.
Типизированные редакторы значений. Свойство-цвет открывает нативный пикер и образцы цветов,
уже использованных в форме, плюс недавние: клик переиспользует оттенок. У любого однострочного
значения есть переключатель “литерал / привязка”. Нажмите =, чтобы привязать свойство к
данным: в режиме привязки автодополнение предлагает привязки, уже встречающиеся в форме, и
реквизиты объекта-владельца формы (=Объект.Наименование). Кнопка abc возвращает к литералу.
Это каркас, а не рендер платформы. Компоновка, вложенность и подписи передаются точно, размеры и стили – приблизительно; явные цвет и размер шрифта надписей применяются.
Пресеты блоков. В области структуры команда Сохранить как пресет блока на компоненте сохраняет всё его поддерево под именем и держит его между формами и сеансами. Вставить пресет блока (в шапке палитры или в меню узла) вставляет сохранённое в текущее выделение. Это именованный постоянный вариант копирования и вставки для компоновок, которые приходится пересобирать часто. Управление пресетами блоков чистит список.
Массовая правка. Выделите в области структуры несколько компонентов и выберите Править выделенные вместе. Одно свойство задаётся или снимается сразу у всех: выберите ключ из уже используемых или введите новый, затем значение; пустое снимает свойство. Так за один шаг выравнивают ширины, переключают видимость или перепривязывают группу полей.
Обозреватель метаданных
Кнопка сворачивания в заголовке дерева (Свернуть до видов метаданных) останавливается на
первом уровне: список видов остаётся виден, а раскрытые классы схлопываются. Остальные команды –
создание проекта, группировка, отбор, обновление, скрытие пустых классов – лежат в меню ... того
же заголовка.
Отдельная иконка 1С:Элемент на панели действий (Activity Bar) открывает дерево метаданных проекта – по образу конфигуратора платформы, но внутри VS Code.
Экспериментально. Обозреватель метаданных – экспериментальная функция, возможны ошибки и неудобства.
Дерево. Корень – проект (Проект.yaml), серым рядом Поставщик\Имя; правый клик открывает
модуль приложения (Проект.xbsl). Ниже – ветка Подсистемы и категории по виду (ВидЭлемента):
справочники, документы, регистры сведений/накопления, перечисления, общие модули, HTTP-сервисы,
структуры, клиентские события и т.д. – каждая со своей иконкой. Пара Имя.yaml + Имя.xbsl
показана одной строкой; форма объекта/списка вложена под свой объект-владелец, формы без
владельца – в раздел Общие формы.
Поддеревья объектов. Справочник и документ раскрываются в Реквизиты, Табличные части,
Формы; регистр – в Измерения, Ресурсы, Реквизиты; перечисление, структура и
параметры работы клиента показывают значения, поля и параметры прямо под элементом, а + стоит в
его строке: других разделов у них нет; HTTP-сервис – в Шаблоны URL с их методами; локализованные строки – в Локализацию: узел на каждый язык раздела
(Локализация/<язык>/<Имя>.yaml), клик открывает переведённый текст. У клиента SOAP-сервиса – узел
WSDL с описанием, из которого платформа порождает его тип (<Имя>.Wsdl.1.wsdl рядом с
элементом): щелчок открывает файл как XML, у нескольких описаний – по узлу на файл, то же делает
“Открыть WSDL” в контекстном меню клиента. У SOAP-сервиса такого узла нет – его WSDL платформа
строит сама по элементу. Импортированные схемы XML (<Имя>.Wsdl.<N>.xsd)
показаны в том же узле и открываются как XML.
Дерево показывает собственные счетчики ошибок и предупреждений всех файлов объекта,
включая модули и запросы, и итоги пакетов, подсистем и проектов. Они работают и при
выключенной problems.decorations.enabled; отметки Git сохраняются.
Панель свойств начинается с раздела документирующего комментария, если у выбранного узла есть такое место. Введите Markdown, используйте кнопки оформления и предпросмотр, затем сохраните его в текущий буфер YAML. Обычная отмена редактора остается доступной. HTML показывается текстом, небезопасные ссылки неактивны. Если исходный комментарий успел измениться, сохранение откажет и оставит черновик в панели. Раздел сворачивается, как группы свойств: пока комментария нет, он свернут, а когда комментарий задан, раскрыт; свернутый или раскрытый вручную раздел таким и остается для этого узла.
Клики. Объект или поле открывает панель свойств справа. Тип поля там – комбобокс из
примитивов, ссылок <Объект>.Ссылка? и перечислений проекта, а значение можно и ввести вручную.
Общий модуль открывает свой .xbsl, форма – конструктор. Правый клик добавляет Свойства,
открыть описание / модуль / модуль объекта.
Модули. Контекстное меню объекта открывает каждый его модуль и создает недостающие:
Создать модуль (xbsl), Создать модуль объекта (.Объект.xbsl), а у регистра и набора
констант – модули записи, набора записей и ключа записи. Пункты зависят от вида, как у
+ рядом с элементом в представлении проекта среды разработки: у справочника есть модуль
и модуль объекта, у регистра – модули типов записей, у общего модуля и формы – только свой
модуль, а у виртуальной таблицы, события журнала событий, локализованных строк и
навигационной команды модулей нет. Новый модуль – пустой файл рядом с описанием, названный
на языке описания (Name.Object.xbsl в проекте на английском), и он сразу открывается.
Табличная часть справочника и документа так же предлагает модуль своей строки:
Создать модуль строки (Объект.ТабличнаяЧасть.xbsl) создает пустой
Имя.ТабличнаяЧасть.xbsl рядом с описанием, и реквизиты строки в нем доступны по имени.
Панель свойств – та же, что у конструктора формы. Скалярные свойства правятся на месте:
выпадающие списки для ОбластьВидимости / Окружение, переключатель Истина / Ложь, остальное
текстом. Ид и ВидЭлемента – только для чтения; коллекции (реквизиты и прочее) правятся в
дереве. Правки точечные, обычный undo работает; сохраните файл (Ctrl+S), чтобы дерево
обновилось.
Секция “Все свойства” показывает и то, чего в файле ещё нет, – не только у самого объекта, но
и у элемента любой его коллекции: реквизита, измерения, ресурса, поля структуры, реквизита
табличной части, значения перечисления, параметра. Класс элемента называет сама метамодель, а где
элементы разнотипные – выбирает его по имени: встроенные Код, Наименование и Владелец
справочника имеют собственные классы, поэтому и наборы свойств у них свои.
Составные (вложенные) свойства – например ВыравниваниеСодержимогоПоГоризонтали { ... } –
показаны, но не редактируются: правьте их прямо в yaml.
Создание объектов. В корне категории – действие “Добавить <класс>”: спрашивает имя и
папку – подсистему, её пакет или корень проекта (категория под подсистемой или пакетом берёт свою
папку без вопроса), пишет минимальный валидный yaml (свежий Ид; парный .xbsl у модульных видов)
и открывает его. Классы показаны, даже когда их в проекте ещё нет. Доступны все классы, которые
умеет создавать движок:
| Классы | |
|---|---|
| Данные | справочник, документ, перечисление, регистр сведений, регистр накопления, виртуальная таблица, набор констант, структура, хранимая структура, план обмена |
| Код и сервисы | общий модуль, HTTP-сервис, SOAP-сервис, контракт сервиса, контракт типа, контракт сущности, обработка, запланированное задание, событие журнала |
| Интерфейс | общая форма, фрагмент командного интерфейса, обычная команда, навигационная команда, переключаемая команда, команда с компонентом, клиентское событие, параметры работы клиента, цветовая схема отчёта |
| Права и настройки | ключ доступа, право на действие, право на элемент, хранилище настроек, параметр самостоятельной регистрации, локализованные строки |
В группах поддерева кнопка “+” добавляет реквизит / измерение / ресурс / значение / параметр /
поле / табличную часть (и реквизит табличной части). У справочника и документа есть
“Добавить форму объекта”: движок генерирует форму с наполнением по реквизитам, по выбору –
сразу и форму списка с колонками, и регистрирует её в Интерфейс.
У формы, подчиненной объекту или общей, и у любого другого компонента интерфейса в контекстном
меню есть “Добавить свойство…” и “Добавить событие…”. Первый пункт спрашивает имя и
тип: примитивный, ссылку или перечисление проекта либо тип, введенный вручную. Второй спрашивает
имя и тип объекта события – СобытиеКомпонента или СобытиеСДанными<...>. Движок записывает
элемент в Свойства или События компонента, а недостающую секцию ставит туда, где ее держит
конструктор: Свойства перед События, События сразу после Свойства. Затем yaml
открывается на новом элементе.
Шаблоны и правки yaml считает движок (xbsl 0.16+). Те же операции доступны агентам через его
MCP-инструменты meta_* и любому редактору через LSP-запросы xbsl/meta* или подкоманды CLI.
Дерево лишь собирает параметры и применяет присланные изменения, обычный undo работает.
Подсистемы и пакеты. Ветка Подсистемы перечисляет подсистемы проекта – каталоги первого
уровня, с Подсистема.yaml или без него (клик открывает файл, если он есть), – а подсистема с
пакетами раскрывается в них, вложенные под родителем. “Добавить подсистему” на этой ветке или на
корне проекта создаёт в корне проекта папку с Подсистема.yaml. В группировке “По подсистемам”
под подсистемой – её пакеты и объекты её корня по классам. Узел пакета в обоих местах один и тот же:
каталог внутри подсистемы, число объектов серым, полное пространство имён в подсказке. Размещение
отдаёт движок (xbsl/metaProjectInfo): дерево рисуется сразу и дорисовывается, когда пришёл ответ.
“Создать пакет” на подсистеме или пакете спрашивает имя и первый объект пакета: каталог без
объектов пакетом не считается. “Перенести в пакет…” на объекте или перетаскивание объекта на
подсистему или пакет переносит его командой движка move-object: импорты и полные имена, которым
нужен перенос, обновляются по всему проекту. “Переименовать пакет” переименовывает каталог и все
имена, которые его называют.
Отбор по подсистемам и пакетам. Кнопка отбора в заголовке дерева – а также меню ..., корень
проекта и ветка Подсистемы – открывает форму с деревом флажков: подсистемы, их пакеты с
вложенностью и число объектов у каждого узла. Флажок подсистемы ставит флажки всем её пакетам. Если
отмечена только часть пакетов, флажок подсистемы показывается частично, и в дереве остаются только
отмеченные пакеты; так же сужается ветка Подсистемы, и числа в ней считают прошедшие отбор
объекты. Когда у подсистемы или пакета есть и свои объекты, и пакеты, свои объекты отмечаются
отдельным пунктом “Объекты вне пакетов”. Ничего не отмечено – отбора нет. Пока отбор включён,
кнопка в заголовке закрашена, подпись проекта серым перечисляет отбор, а рядом с именем проекта
стоит “Сбросить отбор по подсистемам и пакетам”. Отбор хранится для каждого проекта и переживает
перезагрузку окна. Пакет, переименованный командой “Переименовать пакет”, остаётся в нём под
новым именем, удалённый из него выпадает. Подсистема, добавленная при включённом отборе, не видна,
пока её не отметят. Пакеты сообщает движок (xbsl/metaProjectInfo); пока он не ответил, форма
показывает только подсистемы. Отобрать можно и одним щелчком. “Отобрать по подсистеме” или
“Отобрать по пакету” в строке узла оставляет в дереве ровно это место, пакет вместе с
вложенными, а закрашенная кнопка того же узла снимает отбор. Кнопка есть в ветке Подсистемы и в
группировке “По подсистемам”.
Ресурсы и их папки. Раздел Ресурсы показывает файлы каталога Ресурсы папками с
вложенностью, значком папки и числом файлов серым; у файла подписано имя и стоит значок его типа, а
подсказка даёт его ключ – так он пишется в ссылке Ресурс{...}. Щелчок открывает файл, svg – в
предпросмотре, который следует теме редактора. Описание каталога Ресурсы.yaml среди файлов не
показывается: его открывает щелчок по узлу каталога. “Создать папку” на разделе или на папке
спрашивает имя и сразу ведёт к первым файлам, потому что пустая папка не хранится: в неё переносятся
ресурсы того же каталога или добавляются файлы с диска. “Добавить файлы ресурсов…” копирует
выбранные файлы в папку. “Переместить в папку…” на файле или папке либо перетаскивание на
папку раздела переносит ресурс командой движка move-resource, а “Переименовать папку”
переименовывает папку: ключи, которые указывают на файлы, переписываются по всему проекту, обращения
по вычисленной строке называются в заметке. “Удалить папку” сначала показывает все места,
которые ссылаются на файлы, затем удаляет. Ресурс переносится только внутри своего каталога
Ресурсы.
Где используется ресурс. “Найти все ссылки” на файле или папке показывает места, которые на
них ссылаются, в панели “Ссылки” – той же, что открывает поиск ссылок самого редактора. Движок читает
исходники так же, как при переносе: ключи Ресурс{...} и значения свойств-картинок, строки с путём,
строки с папкой и вычисляемым именем файла. Ключ, который лежит в двух каталогах, помечен: ссылка
может вести к любому из файлов. F4 переходит к следующему месту.
Статус git. Строки объектов, форм, подсистем и проекта несут SCM-декорацию файла (цвет и бейдж) как в Проводнике, сохраняя иконку вида.
Удаление. Правый клик по объекту – “Удалить объект” (с подтверждением; удаляет файлы объекта, обратимо через Undo; ссылки не обновляются – оборванные покажет линтер).
Созданный объект – это заготовка в файлах, он не деплоится сам. Невалидный всплывёт только при следующем деплое, откат ловит elemctl, рабочие файлы при этом не портятся.
Пример: демо-приложение деревом и деплой на 1cmycloud.com
Дерево умеет собрать рабочее приложение с нуля (yaml генерируют те же шаблоны, что и дерево):
- Открыть папку с файлом проекта – в дереве появится корень-проект.
- Подсистемы → “+” → Добавить подсистему →
Основное. - Справочники → “+” → Добавить справочник →
Товары(подсистемаОсновное); так жеКатегории. - Под
Товары→ Реквизиты → “+” → Добавить реквизит →Цена,Артикул. - Перечисления → Добавить перечисление →
СтатусТовара; + на нём →ВНаличии,ПодЗаказ. - Задеплоить:
elemctl deploy --app-id <app> --project-dir <папка проекта> --output <tmp>(создать приложение заранее:elemctl apps ensure <app> --latest-build --wait).
Отчёт деплоя на 1cmycloud.com – ok: true появляется, только когда сборка действительно применилась:
собран архив <проект> 1.0-N.xasm (версия 1.0-N)
сборка загружена, применение запущено, ждём стабилизации приложения...
приложение в статусе Running, проверяем фактическое применение...
проверка пройдена: сборка применена
{
"uri": "https://<хост>.1cmycloud.com/applications/<app>",
"status": "Running",
"applied-version": "1.0-N",
"applied": true,
"uri-status": 200,
"problems": [],
"ok": true
}
applied: true и ok: true означают, что сборка реально применилась. Справочники Товары и
Категории и перечисление СтатусТовара, собранные деревом, открываются в стандартном
интерфейсе; демо не требует OIDC и входа.
Документация
Отдельный контейнер Документация (1С:Элемент) на панели действий показывает справку платформы так, как её показывает сайт документации. Собрана она из вашего дистрибутива, поэтому совпадает с вашей версией платформы и работает без сети.
Дерево. Курируемое “Содержание”, совпадающее с сайтом: руководства разработчика и
администратора, справочник типов (Стд::Коллекции → Массив → …), свойства элементов проекта
и компонентов интерфейса, схема процесса интеграции, язык запросов и глоссарий. Строится из
данных сайдбара самого дистрибутива, поэтому структура как на сайте. Клик по узлу открывает страницу.
Поиск. Кнопка поиска в заголовке вида (команда XBSL: поиск по документации) ищет полнотекстово по всему справочнику и руководству; выбор из списка открывает страницу.
Страница. Открывается вкладкой редактора сбоку и не забирает фокус: очищенная статья с кодом (у примеров – кнопка Копировать), таблицами и картинками и ссылкой Первоисточник на ту же страницу на сайте. Разделы страницы вложены в её узел дерева, внутренние ссылки ведут к другим страницам в этой же вкладке, а при открытии страницы дерево “Содержание” на неё позиционируется.
Документация по символу. Правый клик на типе или переменной в .xbsl – XBSL: документация по
символу – открывает её страницу. Для типа сразу открывается страница справочника. У отдельного члена
типа своей страницы нет, поэтому открывается страница объявившего его типа, прокрученная к блоку члена:
Массив.Размер ведёт на страницу предка, объявившего метод. Когда одно имя объявлено несколькими
неродственными типами, предлагается выбор из этих типов, а строкой под каждым идёт блок члена с его
страницы. У прочих имён без своей страницы список кандидатов ранжируется по приёмнику перед точкой:
Задание.Настроить отдаёт предпочтение страницам запланированного задания, а не топику руководства.
Куда ведут остальные входы. Подсказка при наведении на имя в .xbsl показывает описание и
ссылку Документация: над членом типа это сигнатура вызова и что он делает, и ссылка открывает
страницу сразу на нём. В конструкторе форм у элемента палитры есть действие Открыть документацию,
краткое описание видно и в подсказке. Оба открывают страницу в этой же панели, поэтому читать про
незнакомый компонент можно не уходя из редактора.
F12 отступает на страницу. Переход к определению отвечает по индексу проекта, поэтому у члена платформы прыгать некуда: там клавиша открывает страницу документации вместо сообщения о промахе. Настоящее определение всегда выигрывает, а когда нет ни того ни другого, о промахе сообщает VS Code, как обычно.
Данные даёт LSP-сервер линтера, поэтому нужен режим LSP и база документации, собранная из вашего дистрибутива (см. README линтера). В обычном режиме (CLI) вид сообщает, что документация доступна в режиме LSP.
Деплой на стенд
Команда XBSL: деплой на стенд (elemctl) (xbsl.deploy, она же кнопка-облачко в заголовке
дерева метаданных) запускает elemctl deploy терминальной задачей, после диалога подтверждения
с точной командной строкой. Деплоится проект целиком, а не открытый файл. Шаги обычные: сборка,
загрузка, применение и проверка того, что применение состоялось. При сбое применения платформа
молча откатывает приложение на прежнюю сборку, продолжая отвечать Running; elemctl этому
статусу не верит и завершается ненулевым кодом.
Рабочий каталог – рабочая папка. Подключение и цель elemctl читает из своего .env
(ELEMENT_BASE_URL, ELEMENT_CLIENT_ID/SECRET, ELEMENT_APP_ID, ELEMENT_PROJECT_ID).
Заданный xbsl.projectRoot передаётся как --project-dir. Отсутствующий elemctl предлагается
установить прямо из сообщения об ошибке.
| Настройка | По умолчанию | Значение |
|---|---|---|
xbsl.deploy.elemctlPath |
elemctl |
Исполняемый файл elemctl – для команды деплоя и для отладки. |
xbsl.deploy.envFile |
– | .env с подключением и целью, передаётся как --env-file (относительно рабочей папки или абсолютный). Удобно в рабочем дереве git, где .env лежит в основной рабочей копии. Действует и на отладку: она берёт стенд отсюда, если envFile не задан в конфигурации запуска. |
xbsl.deploy.appId |
– | Целевое приложение (--app-id); пусто – ELEMENT_APP_ID из окружения или .env. Если приложение не задано нигде, деплой предложит те, что видит elemctl apps list: выбираете по имени, сохраняется идентификатор. |
xbsl.deploy.extraArgs |
– | Дополнительные аргументы elemctl deploy через пробел. |
Отладка
Отладка приложений 1С:Элемент идёт в обычном VS Code, без веб-среды на Theia: точки
останова, стек вызовов, сцепляющий клиентские и серверные кадры, значения переменных, пошаговое
выполнение. Расширение и здесь тонкое: оно запускает штатный debug-адаптер платформы (Java,
протокол DAP) и получает координаты сессии через elemctl (Console API /actions/debug).
Идентификатор сессии, сгенерированный на клиенте, сшивает адаптер и отлаживаемое приложение
через сервер отладки платформы.
До версии 0.57 это было отдельное расширение XBSL Debug (
keyfire.xbsl-debug). Теперь оно часть этого. Деплой и отладка адресуют одно и то же приложение одним и тем же elemctl, а от разделения выходило только одно: реквизиты спрашивались дважды. Настройки старого расширения (xbslDebug.*) по-прежнему читаются, прежняя конфигурация продолжает работать.
С чего начать. Выполните XBSL: настроить отладку 1С:Элемент (xbsl.debug.setup) из
палитры команд. Мастер проверит Java, каталог адаптера и elemctl, что сможет – починит на
месте и предложит создать launch.json. Дальше откройте папку с исходниками, поставьте точку
останова в .xbsl и нажмите F5: приложение откроется в браузере с параметрами отладки, а
выполнение остановится на вашей точке.
Что нужно:
- JDK 17+ (21 тоже подходит) –
java -version. - elemctl >= 0.5 (команды
apps debugиdebug-adapter) с настроенным.envв корне исходников. Отсутствующий elemctl предлагается установить из сообщения об ошибке и из мастера. - Debug-адаптер платформы. Возьмите его из своего дистрибутива 1С:Элемент
(
.../@1c-appengine-plugin/bin/debugger– каталог с подпапкойrepo, где лежат jar-файлы) и задайтеxbsl.debug.adapterPath. Адаптер – проприетарный код 1С, в расширение он не входит. - Отладка, включённая на сервере приложения – на облачных стендах обычно уже включена.
| Настройка | По умолчанию | Значение |
|---|---|---|
xbsl.debug.adapterPath |
– | Каталог debug-адаптера платформы из вашего дистрибутива – папка с подкаталогом repo, где лежат jar-файлы. |
xbsl.debug.javaPath |
java |
Исполняемый файл Java 17+. |
xbsl.debug.openApplicationOnStart |
true |
Открывать отлаживаемое приложение в браузере при старте сессии, с параметрами отладки. |
xbsl.debug.applicationUrl |
– | По какому адресу открывать отлаживаемое приложение. Пусто – uri из карточки приложения, то есть его адрес внутри платформы; задайте, если приложение отвечает на своём домене. Атрибут applicationUrl в launch.json перекрывает настройку. |
Исполняемый файл elemctl и идентификатор приложения общие с деплоем
(xbsl.deploy.elemctlPath, xbsl.deploy.appId). Реквизиты Console API живут в .env корня
исходников, а не в настройке: elemctl читает их сам. launch.json необязателен; его атрибуты –
appId, envFile, authMode и workspace.
Как привязываются точки останова. Сервер отладки опознаёт модуль по пути относительно
корня исходников в форме <Поставщик>/<Имя>/<путь в проекте>.xbsl с прямыми разделителями.
Поэтому исходники должны лежать в каталоге <Поставщик>/<Имя>/, совпадающем с Проект.yaml, а
рабочая папка – указывать на каталог, который его содержит. Этот корень расширение определяет от
открытой папки само, так что годится и корень репозитория, и подпапка.
Обойдённая ошибка платформы. Раскрытие структуры в панели переменных на клиентском кадре
вешало отлаживаемое приложение и рвало сессию. Причина: DAP-запрос variables без поля filter
– ровно такой панель переменных VS Code шлёт для небольших значений – роняет среду выполнения JS
в приложении, тогда как запрос с фильтром работает штатно. Расширение переписывает каждый запрос
без фильтра в запросы с фильтром (named + indexed, счётчики берутся из ответа родителя) и
склеивает результаты. Дерево значений раскрывается нормально и на клиентских, и на серверных
кадрах. Обход безусловный, настройки у него нет: выключение не даёт ничего, кроме оборванной
сессии.
Команды
- XBSL: новый проект 1С:Элемент (
xbsl.project.new) – мастер создания проекта (см. выше). - XBSL: проверить весь проект (
xbsl.lintProject) – проверить всю рабочую папку. - XBSL: структурный поиск по формам (
xbsl.forms.search) – поиск компонентов по типу и свойствам (см. выше). - XBSL: перезапустить линтер (
xbsl.restartLinter) – сбросить и перепроверить открытые файлы. - XBSL: палитра кода (
xbsl.choosePalette) – выбрать палитру подсветки XBSL (см. выше). - XBSL: шаблоны кода (
xbsl.templates.manage), импорт (xbsl.templates.import) и экспорт (xbsl.templates.export) – набор шаблонов и обмен выгрузкой EDT (см. выше). - XBSL: деплой на стенд (elemctl) (
xbsl.deploy) – развернуть проект на стенде (см. выше). - XBSL: конструктор формы (
xbsl.previewForm) – панель активной yaml-формы (см. выше). - XBSL: поиск по документации (
xbsl.docs.search) и документация по символу (xbsl.docs.showForSymbol) – вид Документация (см. выше). - Команды обозревателя метаданных (
xbsl.metadata.*) вызываются из самого дерева и его контекстных меню: свойства, добавить объект / поле / подсистему, форму объекта, отбор по подсистемам и пакетам, удалить объект, обновить. См. Обозреватель метаданных.
Полный список
Все команды расширения. Собрано из package.json – не редактируйте вручную.
По проекту
| Команда | Идентификатор | Откуда вызывается |
|---|---|---|
| Проверить весь проект | xbsl.lintProject |
палитра команд |
| Переиндексировать и проверить проект | xbsl.reindexProject |
палитра команд |
| Новый проект 1С:Элемент | xbsl.project.new |
палитра команд |
| Структурный поиск по формам | xbsl.forms.search |
палитра команд |
| Перезапустить линтер | xbsl.restartLinter |
палитра команд |
| Палитра кода | xbsl.choosePalette |
палитра команд |
| Деплой на стенд (elemctl) | xbsl.deploy |
палитра команд |
| Проверить, вышло ли новое расширение | xbsl.checkForUpdate |
палитра команд |
| Конструктор формы | xbsl.previewForm |
палитра команд |
| Открыть форму | xbsl.openFormForModule |
палитра команд |
| Перейти к определению или к его документации | xbsl.goToDefinition |
палитра команд |
Шаблоны кода
| Команда | Идентификатор | Откуда вызывается |
|---|---|---|
| Шаблоны кода | xbsl.templates.manage |
палитра команд |
| Импорт шаблонов кода | xbsl.templates.import |
палитра команд |
| Экспорт шаблонов кода | xbsl.templates.export |
палитра команд |
Дерево метаданных: создание объектов
| Команда | Идентификатор | Откуда вызывается |
|---|---|---|
| Добавить справочник | xbsl.metadata.addObject.catalog |
палитра команд |
| Добавить документ | xbsl.metadata.addObject.document |
палитра команд |
| Добавить перечисление | xbsl.metadata.addObject.enumeration |
палитра команд |
| Добавить регистр сведений | xbsl.metadata.addObject.inforegister |
палитра команд |
| Добавить регистр накопления | xbsl.metadata.addObject.accumregister |
палитра команд |
| Добавить общий модуль | xbsl.metadata.addObject.commonmodule |
палитра команд |
| Добавить HTTP-сервис | xbsl.metadata.addObject.httpservice |
палитра команд |
| Добавить параметры работы клиента | xbsl.metadata.addObject.clientparams |
палитра команд |
| Добавить структуру | xbsl.metadata.addObject.structure |
палитра команд |
| Добавить клиентское событие | xbsl.metadata.addObject.clientevent |
палитра команд |
| Добавить фрагмент командного интерфейса | xbsl.metadata.addObject.cmdfragment |
палитра команд |
| Добавить общую форму | xbsl.metadata.addObject.commonform |
палитра команд |
| Добавить хранимую структуру | xbsl.metadata.addObject.storedstructure |
палитра команд |
| Добавить набор констант | xbsl.metadata.addObject.constantsset |
палитра команд |
| Добавить виртуальную таблицу | xbsl.metadata.addObject.virtualtable |
палитра команд |
| Добавить SOAP-сервис | xbsl.metadata.addObject.soapservice |
палитра команд |
| Добавить контракт сервиса | xbsl.metadata.addObject.servicecontract |
палитра команд |
| Добавить контракт типа | xbsl.metadata.addObject.typecontract |
палитра команд |
| Добавить контракт сущности | xbsl.metadata.addObject.entitycontract |
палитра команд |
| Добавить событие журнала | xbsl.metadata.addObject.logevent |
палитра команд |
| Добавить запланированное задание | xbsl.metadata.addObject.scheduledjob |
палитра команд |
| Добавить обработку | xbsl.metadata.addObject.processing |
палитра команд |
| Добавить цветовую схему отчёта | xbsl.metadata.addObject.colorscheme |
палитра команд |
| Добавить обычную команду | xbsl.metadata.addObject.usualcommand |
палитра команд |
| Добавить навигационную команду | xbsl.metadata.addObject.navcommand |
палитра команд |
| Добавить переключаемую команду | xbsl.metadata.addObject.switchcommand |
палитра команд |
| Добавить команду с компонентом | xbsl.metadata.addObject.componentcommand |
палитра команд |
| Добавить план обмена | xbsl.metadata.addObject.exchangeplan |
палитра команд |
| Добавить ключ доступа | xbsl.metadata.addObject.accesskey |
палитра команд |
| Добавить право на действие | xbsl.metadata.addObject.actionright |
палитра команд |
| Добавить право на элемент | xbsl.metadata.addObject.elementright |
палитра команд |
| Добавить хранилище настроек | xbsl.metadata.addObject.settingsstorage |
палитра команд |
| Добавить параметр самостоятельной регистрации | xbsl.metadata.addObject.regparam |
палитра команд |
| Добавить локализованные строки | xbsl.metadata.addObject.locstrings |
палитра команд |
Дерево метаданных: остальное
| Команда | Идентификатор | Откуда вызывается |
|---|---|---|
| Свернуть до видов метаданных | xbsl.metadata.collapse |
палитра команд |
| Обновить дерево метаданных | xbsl.metadata.refresh |
палитра команд |
| Открыть описание (yaml) | xbsl.metadata.openYaml |
палитра команд |
| Открыть запрос (xbql) | xbsl.metadata.openQuery |
палитра команд |
| Открыть WSDL | xbsl.metadata.openWsdl |
палитра команд |
| Открыть описание ресурсов | xbsl.metadata.openResourcesDescriptor |
палитра команд |
| Открыть модуль (xbsl) | xbsl.metadata.openModule |
палитра команд |
| Открыть модуль объекта (.Объект.xbsl) | xbsl.metadata.openObjectModule |
палитра команд |
| Создать модуль (xbsl) | xbsl.metadata.createModule |
панель / контекстное меню |
| Создать модуль объекта (.Объект.xbsl) | xbsl.metadata.createObjectModule |
панель / контекстное меню |
| Открыть модуль записи (.Запись.xbsl) | xbsl.metadata.openRecordModule |
панель / контекстное меню |
| Создать модуль записи (.Запись.xbsl) | xbsl.metadata.createRecordModule |
панель / контекстное меню |
| Открыть модуль набора записей (.НаборЗаписей.xbsl) | xbsl.metadata.openRecordSetModule |
панель / контекстное меню |
| Создать модуль набора записей (.НаборЗаписей.xbsl) | xbsl.metadata.createRecordSetModule |
панель / контекстное меню |
| Открыть модуль ключа записи (.КлючЗаписи.xbsl) | xbsl.metadata.openRecordKeyModule |
панель / контекстное меню |
| Создать модуль ключа записи (.КлючЗаписи.xbsl) | xbsl.metadata.createRecordKeyModule |
панель / контекстное меню |
| Открыть модуль строки (Объект.ТабличнаяЧасть.xbsl) | xbsl.metadata.openRowModule |
панель / контекстное меню |
| Создать модуль строки (Объект.ТабличнаяЧасть.xbsl) | xbsl.metadata.createRowModule |
панель / контекстное меню |
| Открыть в конструкторе | xbsl.metadata.previewForm |
палитра команд |
| Открыть модуль приложения (Проект.xbsl) | xbsl.metadata.openAppModule |
палитра команд |
| Свойства | xbsl.metadata.props |
палитра команд |
| Добавить реквизит | xbsl.metadata.addAttribute |
палитра команд |
| Добавить измерение | xbsl.metadata.addDimension |
палитра команд |
| Добавить ресурс | xbsl.metadata.addResource |
палитра команд |
| Добавить значение | xbsl.metadata.addEnumValue |
палитра команд |
| Добавить параметр | xbsl.metadata.addClientParam |
палитра команд |
| Добавить поле | xbsl.metadata.addStructField |
палитра команд |
| Добавить табличную часть | xbsl.metadata.addTabular |
палитра команд |
| Добавить реквизит табличной части | xbsl.metadata.addTabularAttr |
палитра команд |
| Добавить свойство… | xbsl.metadata.addComponentProperty |
панель / контекстное меню |
| Добавить событие… | xbsl.metadata.addComponentEvent |
панель / контекстное меню |
| Добавить шаблон URL | xbsl.metadata.addRoute |
палитра команд |
| Добавить HTTP-метод | xbsl.metadata.addRouteMethod |
палитра команд |
| Добавить форму | xbsl.metadata.addObjectForm |
палитра команд |
| Удалить объект | xbsl.metadata.deleteObject |
палитра команд |
| Добавить объект… | xbsl.metadata.addObjectPick |
палитра команд |
| Добавить локализацию (перевод) | xbsl.metadata.addLocalization |
палитра команд |
| Добавить подсистему | xbsl.metadata.addSubsystem |
палитра команд |
| Создать пакет | xbsl.metadata.addPackage |
палитра команд |
| Переименовать пакет | xbsl.metadata.renamePackage |
палитра команд |
| Перенести в пакет… | xbsl.metadata.moveToPackage |
палитра команд |
| Создать папку | xbsl.metadata.addResourceFolder |
палитра команд |
| Добавить файлы ресурсов… | xbsl.metadata.addResourceFiles |
палитра команд |
| Переместить в папку… | xbsl.metadata.moveResource |
палитра команд |
| Переименовать папку | xbsl.metadata.renameResourceFolder |
палитра команд |
| Удалить папку | xbsl.metadata.deleteResourceFolder |
палитра команд |
| Найти все ссылки | xbsl.metadata.findResourceReferences |
панель / контекстное меню |
| Отбор по подсистемам и пакетам… | xbsl.metadata.filterBySubsystem |
палитра команд |
| Отбор по подсистемам и пакетам (установлен)… | xbsl.metadata.editFilter |
панель / контекстное меню |
| Сбросить отбор по подсистемам и пакетам | xbsl.metadata.clearFilter |
палитра команд |
| Отобрать по подсистеме | xbsl.metadata.filterBySubsystemNode |
панель / контекстное меню |
| Отобрать по пакету | xbsl.metadata.filterByPackageNode |
панель / контекстное меню |
| Снять отбор по подсистеме | xbsl.metadata.clearSubsystemNodeFilter |
панель / контекстное меню |
| Снять отбор по пакету | xbsl.metadata.clearPackageNodeFilter |
панель / контекстное меню |
| Группировка дерева (по классам / по подсистемам) | xbsl.metadata.groupMode |
палитра команд |
| Скрыть пустые классы | xbsl.metadata.hideEmptyCategories |
палитра команд |
| Показать пустые классы | xbsl.metadata.showEmptyCategories |
палитра команд |
Конструктор форм
| Команда | Идентификатор | Откуда вызывается |
|---|---|---|
| Обновить структуру формы | xbsl.formStructure.refresh |
палитра команд |
| Перейти к yaml | xbsl.formStructure.openInEditor |
палитра команд |
| Переместить выше | xbsl.formStructure.moveUp |
палитра команд |
| Переместить ниже | xbsl.formStructure.moveDown |
палитра команд |
| Удалить компонент | xbsl.formStructure.delete |
палитра команд |
| Переименовать компонент | xbsl.formStructure.rename |
палитра команд |
| Дублировать | xbsl.formStructure.duplicate |
палитра команд |
| Обернуть в контейнер | xbsl.formStructure.wrap |
палитра команд |
| Развернуть контейнер | xbsl.formStructure.unwrap |
палитра команд |
| Копировать фрагмент yaml | xbsl.formStructure.copyYaml |
палитра команд |
| Сфокусироваться на поддереве | xbsl.formStructure.focusSubtree |
палитра команд |
| Показать всю форму | xbsl.formStructure.resetFocus |
палитра команд |
| Показывать только именованные | xbsl.formStructure.filterNamed |
палитра команд |
| Показывать все компоненты | xbsl.formStructure.filterAll |
палитра команд |
| Обновить палитру компонентов | xbsl.formPalette.refresh |
палитра команд |
| Активировать компонент палитры | xbsl.formPalette.activate |
панель / контекстное меню |
| Вставить в форму | xbsl.formPalette.insert |
палитра команд |
| В избранное | xbsl.formPalette.addFavorite |
палитра команд |
| Убрать из избранного | xbsl.formPalette.removeFavorite |
палитра команд |
| Открыть документацию | xbsl.formPalette.openDocs |
палитра команд |
| Вставить yaml из буфера | xbsl.formStructure.pasteYaml |
палитра команд |
| Сохранить как пресет блока | xbsl.formStructure.savePreset |
палитра команд |
| Вставить пресет блока… | xbsl.formStructure.insertPreset |
палитра команд |
| Управление пресетами блоков… | xbsl.formStructure.managePresets |
палитра команд |
| Править выделенные вместе… | xbsl.formStructure.editSelected |
палитра команд |
| Обновить панель данных | xbsl.formData.refresh |
палитра команд |
| Вставить в форму | xbsl.formData.insert |
палитра команд |
| Добавить свойство | xbsl.formData.addProperty |
палитра команд |
| Переименовать свойство | xbsl.formData.renameProperty |
палитра команд |
| Сменить тип свойства | xbsl.formData.retypeProperty |
палитра команд |
| Удалить свойство | xbsl.formData.removeProperty |
палитра команд |
Документация
| Команда | Идентификатор | Откуда вызывается |
|---|---|---|
| Поиск по документации | xbsl.docs.search |
палитра команд |
| Документация по символу | xbsl.docs.showForSymbol |
палитра команд |
| Обновить дерево документации | xbsl.docs.refresh |
палитра команд |
| Открыть страницу документации | xbsl.docs.open |
панель / контекстное меню |
Обратная связь и ошибки
Расширение активно развивается, поэтому возможны ошибки и шероховатости, особенно в обозревателе метаданных и конструкторе форм. Если что-то работает не так, пожалуйста, сообщите об этом в issues проекта на GitHub. По возможности приложите шаги воспроизведения и версии расширения и движка из строки состояния.
https://github.com/keyfire/xbsl/issues
VS Code также предлагает Report Issue на странице расширения (по ссылке bugs из манифеста).
Разработка
npm install
npm run compile # сборка esbuild -> dist/extension.js
npm run check # проверка типов tsc
npm test # модульные тесты чистых ядер (обычный Node, без тестового движка)
npm run package # сборка .vsix (через @vscode/vsce)
F5 в VS Code запускает Extension Development Host с загруженным расширением.
Лицензия
MIT – см. репозиторий.