The Answer to Life, Universe, and 1C — UI Driver

Answer42

by Platform42

Answer42

Answer42 logo

Answer42 — MCP-инструмент для интерактивного управления UI 1С:Предприятия через клиент тестирования. Он позволяет AI-агенту открывать формы 1С, нажимать кнопки, заполнять поля, выбирать ссылки из форм выбора, работать с таблицами, динамическими списками и табличными документами.

The Answer to Life, Universe, and 1C — UI Driver

Проект даёт AI-агенту три способности:

  1. Интерактивное управление UI 1С — открыть форму, кликнуть кнопку, активировать поле, заполнить значение, выбрать строку, провести сценарий через /TESTMANAGER + /TESTCLIENT.
  2. Доказательная запись клиентского тестирования — записывать аннотированные PDF-слайды с MCP method/request/response и скриншотами окна 1С.
  3. RAG-индекс метаданных — локальный SQLite/FTS индекс конфигураций 1С (EDT, XML-выгрузка Конфигуратора, base + extensions), включая подсказки для ui_tree и dynamic-list settings.

Быстрый старт


# Рекомендуется для обычной установки из PyPI

pipx install 'answer42[screenshot,linux-window-control]'



# Альтернатива без pipx

python3 -m venv .venv

. .venv/bin/activate

pip install 'answer42[screenshot,linux-window-control]'



# Разработка из git checkout

pip install -e '.[screenshot,dev,linux-window-control]'



# Windows: запускать из интерактивной пользовательской сессии, не как service

# pipx install "answer42[screenshot,windows-window-control]"

# pip install "answer42[screenshot,windows-window-control]"



# Запуск MCP-сервера (transport: stdio)

answer42 --ws-host 127.0.0.1 --ws-port 8765

Запуск сессии и подключение тестируемой базы выполняются одним MCP-вызовом:


start_session(

  session_id="my-session",

  base_url="<TARGET_INFOBASE_URL>",

  idle_timeout_minutes=60,

  execute="/path/to/external.epf",  # опционально: /Execute

  command_parameter="InitScenario" # опционально: /C

)

start_session определяет версию 1С по base_url, поднимает инфраструктуру Answer42 (на Linux — Xvfb, если нужен headless; на Windows — интерактивная desktop-сессия), свободные порты, WebSocket bridge, файловую базу менеджера и test-manager. Если доступны серверные компоненты 1С (ibsrv), менеджер и встроенная тестовая база публикуются через автономный сервер; если доступен только тонкий клиент и ibcmd, Answer42 автоматически использует fallback file-direct (/F) для файловых баз менеджера и клиента. После idle_timeout_minutes минут неактивности сессия автоматически завершается; значение по умолчанию — 60 минут. Для запуска клиента можно передать extra_args, execute (параметр командной строки /Execute) и command_parameter (параметр /C); если /C уже указан в extra_args, значения склеиваются через ;.

Логин/пароль рекомендуется не передавать явно: start_session умеет брать их из локального credentials-файла по base_url. Параметры username/password остаются в API для разовых сценариев и обратной совместимости, но при передаче в MCP-вызове они видны вызывающему агенту в аргументах tool-call.

ui_tree profiles and output formats

ui_tree is optimized for form-structure diagnostics. The default profile="navigation" returns a compact visible UI tree without data presentations, RAG enrichment, or command-panel subtrees. The tree is not depth-limited.

Useful modes:

Large ui_tree snapshots as resources

By default delivery="auto" keeps small results inline and automatically stores large results as resources when the estimated token count exceeds ONEC_MCP_UI_TREE_RESOURCE_AUTO_THRESHOLD_TOKENS (default 50k). Use delivery="inline" to force the selected JSON/outline/yaml directly in the response. Use delivery="resource" to force resource storage for large diagnostics:


r = ui_tree(profile="full", include_hidden=true, delivery="resource")

When auto switches to resource, or when delivery="resource" is forced, the inline response contains only resource_uri, snapshot_id, summary, metrics, byte size, estimated tokens, threshold reason and a small preview. The full JSON snapshot is stored under the Answer42 runtime data directory and registered as an MCP resource (answer42://ui-tree/<session>/<snapshot_id>). Do not load that whole resource into the agent context unless you really need the raw file; use targeted snapshot tools instead:

index_path is the preferred stable address inside one snapshot. path is human-readable and useful for reports, but less reliable when several controls have the same captions.

Встроенные рекомендации для агентов

Answer42 больше не поставляет и не устанавливает bundled skills. Рекомендации по UI-автоматизации, RAG, Универсальному отчёту и экспорту табличных документов находятся в descriptions соответствующих MCP-инструментов и встроенных MCP prompts.

Команды answer42 install-skills и answer42 skills-install сохранены как совместимые no-op: они ничего не копируют и выводят сообщение о новой модели.

Инструкция для AI-агентов

Если вы AI-агент и пользователь просит установить Answer42, используйте отдельную инструкцию: docs/agent-installation.md.

Коротко:

  1. установите пакет через pipx или virtualenv;
  2. подготовьте ONEC_MCP_CREDENTIALS_FILE вне репозитория;
  3. зарегистрируйте MCP-сервер в агентском клиенте;
  4. проверьте установку через credentials_check, затем smoke-сессию start_sessionactive_windowstop_session.

Linux display prerequisite

На Linux start_session использует живую X11-сессию, если процесс Answer42 унаследовал непустой DISPLAY: test manager и test client запускаются на этом дисплее, поэтому их окна и скриншоты видны на desktop.

Если DISPLAY не задан (headless service, SSH без X11 forwarding и т. п.), Answer42 поднимает два собственных изолированных Xvfb-дисплея: один для test manager и второй для test client. В этом режиме пакет xvfb обязателен:


# Debian / Ubuntu

sudo apt install xvfb



# Fedora / RHEL

sudo dnf install xorg-x11-server-Xvfb

Если не задан ни доступный DISPLAY, ни Xvfb, start_session завершается до создания ресурсов с понятной подсказкой по установке. Чтобы desktop-сервис видел живой X11, его launcher/service должен передать корректный DISPLAY и права доступа к X server (обычно через XAUTHORITY).

Скриншоты: stdio и StreamableHTTP

screenshot сохраняет PNG на MCP-хосте и больше не помещает его base64-представление в результат tool-call.

Транспорты: stdio и StreamableHTTP

По умолчанию Answer42 использует stdio MCP transport (запускается MCP-хостом как subprocess). Для удалённого deployment доступен StreamableHTTP режим с MCP auth:


answer42 --http --http-host 0.0.0.0 --http-port 8080 \

  --http-token "static-secret-token" \

  --http-account-id "tenant-42"

Переменные окружения:


export ONEC_MCP_HTTP=1

export ONEC_MCP_HTTP_HOST=0.0.0.0

export ONEC_MCP_HTTP_PORT=8080

export ONEC_MCP_HTTP_TOKEN="static-secret-token"

export ONEC_MCP_ACCOUNT_ID="tenant-42"

answer42

Безопасное хранение логинов и паролей

Чтобы креды были доступны MCP-серверу, но не попадали в чат и аргументы tool-call, храните их в локальном файле за пределами репозитория и передайте путь в окружение процесса Answer42:


export ONEC_MCP_CREDENTIALS_FILE=/secure/path/credentials.json

Если переменная окружения не задана, MCP-сервер читает файл по умолчанию:


~/.answer42-credentials.json

Формат файла v2 (аккаунт-bound):


{

  "version": 2,

  "accounts": {

    "tenant-42": {

      "entries": [

        {

          "url": "https://example.invalid/infobase",

          "username": "<USERNAME>",

          "password": "<PASSWORD>",

          "title": "dev-example",

          "aliases": ["dev42"]

        },

        {

          "url": "https://*.example.invalid/*",

          "username": "<WILDCARD_USERNAME>",

          "password": "<WILDCARD_PASSWORD>",

          "title": "wildcard-example",

          "aliases": ["we"]

        }

      ]

    }

  }

}

Устаревший v1 формат (flat entries) автоматически загружается в account legacy и мигрирует в v2 при следующем сохранении. Рекомендуется явно задать account_id (через HTTP auth claim или ONEC_MCP_ACCOUNT_ID в stdio) и перенести записи в соответствующий account.

Рекомендуемые права на файл: 0600.

Правила матчинга внутри аккаунта: сначала точное совпадение url, затем wildcard (*, ?) через fnmatch; первое совпадение побеждает. Пароли не логируются и не возвращаются наружу.

Для сохранения или обновления записи можно использовать MCP-tool:


credentials_save(

  url="<TARGET_INFOBASE_URL>",

  username="<USERNAME>",

  password="<PASSWORD>"

)

Для удаления записи:


credentials_remove(url="<TARGET_INFOBASE_URL>")

Для проверки, что для адреса есть сохранённые креды, используйте MCP-tool:


credentials_check(base_url="<TARGET_INFOBASE_URL>")

Ответы этих tools содержат только факт наличия/изменения/удаления записи и URL; логины и пароли не возвращаются. credentials_list() дополнительно показывает статус проверки (verified / verification_status): новые или изменённые записи сохраняются как unverified, после успешного start_session с этой учёткой помечаются как verified, а unverified запись удаляется при ошибке авторизации. Tool credentials_list() оставлен в коде для локальной диагностики, но в OpenClaw-конфигурации его рекомендуется скрывать через toolFilter.exclude, чтобы агент не мог получить список URL-шаблонов.

Остановка сессии:


stop_session(session_id="my-session", clean_data=False)

Требования

Проверяйте наличие платформы 1С в стандартных каталогах: Linux /opt/1cv8/x86_64/<version>/ и /opt/1cv8/i386/<version>/; Windows C:\Program Files\1cv8\<version>\bin\ и C:\Program Files (x86)\1cv8\<version>\bin\; macOS /Applications/1cv8/<version>/ или /opt/1cv8/<version>/. Для штатной работы нужны 1cv8c и ibcmd; ibsrv желателен, но при его отсутствии Answer42 может использовать fallback /F. Если автоопределение ошиблось, задайте ONEC_PLATFORM_DIR. Для очень медленного старта web-клиента можно увеличить ONEC_MCP_TEST_CLIENT_READY_TIMEOUT и timeout MCP-клиента; по умолчанию Answer42 ждёт открытия -TPort 55 секунд и затем отдаёт явную ошибку с логами клиента.

Безопасность стендов и учётных данных

В репозитории не должно быть реальных URL стендов, логинов или паролей. Для штатного запуска передавайте только base_url, а логин/пароль храните в локальном credentials-файле, доступном процессу Answer42 через ONEC_MCP_CREDENTIALS_FILE.

start_session всё ещё принимает username и password напрямую для разовых сценариев и обратной совместимости. Используйте это только когда осознанно готовы раскрыть значения вызывающему агенту: параметры MCP-вызова могут попасть в историю чата, логи клиента или отладочный вывод. Если вместо реального пароля передан редактированный плейсхолдер из звёздочек (***, ******** и т.п.), Answer42 остановит запуск с явной ошибкой: нужно указать настоящий пароль или сохранить корректные креды через credentials_save().

Примеры в документации используют только плейсхолдеры (<TARGET_INFOBASE_URL>, <USERNAME>, <PASSWORD>). Перед публикацией артефактов проверяйте, что параметры вызовов заредактированы: recorder маскирует ключи вроде password, но URL и логин тоже не должны попадать в публичные материалы.

Архитектура

Поток выполнения:

  1. MCP-клиент вызывает tools через stdio MCP.
  2. Answer42 принимает MCP-вызовы и передаёт команды в WebSocket bridge.
  3. 1С test manager подключается к bridge и выполняет BSL-dispatch.
  4. Test manager управляет 1С test client через API ТестируемоеПриложение.
  5. Test client выполняет интерактивные операции в целевой информационной базе.

Подробнее: docs/architecture.md.

Сборка конфигураций 1С

Конфигурация менеджера тестирования собирается из XML-исходников src/cf/ через временную файловую ИБ: ibcmd infobase config import и затем ibcmd config save (приоритетный способ). Такой путь создаёт переносимый .cf с compatibility mode XML-исходников; Конфигуратор/DESIGNER используется как fallback, если ibcmd отсутствует:


python scripts/build_cf.py src/cf build/MCPTestManager.cf

PowerShell:


python scripts/build_cf.py src/cf build/MCPTestManager.cf

Тестовая конфигурация для E2E собирается из XML-исходников src/client_cf/:


python scripts/build_cf.py src/client_cf build/MCPTestClient.cf

PowerShell:


python scripts/build_cf.py src/client_cf build/MCPTestClient.cf

В Git хранятся только XML-исходники; CF — генерируемые артефакты. start_session использует build/MCPTestManager.cf только при точном совпадении content fingerprint с src/cf/; иначе автоматически пересобирает его локальной выбранной платформой. Встроенный demo-клиент аналогично работает с build/MCPTestClient.cf и src/client_cf/. Релизный wheel получает оба CF из GitLab CI, где они собираются закреплённой платформой 1С 8.3.27.2342.

E2E можно запускать целиком или по независимым сценариям:


python3 scripts/e2e_stable.py                         # full

E2E_SCENARIO=smoke python3 scripts/e2e_stable.py       # быстрый smoke

E2E_SCENARIO=dynamic python3 scripts/e2e_stable.py     # legacy: таблицы/dynamic-list/отчёт

E2E_SCENARIO=dynamic-tables python3 scripts/e2e_stable.py

E2E_SCENARIO=dynamic-lists python3 scripts/e2e_stable.py

E2E_SCENARIO=dynamic-reports python3 scripts/e2e_stable.py

E2E_SCENARIO=coverage python3 scripts/e2e_stable.py    # diagnostic/negative tools

Для реального распараллеливания сценарий умеет сам запустить пять разные сессий (smoke, dynamic-tables, dynamic-lists, dynamic-reports, coverage), а не копии одного и того же теста. Встроенная тестовая файловая база публикуется через один общий ibsrv, когда серверные компоненты доступны; без ibsrv demo-клиент запускается через file-direct (/F):


E2E_PARALLEL=1 E2E_SESSION_ID=e2e-split python3 scripts/e2e_stable.py

start_session также переиспользует общий автономный сервер для одинаковой файловой базы. Последний stop_session освобождает refcount и завершает shared ibsrv.

Ограничения

Лицензия

MIT

Copyright (c) 2026 Kosolapov Stanislav aka proDOOMman <prodoomman@gmail.com>, Marvin (AI Assistant), 42Clouds, and contributors.

Licensed under the MIT License.