Skip to main content

Answer42 — The Answer to Life, Universe, and 1C — UI Driver. MCP-powered 1C:Enterprise UI automation: click, fill, navigate, test, and introspect managed forms through the test-client API

Project description

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.

Установка skills

PyPI-пакет не записывает agent skills в пользовательские каталоги автоматически. После установки Answer42 поставьте bundled skills отдельной командой:

answer42 install-skills

По умолчанию команда устанавливает answer42 и answer42-rag в OpenClaw:

~/.openclaw/workspace/skills

Другие агенты и варианты установки:

answer42 install-skills --agent claude
answer42 install-skills --agent codex
answer42 install-skills --agent opencode
answer42 install-skills --agent pi
answer42 install-skills --agent hermes
answer42 install-skills --agent all
answer42 install-skills --target-dir /path/to/skills
answer42 install-skills --list-agents
answer42 install-skills --dry-run --agent all

Для агентов без стабильного стандарта skill-директорий (codex, opencode, pi, hermes) presets best-effort. Если конкретная установка использует другой путь, укажите --target-dir явно.

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

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

Коротко:

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

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

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

export ONEC_MCP_CREDENTIALS_FILE=/secure/path/credentials.json

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

~/.answer42-credentials.json

Формат файла:

{
  "entries": [
    {
      "url": "https://example.invalid/infobase",
      "username": "<USERNAME>",
      "password": "<PASSWORD>"
    },
    {
      "url": "https://*.example.invalid/*",
      "username": "<WILDCARD_USERNAME>",
      "password": "<WILDCARD_PASSWORD>"
    }
  ]
}

Рекомендуемые права на файл: 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; логины и пароли не возвращаются. Tool credentials_list() оставлен в коде для локальной диагностики, но в OpenClaw-конфигурации его рекомендуется скрывать через toolFilter.exclude, чтобы агент не мог получить список URL-шаблонов.

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

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

Требования

  • Python 3.11+
  • 1С:Предприятие 8.3.27+ или 8.5+
  • Пакеты Python: mcp, websockets, pydantic; для скриншотов — mss
  • Linux/X11: python-xlib/wmctrl/xdotool, GUI/Xvfb для headless-сервера
  • Windows: интерактивная пользовательская desktop-сессия; window-control и screenshots работают через WinAPI/mss

Проверяйте наличие платформы 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 config import (приоритетный способ) или через Конфигуратор/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

start_session автоматически собирает build/MCPTestManager.cf, если файл отсутствует или XML-исходники src/cf/ новее. Встроенный demo-клиент аналогично собирает build/MCPTestClient.cf из src/client_cf/. E2E-сценарий также пересобирает build/MCPTestClient.cf, чтобы тесты не использовали устаревший артефакт.

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.

Ограничения

  • Форма пользовательской настройки «Изменить форму» частично недоступна для надёжной автоматизации через API клиента тестирования. В частности, команда «Добавить поля» в верхней панели формы настройки может быть видна на скриншоте и в диагностическом тексте, но не нажиматься как обычная ТестируемаяКнопкаФормы: click_button может не находить её, а activate_object может вернуть activated=true без открытия диалога добавления полей.

Лицензия

MIT

Copyright

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

Licensed under the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

answer42-0.2.30.tar.gz (597.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

answer42-0.2.30-py3-none-any.whl (164.8 kB view details)

Uploaded Python 3

File details

Details for the file answer42-0.2.30.tar.gz.

File metadata

  • Download URL: answer42-0.2.30.tar.gz
  • Upload date:
  • Size: 597.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for answer42-0.2.30.tar.gz
Algorithm Hash digest
SHA256 00a775856ff34be1e50591bee33c7cb338abc08c1dce2372c0a62eabcc72dd62
MD5 5de0efdf33e2500dfab672d01941dba6
BLAKE2b-256 881a8635e87c7d0b7528ed9403850085196ec572acca231e7e7cf08d989855b1

See more details on using hashes here.

File details

Details for the file answer42-0.2.30-py3-none-any.whl.

File metadata

  • Download URL: answer42-0.2.30-py3-none-any.whl
  • Upload date:
  • Size: 164.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for answer42-0.2.30-py3-none-any.whl
Algorithm Hash digest
SHA256 8316322c3de5cbaeb9ac725e0be7ad3b78a011997907137c7e300e879b51f0ec
MD5 03489403a8320b28cec3bd63595e2572
BLAKE2b-256 345a55c3c982d9ed01efc02c71972be5fc3b917f237e67d6b43d390f80df4ad0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page