Перейти к содержимому
XBSL (1C:Element)
Русский
Esc
navigateopen⌘Jpreview
На этой странице

Создание метаданных

Создание объектов, реквизитов, маршрутов и форм движком вместо ручного yaml – и шаблоны кода.

Писать yaml руками – значит помнить про UUID, имена свойств вида и место, где регистрируется форма. Эту часть берёт на себя движок; те же операции доступны из CLI, редактора и агента.

Создание метаданных

Механику создания метаданных инструмент берёт на себя: UUID, отступы, точечные вставки в yaml, проверки дублей и совместимости секции с видом объекта. Одни и те же операции доступны из CLI (подкоманды, вывод – JSON), из MCP (инструменты meta_* для агентов) и из LSP (кастомные запросы xbsl/meta* – на них работает дерево метаданных расширения VS Code).

Создаётся 33 вида элементов проекта – от Справочника и Документа до ВиртуальнойТаблицы (вместе с обязательным парным запросом .xbql), ЗапланированногоЗадания, контрактов, прав и команд. Каждый вид несёт то, что документация делает обязательным: платформенное умолчание видимости (ВПодсистеме – расширять осознанно ключом --scope), заготовку обработчика, без которого вид бесполезен, и заметку о том, что генератор не станет выдумывать за разработчика. Виды, чьё содержимое рисуется в дизайнере (ПанельОтчетов, ПроцессИнтеграции), намеренно отсутствуют.

Дерево VS Code, ИИ-агенты и терминал зовут одно ядро создания метаданных; оно пишет созданные и точечно правленные yaml/xbsl, линтер проверяет записанное, ответ несёт files, notes и линт; LSP-поверхность возвращает полные тексты, их применяет редактор

xbsl new-project . vendor Приложение                      # описание проекта + модуль + подсистема
xbsl new-object <каталог-подсистемы> <вид> <имя>          # вид: Справочник, Документ, Перечисление, ...
xbsl add-field <объект>.yaml <секция> <поле> --type <тип>
xbsl add-form . --name <объект>                           # формы объекта и списка + регистрация
xbsl add-form . --name <объект> --forms list-cards        # форма списка карточками
xbsl new-object <каталог-подсистемы> <вид-http-сервиса> <имя> --routes "GET /, POST /, GET /{id}"
xbsl add-route  <сервис>.yaml "DELETE /{id}"              # шаблон URL + заготовка обработчика
xbsl add-method <модуль>.xbsl <метод> --annotations <аннотация> --after <существующий-метод>
xbsl add-subsystem vendor/Приложение <имя>
xbsl add-dependency . acme CurrencyConverter 2.0          # подключить библиотеку к проекту
xbsl rename-object . <старое-имя> <новое-имя>             # файлы + ссылки по всему проекту
xbsl delete-object . --name <объект>                      # план; --apply удаляет и называет хвосты
xbsl set-access . --name <объект> --default <способ-доступа>
xbsl object-info . --name <объект>                        # реквизиты, ТЧ, формы, namespace
xbsl project-info .                                       # проекты, подсистемы, объекты по видам

Вид, секция, аннотации, способы доступа и все идентификаторы пишутся на языке разработки проекта – платформа так документирует свой словарь метаданных, и инструмент принимает ровно эти написания, поэтому в примерах выше стоят плейсхолдеры. Какие виды бывают в проекте, покажет xbsl new-object --help.

Сами исходники бывают написаны и по-английски, и создание метаданных читает оба написания: объект с ElementKind: Catalog и секцией Attributes: находится, описывается и правится ровно так же, как объект с ВидЭлемента: Справочник и Реквизиты:. Пишет инструмент на языке того файла, куда пишет: новый реквизит английского объекта получает Name: и Type:, недостающая секция создаётся как Attributes:, подсистема и запись библиотеки оформляются как проект вокруг них. Пары написаний берутся из данных платформы (английское имя свойства из метамодели), поэтому имя, которое платформа в разных классах пишет по-разному – Элементы это Items у перечисления и Elements в остальных местах, – остаётся русским и при чтении, и при записи: догадка тут хуже молчания. Значения (типы, способы доступа) – ваши, они пишутся как переданы.

add-field ставит новый элемент в конец секции своего вида, а секцию заводит только когда её в файле нет. Данные регистра лежат в Измерения и Ресурсы, поэтому реквизит, запрошенный у регистра, где есть ресурсы и нет реквизитов, попадает в новую секцию Реквизиты в конце файла – notes говорят об этом и называют вид, который положил бы поле рядом с существующими (здесь ресурс; для ресурса там, где есть только реквизиты, – наоборот).

Формы генерируются с наполнением: поля ввода по реквизитам объекта (включая стандартные Наименование / Номер / Дата и иерархию), колонки динамического списка, таблицы табличных частей, форма отчёта с параметрами; готовая форма регистрируется в секции Интерфейс владельца. Ключ --dry-run печатает изменения (с полными текстами файлов), ничего не записывая – так расширение применяет правки через свой механизм undo.

--forms list-cards собирает форму списка не таблицей, а сеткой карточек: ПроизвольныйСписок с матричной группой в КонтейнерСтрок плюс компонент строки СтрокаСписка<Имя>. На карточку идут заголовок, фото (реквизит ДвоичныйОбъект.Ссылка переключает её на ПроизвольнаяКарточка с изображением над подписью) и ещё до трёх полей, даты – с форматированием; что попало на карточку, а что нет, перечисляют notes. Ширину колонки сетки задаёт --card-min-width (по умолчанию 400, с фото – 250), картинку-заглушку пустого фото – --card-placeholder.

add-dependency подключает библиотеку – раздел Библиотеки файла Проект.yaml (Имя, Поставщик, Версия). Версия – это версия релиза библиотеки: релиз выпускается в панели управления, и версия сборки с суффиксом (1.0-42) отклоняется. Разные версии одной библиотеки в проекте не допускаются, поэтому повторное подключение обновляет версию существующей записи. Что подключено сейчас – в project-info (projects[].libraries). Поставщика, имя, версию и полные имена типов библиотеки даёт разбор её архива: elemctl inspect <файл.xlib>.

set-access точечно правит КонтрольДоступа.Разрешения, зная, что допускает вид объекта: --default задаёт право ПоУмолчанию, --permission Чтение=РазрешеноВсем – отдельное право (в том числе пользовательское от ПравоНаЭлемент), --calc-by заполняет РасчетРазрешенийПо – он обязателен для РазрешенияВычисляютсяДляКаждогоОбъекта. Неизвестный способ, право, которого у вида нет, и построчные разрешения у НаборКонстант отклоняются; обработчики вычисления разрешений остаются за разработчиком (какие нужны – скажут notes). object-info показывает текущие разрешения и права вида, project-info – ПоУмолчанию каждого объекта; нет секции – значит, платформа применяет РазрешеноАдминистраторам.

rename-object переименовывает файлы объекта (вместе с формами и компонентом строки СтрокаСписка<Имя>) и обновляет ссылки контекстно по всему проекту: значения ссылочных ключей yaml (Тип/Таблица/ИсточникДанных/Форма/ТипФормы), биндинги =... и код .xbsl. Реквизиты, компоненты и поля динамических списков, лишь совпадающие со старым именем, не трогаются; строковые литералы (UI-текст) – тоже. Ключи --new-presentation / --old-presentation обновляют Заголовок/Представление объекта и его форм. Ид объекта сохраняется – данные на платформе переживают переименование.

delete-object удаляет объект целиком: пару yaml+модуль, его формы и компонент строки списка СтрокаСписка<Имя> – вместе с их парами. Подсистема – это папка, в которой лежат файлы, поэтому вхождение в неё уходит вместе с ними. Каждое ОСТАВШЕЕСЯ упоминание имени по проекту называется файлом и строкой – включая строковые литералы и комментарии: роутер, открывающий форму по имени в строке, или сидинг – ровно те хвосты, которые иначе всплывают ошибкой применения, – и сознательно НЕ правится: какое упоминание мёртвый код, решает автор. Удаление необратимо, поэтому без --apply команда печатает план (инструмент MCP meta_delete_object так же отвечает планом при умолчании dry_run=true).

Переименование, отличающееся только регистром (Товары в товары), инструмент выполняет в два шага через временное имя: регистронезависимая файловая система (Windows, macOS) адресует старое и новое имя как один файл, и одношаговое переименование между ними не гарантировано. Сбой второго шага откатывает первый, временное имя на диске не остаётся; на регистрозависимой файловой системе имя свободно и переименование выполняется одним шагом. Файлы инструмент переименовывает сам, а вот систему контроля версий проверьте: git на регистронезависимой файловой системе сличает имена без учёта регистра только для латиницы, поэтому латинское переименование он не заметит – зафиксируйте его явно (git mv <старое> <новое>), а кириллическое покажет как удаление и добавление, и тогда в остальных клонах на такой же файловой системе git pull остановится с “untracked working tree files would be overwritten by merge” – там перед обновлением надо удалить файл со старым именем.

Шаблоны кода

Шаблон – это аббревиатура и конструкция за ней: набираете есл, жмёте Ctrl+Space, выбираете если – и получаете готовый оператор с точками ввода, между которыми ходит Tab. Механизм повторяет шаблоны 1С:EDT (Параметры – Шаблоны), включая формат файла выгрузки.

Шаблоны предлагаются до остальных подсказок: конструкция, которую вы набираете, нужнее имени, которое просто начинается так же. Данные Элемента им не нужны, нужен только LSP-сервер (xbsl.lsp.enabled, включён по умолчанию) – в режиме CLI-индекса расширение их не предлагает.

Встроенный набор – 51 шаблон (xbsl/templates_builtin.py): управляющие конструкции, объявления (методы с аннотациями, структуры, перечисления, типы исключений), запросы и прикладные идиомы – обход справочника, движения регистра, обработчик HttpСервиса, разрешения доступа по объектам, события объекта, обработчики формы. Каждый шаблон разбирается тем же парсером, что и линтер (tests/test_templates.py), – вставить некомпилируемый код он не может.

В тексте шаблона живут точки ввода и списки выбора. Переменные записываются синтаксисом шаблонов 1С:EDT (${...}) и именуются на языке разработки проекта:

Переменная Во что разворачивается
${Редактировать("подсказка")} точка ввода; подсказка – заранее выделенный текст
${Выбрать("а", "б")} выпадающий список заданных вариантов
${ИмяОбъектаМетаданного(Справочник)} список справочников вашего проекта, из индекса
${ПолноеИмяОбъектаМетаданного("Перечисление")} то же, но вставляется как Вид.Имя

Собственные шаблоны лежат в .xbsl-templates.json в корне воркспейса (--file или настройка xbsl.templates.file): файл дополняет встроенный набор, одноимённый шаблон замещает встроенный. Хранится только то, что отличается от встроенного набора, – поэтому следующий релиз до вас дойдёт.

xbsl templates list                        # весь набор: встроенные и свои (свои помечены *)
xbsl templates export --output мои.json    # выгрузка (например, чтобы перенести на другую машину)
xbsl templates import выгрузка.json        # влить выгрузку в свой файл

В VS Code то же самое – панель XBSL: шаблоны кода, устроенная как диалог EDT: список с контекстом вызова, описание и текст шаблона, кнопки добавления, правки, удаления, импорта, экспорта и восстановления умолчаний. После сохранения работающий сервер перечитывает набор – следующий Ctrl+Space уже предлагает исправленный шаблон.

Последнее обновление 6 сентября 2026 г.

Эта страница была полезной?