Elemctl
CLI, MCP-сервер и библиотека для Console API 1С:Элемента: приложения, сборки из исходников, развёртывание одной командой с проверкой, что изменение применилось, и пробник, который компилирует исходники на сервере, не трогая рабочее приложение.
Утилита командной строки, MCP-сервер и Python-библиотека для управления приложениями облачной платформы 1С:Предприятие.Элемент (1cmycloud.com) через Console API v2.
elemctl ведёт приложение на платформе весь его срок жизни, и веб-консоль
для этого не нужна. Он создаёт приложение, собирает архив .xasm/.xlib
из исходников проекта, загружает сборку и применяет её к приложению. Дальше
он проверяет, что применение и правда случилось: платформа умеет молча
откатить. Компиляцию проверяет пробник, который рабочее приложение не
трогает. Отдельные команды ведут ветки среды разработки, дампы и версию
технологии.
Движок один, а обратиться к нему можно тремя способами: командой elemctl
из терминала и CI, MCP-сервером для AI-агентов (Claude Code и другие
MCP-клиенты), python-модулем elemctl из своих скриптов.
Заметки о разработке и новости – в Telegram-канале 1С × ИИ: инженерный цех.
Возможности
- Приложения: список, карточка, создание, запуск, остановка, удаление,
версия технологии, данные для сессии отладки (
apps debug), сборка, на которой работает приложение, и сборка примененного расширения в файл (apps export, аapps export-extension– из Console API 2.1). Список умеет фильтровать по имени на стороне клиента и показывать краткие карточки по--brief. Команды, адресующие одно приложение, принимают его ид либо точное имя. - Проекты и сборки: загрузка
.xasm/.xlib, список сборок, удаление. - Сборка из исходников: elemctl упаковывает каталог проекта в архив
сборки с манифестом и git-метаданными. В каталоге лежат
Проект.yamlи модули. Версию он берёт из флага, из счётчика последней сборки или из номера запуска CI в окружении:CI_PIPELINE_IID,GITHUB_RUN_NUMBER,BUILD_NUMBER. Её же возвращает поле вывода. Дескриптор с английскими написаниями ключейName/Vendor/Versionчитается наравне с русским. Приложение, библиотека и расширение собираются одинаково, а расширение получает ту версию манифеста, по которой сервер читает расширения. - Развёртывание одной командой: сборка -> загрузка -> применение ->
перезапуск -> проверка фактического применения. Незакоммиченные
изменения каталога проекта видны в отчёте полем
dirty. Ключ--require-cleanостанавливает работу, когда дерево грязное. - Проверка компиляции без риска для приложения (
elemctl probe): исходники компилирует сервер, и делает он это в одноразовом приложении. Ошибки приходят с файлом, строкой и колонкой. Созданное пробник убирает за собой. До рабочего приложения он не дотягивается намеренно:ELEMENT_APP_IDиELEMENT_PROJECT_IDон не читает. - Списки пользователей (
elemctl user-lists): настройки входа, за которыми обычно ходят в панель управления. Это самостоятельная регистрация и вход по логину с паролем. Список адресуют ид, представлением либо приложением, которому он принадлежит. - Ветки среды разработки: список, создание, привязка к приложению, слияние.
- Дампы: создание и контроль готовности.
- MCP-сервер: те же операции в виде инструментов для AI-агентов – Claude Code и других MCP-клиентов.
- Плагины: точки расширения
importlib.metadata. Внешний пакет приносит debug-адаптер платформы (elemctl debug-adapter) и свои команды, и ядро от этого не раздувается. Одно объявлениеCommandстановится сразу и подкомандой CLI, и инструментом MCP. Команда, которая знает про ваше окружение, живёт в вашем пакете, а не в публичном ядре. - Обновление:
elemctl self-updateобновляет пакет распаковкой колеса. Это работает и тогда, когдаelemctl.exeзанят работающим MCP-сервером: штатные pipx и pip в таком случае ломают установку.--stop-holdersснимает MCP-серверы, которые держат пакет, а идущие команды других сессий не трогает. - В VS Code: развёртывание и отладка живут в расширении
XBSL. Оно зовёт elemctl:
elemctl deployпо кнопке развёртывания,elemctl apps debugза координатами сессии отладки.
Проверка того, что сборка применилась
Особенность платформы: когда применение проекта падает, платформа молча
откатывает приложение на предыдущую сборку. Статус Running об успехе при
этом ничего не говорит. Поэтому elemctl deploy статусу не верит и после
работы проверяет три вещи:
- Задачи приложения со статусом
ErrorилиFailed, начатые после того, как команда взялась за работу. Старые ошибки из истории она пропускает. - Фактическую версию проекта приложения, поле
source.project-version. Она должна совпасть с только что загруженной сборкой. - Доступность uri приложения контрольным HTTP-запросом. Результат идёт в
поле
uri-statusотчёта и ни на что не влияет: у закрытых приложений 401 и 403 нормальны.
Код возврата deploy равен нулю только тогда, когда сборка действительно
применилась.
Установка
pipx install elemctl # или: pip install elemctl
pip install "elemctl[mcp]" # с MCP-сервером
Нужен Python 3.10 или новее. У ядра и CLI нет внешних зависимостей: только стандартная библиотека.
Быстрый старт
# список приложений
elemctl apps list
# карточка приложения (статус, uri, фактическая версия проекта)
elemctl apps get <app-id>
# создать приложение, только если его ещё нет:
# {"id": ..., "created": true|false, "sign-in": ...} - последнее поле это способ войти
# --wait дожидается приложения И проверяет, на какой сборке оно правда работает
elemctl apps ensure acme-crm-dev --project-id <project-id> --latest-build --wait
# полный цикл деплоя из исходников с проверкой применения
elemctl deploy --app-id <app-id> --project-id <project-id> --project-dir acme/crm
# скомпилировать исходники на сервере, не трогая рабочее приложение:
# ok и ошибки с файлом, строкой и колонкой; за собой убирает
elemctl probe --project-dir acme/crm
# данные для сессии отладки: {"debug-token": ..., "debug-address": ...}
# (нужна включённая отладка на сервере: config/debug.yml enabled: true)
elemctl apps debug <app-id>
# только собрать архив .xasm, никуда не загружая
elemctl build --project-dir acme/crm --output ./dist
# разобрать готовый архив: манифест, подсистемы, глобальные типы с полными именами
elemctl inspect ./dist/e1c-CurrencyConverter-2.0.xlib
# запретить вход по паролю и саморегистрацию в списке пользователей приложения
elemctl user-lists password-login --app crm-dev --disable
elemctl user-lists self-registration --app crm-dev --disable
# принять изменения ветки среды разработки
elemctl branches merge <branch-id>
Все команды пишут JSON в stdout, а прогресс длительных операций – в stderr.
Ошибка возвращается JSON-объектом с полем error и кодом возврата 1.
Флаг --json делает это соглашение гарантией для скриптов, и ставить его
можно в любой позиции. На время работы команды stdout подменяется на stderr,
поэтому в настоящий stdout уходит только JSON ответа. Посторонняя строка туда
не попадёт ни из плагина, ни из библиотеки. Читайте поток целиком через
json.load, а не ищите в нём первую скобку. Отказ с --json тоже уходит в
stderr, и stdout остаётся пустым: текст в машинном канале конвейер принял бы
за ответ.
Флаг --quiet, который тоже можно ставить в любой позиции, глушит поток хода
работы: в stderr не идут ни строки прогресса, ни предупреждения, а ответ и
отказ остаются на своих местах. Форма ответа от него не меняется. Кто сливает
оба потока в один, получает только ответ.
apps list и builds list печатают счётчик и отметку об усечении после
ответа. У остальных строк в stderr порядок не гарантирован, так что разбирать
безопасно только сам stdout, отдельно от stderr.
Полный список команд даёт elemctl --help, по группам – elemctl apps --help,
elemctl deploy --help и так далее.
Рядом
- XBSL – всё, что происходит с исходниками до
развёртывания: линтер с автоправками, LSP-сервер, заготовки метаданных и расширение
VS Code. Кнопка в заголовке редактора запускает оттуда
elemctl deploy. - EDT-Bridge – соседняя платформа: мост MCP внутрь 1С:EDT для конфигураций 1С:Предприятия.
Ограничения и статус
- Инструмент неофициальный, с фирмой “1С” он не связан. Console API может меняться без предупреждения.
- elemctl обращается только к документированному Console API v2. Внутренние API консоли платформы он не вызывает и не описывает.
- На части конфигураций платформы приложение, созданное по одному
--project-id, получается пустым каркасом без данных проекта. Надёжнее создавать его от сборки:elemctl apps create <имя> --project-id <id> --latest-build. MCP-инструментcreate_appподставляет последнюю сборку сам. После создания идётelemctl deploy. - Приложение, созданное со статусом
Error, платформа сопровождает общим текстом “Неизвестная ошибка. Обратитесь к администратору”. Подробности лежат в задаче приложения: файлы, строки и колонки ошибок компиляции.apps create --waitиapps ensureпечатают их следом за общим текстом, как это давно делаютdeployиverify, так что ходить за причиной в журнал сервера не нужно. СтатусомErrorкончается не всякий сбой: неудачное применение откатывается на прежнюю сборку, и приложение поднимается в статусеRunning. Поэтому--waitзаодно проверяет, на какой сборке приложение работает на самом деле, и отвечает кодом возврата 1, когда сборка не та, которую просили. Ключ--no-verifyвозвращает простое ожидание. - Скомпилировать исходники, ничего не создавая на платформе, нельзя:
компиляция серверная и происходит при применении сборки. Для этого и есть
probe: он подставляет одноразовое приложение вместо рабочего. Один запуск стоит столько же времени, сколько создание приложения, то есть минуты. Поэтому место ему перед развёртыванием или в CI, а не в цикле “на каждое нажатие”. - Проект платформы опознается по
ИдизПроект.yaml. Сборка, загруженная без ид проекта, попадает в проект с ееИд, какая бы параVendor+Nameни стояла в манифесте, и переименовывает этот проект по себе.builds uploadназывает этот проект в ответе и предупреждает, если загрузка его переименовала. Пара лишь должна быть свободна: новыйИдс парой, которую уже держит другой проект, платформа отклоняет с 409. - В только что созданное приложение входят учётной записью панели
управления. Приложение получает собственный пустой список пользователей,
вход по логину и паролю у него выключен, а сервис учётных записей не
подключён. Поэтому учётные записи, которыми входят в другие приложения,
здесь не работают. Этого не меняют ни подключение чужого списка
пользователей, ни включение локального входа.
apps createиapps ensureговорят это сами: полеsign-inв ответе и тот же текст в stderr. - Удалённые приложения остаются в списке платформы со статусом
Deletedи прежнимid. На этомidкомандыapps getиdeployотвечают 404.apps findиapps ensureтакие приложения пропускают. Прежний поиск возвращаетapps find --include-deleted. - Приложение с неопубликованными правками в среде разработки платформа
удалить не даёт и отвечает HTTP 400
FAILED_PRECONDITION. Принудительного удаления в Console API нет, остаётся панель управления. elemctl подсказывает это в тексте ошибки. - Если приложение пересоздать, то есть удалить и создать заново, у него сменится URL. Внешние настройки, завязанные на адрес, вроде OIDC redirect, придётся обновить. “Мягкой” очистки данных приложения в Console API нет, её делают в консоли управления.