HTTP MCP-шлюз для 1С с dashboard
onec-mcp-universal
Единый MCP-сервер для работы с 1С:Предприятие из AI-ассистентов и любых MCP-клиентов
Один адрес http://localhost:8080/mcp вместо нескольких отдельных MCP-подключений. Шлюз принимает запросы от AI и маршрутизирует их к нужному бэкенду. Каждый сеанс AI-ассистента работает со своей активной базой данных независимо (per-session routing).



Содержание
- Возможности
- Дизайн workflow-слоя
- Context Guard и продолжение сессии
- Архитектура
- Требования
- Быстрый старт
- Установка на Linux
- Установка на Windows
- Подключение к AI-ассистенту
- Подключение базы 1С
- Обработка MCPToolkit.epf
- Работа с несколькими базами
- Удалённое подключение
- Примеры команд AI
- Запросы к данным
- Выполнение кода
- Метаданные
- Валидация запросов
- Журнал регистрации
- Права доступа
- Поиск использований и ссылки
- Навигация по BSL
- Поиск по BSL-коду
- Запись BSL-кода
- Поиск по ИТС (1С:Напарник)
- Документация платформы
- Важные live-контракты MCP-инструментов
- Анонимизация данных
- Профилирование запросов
- Кеш метаданных
- Переиндексирование
- Управление базами
- Статус сервера
- Выгрузка исходников
- Граф зависимостей (опционально, встроенный профиль
bsl-graph)
- Web UI дашборд
- Настройка 1С:Напарник
- Опциональные модули
- Скилы 1С для Codex и совместимых локальных skill-runner'ов
- Диагностика
- Обновление
- GitHub Packages
- Используемые проекты
- Удаление
- Лицензия
Возможности
40+ MCP-инструментов + 1 ресурс:
| Категория | Кол-во | Описание |
|---|---|---|
| Данные 1С | 8 | Запросы к БД, выполнение кода, метаданные, журнал регистрации, права, ссылки |
| Документация платформы | 5 | Поиск по API встроенного языка 1С, методы типов, конструкторы |
| Навигация по BSL | 14 | Символы, определения, граф вызовов, диагностика, переименование |
| Поиск по BSL | 2 | bsl_index + bsl_search_tool -- полнотекстовый поиск по процедурам/функциям |
| Запись BSL | 1 | write_bsl -- запись BSL-модулей в проект с автопереиндексацией |
| ИТС / 1С:Напарник | 0-1 | its_search -- поиск по документации ИТС через API 1С:Напарника (появляется при NAPARNIK_API_KEY) |
| Анонимизация | 2 | enable_anonymization / disable_anonymization -- маскировка ПД (152-ФЗ) |
| Кеширование | 1 | invalidate_metadata_cache -- управление кешем метаданных (TTL 10 мин) |
| Профилирование | 1 | query_stats -- статистика производительности запросов |
| Управление и граф | 12 | Статус сервера, подключение баз, валидация запросов, переиндексация, граф зависимостей |
MCP-ресурс: syntax_1c.txt -- справочник синтаксиса BSL для контекста AI.
Ключевые особенности:
- Per-session routing -- каждый сеанс MCP-клиента работает со своей активной БД независимо
- Автоподключение из EPF -- нажмите "Подключиться" в обработке, база зарегистрируется автоматически
- Удалённое подключение -- шлюз на сервере 1С, AI-ассистент на рабочей станции разработчика
- Анонимизация ПД -- маскировка ФИО, ИНН, СНИЛС, телефонов, email со стабильным hash-маппингом
- 1С:Напарник -- поиск по ИТС через API code.1c.ai
- BSL полнотекстовый поиск -- индекс по процедурам/функциям конфигурации
- Профилирование запросов -- автоматический замер времени + подсказки по оптимизации
- Кеширование метаданных -- TTL-кеш для get_metadata (10 мин по умолчанию)
- Web UI дашборд -- визуальная панель на
http://localhost:8080/dashboardс документацией, двуязычная (RU/EN) - Интерактивный веб-просмотрщик графа -- на
http://localhost:8888/(профильbsl-graph): cytoscape.js-канвас, drill-down двойным кликом, поиск по нескольким словам (размеры пособий→РазмерыГосударственныхПособий), история поиска, панель со списком результатов, выбор активной БД радиокнопками. Та же slate-палитра что у дашборда - Редактирование .env -- прямо из дашборда с автоперезапуском шлюза
- 96 скилов для Codex и совместимых локальных skill-runner'ов -- создание объектов, форм, обработок, отчётов, расширений + workflow-оркестрация
- Stateful MCP-сессии -- idle timeout 8 часов
- Параллельная выгрузка BSL -- несколько баз выгружаются одновременно, каждая в свою папку
{BSL_WORKSPACE}/{slug}/, отмена и индексация независимы - Атомарная выгрузка через staging-каталог -- 1cv8 пишет во временную скрытую папку, по завершении атомарно переименовывается в целевую, предыдущая рабочая копия не затирается при сбое
- Deferred LSP start -- LSP-контейнер поднимается только после первой успешной выгрузки BSL, без пустых подпапок в workspace до экспорта
- Безопасная политика экспорта -- если host export service недоступен, шлюз делает hard-fail; контейнерный
1cv8включается только приALLOW_CONTAINER_DESIGNER_EXPORT=true - Адаптивный таймаут -- 1 час для localhost, 3 часа для удалённых серверов
- Автоподбор версии 1cv8 -- при несовпадении версии клиента и сервера хостовый сервис автоматически повторяет выгрузку с нужной версией платформы
- Авто-обновление статуса EPF на дашборде -- индикатор подключения обработки обновляется раз в 5 секунд без перезагрузки страницы
- MCP-совместимые ошибки -- tool errors с
isError: trueпо спецификации MCP - Потокобезопасные бэкенды -- asyncio.Lock для защиты состояния соединений
- Защита от path traversal -- валидация путей в API файлового браузера
- Защита mutating HTTP API токеном --
GATEWAY_API_TOKENдля/api/action/*,/api/register,/api/unregister,/api/export-* - Потокобезопасный реестр БД -- threading.Lock для защиты состояния регистрации
- Кросс-платформенный Docker -- host network на Linux, bridge на Windows/macOS
- README / CODEX.md -- нейтральная документация по эксплуатации + отдельная памятка для Codex
- docker-control sidecar -- gateway больше не получает
docker.sock, все lifecycle-операции идут через внутренний HTTP-контур - Защищённый
docker-control-- sidecar принимает/api/*только сAuthorization: Bearer ..., общий секрет хранится вDOCKER_CONTROL_TOKEN - Loopback/internal-only
docker-control-- на Linux sidecar опубликован только на127.0.0.1:8091, а на Windows/macOS host port8091не публикуется вовсе - Persistent anonymizer salt -- стабильное маскирование ПД теперь привязано к отдельному секрету
ANONYMIZER_SALT, который генерируетсяsetup.shи маскируется в дашборде - Dangerous toolkit path works with EPF approvals out of the box -- toolkit по умолчанию пропускает dangerous write/exec команды до
MCPToolkit.epf, а фактическое разрешение задаётся галочками и диалогом подтверждения в самой обработке - Rate limiting для REST/дашборда --
GATEWAY_RATE_LIMIT_*защищают/api/*и/dashboard*, не затрагивая/mcpи/health - Работает БЕЗ установки 1С -- platform-context опциональный (Docker profile), gateway стартует с одним onec-toolkit
- Windows: автозапуск экспорт-сервиса -- Scheduled Task, переживает перезагрузку
- Empty placeholder volumes --
data/empty-*папки убирают ошибки Docker при отсутствии Linux-путей - 1100+ автоматических тестов, CI/CD через GitHub Actions
- Coverage gate в CI:
line+branch >= 94%
Локальный запуск тестов
python3 -m venv .venv
.venv/bin/pip install -r gateway/requirements-dev.txt
cd gateway
../.venv/bin/bash ./scripts/test.sh
На Linux с PEP 668 используйте локальное виртуальное окружение. ./scripts/test.sh выполняет preflight-проверку pytest-asyncio и даёт явную ошибку, если dev-зависимости не установлены.
Дизайн workflow-слоя
План интеграции UX-слоя и workflow-слоя поверх текущей технической базы описан в документе:
Документ покрывает:
- экспертные skill-алиасы (
epf-expert,erf-expert,mxl-expert,inspect,validate) - инициализация проекта (
1c-project-init,templates/mcp.json) - Context Guard (
PostToolUsehook + мониторинг 70%/85%) - продолжение сессии (
session-save/restore/retro) - Native-дизайн
1c-feature-devпод стекonec-mcp-universal - слой оркестрации процессов:
brainstorm,write-plan,openspec-proposal,openspec-apply,openspec-archive - Совместимость с распространёнными входными точками:
1c-help-mcp,bsp-patterns,img-grid,role-expert,subsystem-expert,subagent-dev,1c-test-runner,1c-web-session,playwright-test - Пример сквозного жизненного цикла фичи:
docs/feature-lifecycle-example.md
Context Guard и продолжение сессии
Что добавлено
- Скрипты мониторинга контекста:
tools/context-monitor.sh,tools/context-monitor.ps1 - Пороги предупреждений:
70%и85%использования контекста - Session-скилы:
/session-save,/session-restore,/session-retro
Как подключить context-monitor (Linux/macOS)
Пример для PostToolUse hook в конфиге AI-ассистента:
bash ./tools/context-monitor.sh
Опциональные переменные:
MAX_TOKENS(по умолчанию200000)WARN_PERCENT(по умолчанию70)CRITICAL_PERCENT(по умолчанию85)
Как подключить context-monitor (Windows PowerShell)
powershell -ExecutionPolicy Bypass -File .\tools\context-monitor.ps1
Параметры:
-MaxTokens(по умолчанию200000)-WarnPercent(по умолчанию70)-CriticalPercent(по умолчанию85)
Шаблон инициализации проекта
- Используйте
/1c-project-initдля локальной инициализации проекта. - Шаблон MCP-конфига находится в
templates/mcp.jsonи копируется в.mcp.jsonпроекта без перезаписи существующего файла.
Архитектура
MCP clients / Codex
| HTTP :8080/mcp (Streamable HTTP)
| (Mcp-Session-Id -> per-session routing)
v
+----------------------------------------------+
| onec-mcp-gw (Python, host network) |
| non-root runtime, no direct docker.sock |
| internal Docker API -> docker-control |
| |
| Статические бэкенды: |
| +- onec-toolkit :6003 (HTTP) |
| +- platform-context :8081 (SSE) |
| |
| Динамические бэкенды (per-DB): |
| +- onec-toolkit-{db} :6100+ (HTTP) |
| +- mcp-lsp-{db} (stdio) |
| |
| Модули шлюза: |
| +- anonymizer -- маскировка ПД |
| +- metadata_cache -- кеш метаданных |
| +- profiler -- замер запросов |
| +- bsl_search -- индекс BSL |
| +- naparnik_client -- API 1С:Напарника |
| +- web_ui -- /dashboard |
| |
| Per-session routing (idle 8h) |
| /data/db_state.json <- persistence |
+----------------------------------------------+
|
v
+---------------------------+
| onec-mcp-docker-control |
| only service with |
| /var/run/docker.sock |
+---------------------------+
^ ^ ^
| | |
MCPToolkit.epf | https://code.1c.ai
(клиент 1С) | (1С:Напарник API)
|
/dashboard
(Web UI)
Per-session routing: каждый AI-клиент получает уникальный Mcp-Session-Id. Шлюз маршрутизирует запросы к активной базе данных этой сессии. Разные сеансы Codex и других MCP-клиентов могут одновременно работать с разными базами. Idle timeout сессий -- 8 часов.
| Контейнер | Образ | Роль |
|---|---|---|
| onec-mcp-gw | Собирается локально | MCP-шлюз, маршрутизация, per-session routing |
| onec-mcp-docker-control | Собирается локально | Внутренний sidecar для lifecycle Docker-контейнеров, диагностики и LSP proxy |
| onec-mcp-toolkit | roctup/1c-mcp-toolkit-proxy | Статический бэкенд данных |
| onec-mcp-platform | ghcr.io/alkoleft/mcp-bsl-platform-context | Документация платформы |
| onec-toolkit-{db} | roctup/1c-mcp-toolkit-proxy | Динамический бэкенд данных (per-DB) |
| mcp-lsp-{db} | mcp-lsp-bridge-bsl | BSL Language Server (per-DB) |
Требования
- Docker 24+ и Docker Compose v2 — установить
- Codex CLI (
codex) — для автоматической регистрации MCP и локальной установки skills - Linux (Ubuntu 22.04+) или Windows 10/11 с Docker Desktop (WSL2)
- Платформа 1С:Предприятие 8.3, установленная на хосте
- Информационная база 1С (серверная или файловая)
Быстрый старт
Linux
git clone https://github.com/AlekseiSeleznev/onec-mcp-universal.git
cd onec-mcp-universal
./setup.sh
# или сразу с графом зависимостей:
./setup.sh --with-bsl-graph
Windows
Требуется Git for Windows (включает Git Bash) или WSL2.
git clone https://github.com/AlekseiSeleznev/onec-mcp-universal.git
cd onec-mcp-universal
./setup.sh
# или сразу с графом зависимостей:
./setup.sh --with-bsl-graph
Что делает setup.sh
- Проверяет зависимости: Docker, Docker Compose v2, работающий daemon, наличие
codexCLI - Определяет ОС — на Windows/macOS автоматически создаёт
docker-compose.override.ymlизdocker-compose.windows.yml(bridge-сеть; gateway ходит вdocker-controlпо service name) - Создаёт
.envиз.env.example(порт 8080, авто-определение пути к платформе 1С на Linux, абсолютныйBSL_WORKSPACEиBSL_HOST_WORKSPACEвнутри проекта, автоматически сгенерированныеDOCKER_CONTROL_TOKENиANONYMIZER_SALT) - Предупреждает, если порт 8080 занят другим процессом
- Если включён
bsl-lsp-bridge, автоматически собирает локальный образmcp-lsp-bridge-bsl:latestс Java 21-совместимым BSL Language Server - Собирает и запускает core-контур; при
--with-bsl-graphтакже поднимает встроенный локальный профильbsl-graph - Ждёт healthcheck gateway и
docker-control(до 120 секунд — бэкенды стартуют дольше) - Регистрирует MCP-сервер через
codex mcp add— основной Codex-first сценарий
Повторный запуск setup.sh безопасен — он идемпотентен (.env не перезаписывается, MCP-запись пересоздаётся).
После установки проверьте codex mcp list или подключите URL http://localhost:8080/mcp в любом другом MCP-клиенте.
Dashboard: http://localhost:8080/dashboard
Опциональный graph backend: ./setup.sh --with-bsl-graph или docker compose --profile bsl-graph up -d --build
Установка на Linux
1. Предварительные требования
Убедитесь, что установлены Docker и Docker Compose:
docker --version # Docker 24+
docker compose version # Docker Compose v2
Если Docker не установлен, следуйте официальной инструкции.
2. Скачать проект
git clone https://github.com/AlekseiSeleznev/onec-mcp-universal.git
cd onec-mcp-universal
./setup.sh
# если нужен dependency graph:
./setup.sh --with-bsl-graph
Если нужен только ручной запуск без setup.sh, сначала соберите локальный LSP-образ:
./tools/build-lsp-image.sh
docker compose up -d --build
3. Настроить .env при необходимости
setup.sh уже создаёт .env автоматически. При ручном запуске создайте его сами:
cp .env.example .env
Откройте .env и при необходимости укажите путь к платформе 1С:
PLATFORM_PATH=/opt/1cv8/x86_64/8.3.27.2074
Узнать доступные версии:
ls /opt/1cv8/x86_64/
Требования к пакетам 1С для выгрузки BSL. Шлюз запускает 1cv8 DESIGNER для выгрузки исходников. Нужны пакеты common и client (или server) нужной версии. На DEB-системах:
sudo dpkg -i 1c-enterprise-8.3.XX.YYYY-common_*.deb
sudo dpkg -i 1c-enterprise-8.3.XX.YYYY-client_*.deb
Если установлена только одна версия платформы, а сервер 1С работает на другой — шлюз автоматически обнаружит несоответствие версий и повторит выгрузку с правильным клиентом. Для этого установите клиент нужной версии аналогичным способом.
Опционально -- указать API-ключ 1С:Напарника (для поиска по ИТС):
NAPARNIK_API_KEY=ваш-ключ-api
4. Запустить контейнеры
docker compose up -d
Первый запуск: 2-3 минуты (скачивание образов + сборка шлюза). Платформа 1С монтируется из HOST_PLATFORM_PATH (по умолчанию /opt/1cv8) — шлюз автоматически находит нужную версию 1cv8 для выгрузки BSL.
5. Проверить
curl http://127.0.0.1:8080/health
Ожидаемый ответ:
{
"status": "ok",
"backends": {
"onec-toolkit": {"ok": true, "tools": 9},
"platform-context": {"ok": true, "tools": 5}
}
}
После регистрации баз через MCPToolkit.epf или дашборд /health дополнительно показывает per-DB backend'ы, например Z01/toolkit, Z01/lsp, Z02/toolkit, Z02/lsp.
Также можно открыть дашборд в браузере: http://localhost:8080/dashboard
Установка на Windows
На Windows Docker Desktop запускает контейнеры через WSL2. Для доступа из контейнера к host-side export service используется host.docker.internal, а внутренний sidecar docker-control остаётся только в bridge-сети docker compose. Для Windows предоставлен отдельный override-файл docker-compose.windows.yml.
Выгрузка BSL на Windows. Контейнер шлюза работает в Linux (WSL2) и не может запустить
1cv8.exeнапрямую. Для выгрузки BSL нужен отдельный сервис на хосте — см. шаг 3 ниже.
Предварительные требования
- Docker Desktop 4.25+ с включённым WSL2
- Python 3.10+ (установленный на хосте Windows) — только для выгрузки BSL
- Платформа 1С:Предприятие 8.3 (установленная на хосте Windows)
1. Скачать проект
git clone https://github.com/AlekseiSeleznev/onec-mcp-universal.git
cd onec-mcp-universal
2. Запустить установку
./setup.sh
setup.sh на Windows создаёт docker-compose.override.yml, собирает локальный LSP-образ и запускает core-контур через Docker Desktop.
3. Запустить сервис выгрузки на хосте (нужен только для BSL)
python tools\export-host-service.py --port 8082
Сервис запускает 1cv8 DESIGNER в фоне и сразу отвечает на запрос — соединение не зависает на время выгрузки. Оставить окно открытым или настроить как Windows-службу (через nssm или Task Scheduler).
4. Настроить .env при необходимости
Параметры для Windows (выгрузка BSL через хостовый сервис):
EXPORT_HOST_URL=http://host.docker.internal:8082
На Windows закомментируйте
HOST_PLATFORM_PATHиPLATFORM_PATH— платформа установлена на хосте Windows, а не в WSL.
5. Ручной запуск контейнеров с Windows-override
./tools/build-lsp-image.sh
docker compose -f docker-compose.yml -f docker-compose.windows.yml up -d
Этот шаг нужен только если вы не используете ./setup.sh или сознательно перезапускаете стек вручную. Файл docker-compose.windows.yml заменяет network_mode: host на bridge-сеть с service-name routing для docker-control; host port 8091 не публикуется. Первый запуск: 2-3 минуты.
6. Проверить
curl http://127.0.0.1:8080/health
Или откройте в браузере: http://localhost:8080/dashboard
7. Подключить AI-ассистент
Адрес тот же: http://localhost:8080/mcp
Типичные проблемы на Windows
| Проблема | Решение |
|---|---|
| platform-context не стартует | Закомментируйте строку ${HOST_PLATFORM_PATH:-/opt/1cv8}:/opt/1cv8:ro в docker-compose.yml -- на Windows монтирование Linux-путей невозможно |
| Выгрузка BSL не работает | Убедитесь, что запущен export-host-service.py и в .env указан EXPORT_HOST_URL=http://host.docker.internal:8082 |
| Порт 8080 занят | Измените порт в .env: GW_PORT=8090 и используйте http://localhost:8090/mcp |
Подключение к AI-ассистенту
setup.sh регистрирует сервер в Codex автоматически. Для других клиентов — команды ниже.
Как AI-клиент «знает», когда использовать инструменты
После любого подключения сервер на initialize возвращает блок instructions — краткий протокол работы с 1С (какие инструменты вызывать в каком порядке, когда сообщать о недоступности вместо выдумывания кода). Современные MCP-клиенты с поддержкой instructions подмешивают этот блок в системный промпт ассистента автоматически. Общий текст протокола продублирован в AGENTS.md. Готовые сценарии публикуются через MCP prompts/list (connect_and_inspect, describe_object, safe_query, find_usage, bsp_api, reindex_after_export).
Codex
codex mcp add onec-universal --url http://localhost:8080/mcp
Скилы 1С доустанавливаются в ~/.codex/skills/ скриптом install-skills.sh (уже вызван setup.sh).
Cursor / Windsurf / другие Streamable HTTP MCP-клиенты
Любой клиент с поддержкой Streamable HTTP:
http://localhost:8080/mcp
Guidance-блок (instructions) придёт в ответе initialize — никаких дополнительных настроек.
Подключение базы 1С
Базу можно подключить тремя способами.
Способ 1. Из обработки MCPToolkit.epf (рекомендуемый)
- Откройте
1c/MCPToolkit/build/MCPToolkit.epfв клиенте 1С:Предприятие - Нажмите Подключиться -- база зарегистрируется в шлюзе автоматически (Docker-контейнеры создадутся)
- Нажмите Выгрузить BSL -- выгрузка запустится в фоне, обработка не зависнет
- Нажмите Статус выгрузки чтобы проверить завершение выгрузки и дождаться окончания индексации. Пока индекс ещё строится, обработка пишет
Идёт индексация BSL для поиска по коду...; число символов показывается только после реального завершения индексации
Обработку держать открытой во время работы. Имя базы и сервер определяются автоматически.
Способ 2. Из Web UI дашборда
Откройте http://localhost:8080/dashboard, вкладка Настройки -> Добавить базу. Заполните имя, строку подключения и путь к проекту.
Способ 3. Через AI-ассистент
Подключи базу ERP_Test, строка подключения Srvr=server-erp;Ref=ERP_Test;, папка /home/user/projects/ERP_Test
Шлюз создаст два Docker-контейнера: onec-toolkit-ERP_Test (данные) и mcp-lsp-ERP_Test (навигация по коду).
Форматы строки подключения:
| Тип базы | Формат |
|---|---|
| Серверная | Srvr=server-erp;Ref=ERP_Test; |
| С авторизацией | Srvr=server-erp;Ref=ERP_Test;Usr=Ivanov;Pwd=пароль; |
| Файловая | File=/путь/к/базе |
Кириллические и пробельные имена баз поддерживаются. Шлюз автоматически создаёт безопасный slug для Docker-контейнеров (
Бухгалтерия_тестирование→Buhgalteriy_testirovanie), сохраняя оригинальное имя для отображения.
Выгрузка исходников BSL
После подключения базы выгрузите исходники для навигации по коду через кнопку Выгрузить BSL в обработке или командой AI:
Выгрузи исходники конфигурации
Выгрузка использует 1cv8 DESIGNER /DumpConfigToFiles (headless, через xvfb-run). Шлюз автоматически:
- Пишет через staging-каталог -- 1cv8 выгружает в скрытую временную папку
{BSL_WORKSPACE}/.{slug}.staging-<hash>рядом с целевой; по завершении она атомарно переименовывается в{BSL_WORKSPACE}/{slug}. Прерванная выгрузка не затирает предыдущую рабочую копию и не ломает индекс/LSP. Префикс.скрывает staging отlsбез-aи от индексеров, игнорирующих dotfiles - Находит нужный бинарник -- сканирует
/opt/1cv8/x86_64/для всех установленных версий с толстым клиентом (1cv8) - Определяет версию сервера -- при несовпадении версий клиента и сервера извлекает нужную версию из ошибки и повторяет попытку с подходящим бинарником
- Выгружает в фоне -- обработка сразу отвечает и не зависает
- Автоматически индексирует BSL -- после выгрузки запускает полнотекстовое индексирование процедур/функций для
bsl_search_tool - Не публикует промежуточный размер индекса -- пока индексация большой выгрузки ещё не стабилизировалась, статус остаётся
Идёт индексация BSL для поиска по коду...; число символов появляется только после финального прохода - Адаптивный таймаут -- 1 час для localhost, 3 часа для удалённых серверов 1С
Почему staging? Во время длительной выгрузки (десятки тысяч файлов) прямая запись в рабочую папку базы приводила бы к «полубитой» версии: индексер и LSP сканируют каталог и увидели бы смесь старых и новых файлов. Staging + атомарный
renameгарантирует, что переход от предыдущей рабочей копии к новой происходит одним шагом файловой системы.
По умолчанию используется host-side export service (EXPORT_HOST_URL). Если он недоступен, экспорт завершается с ошибкой (hard fail) для защиты software-лицензии 1С. Контейнерный экспорт разрешается только явным флагом:
ALLOW_CONTAINER_DESIGNER_EXPORT=true
Проверить готовность кнопкой Статус выгрузки или:
Покажи статус выгрузки BSL
Время выгрузки зависит от размера конфигурации: БП/УТ -- 5-15 мин, ERP/ЗУП -- 30-60 мин.
Требование: на машине шлюза должна быть установлена полная платформа 1С (пакет
1c-enterprise-*-client, не только серверные компоненты). Версия платформы должна совпадать с версией на сервере 1С. Узнать установленные версии:ls /opt/1cv8/x86_64/
Настройка папки выгрузки BSL
По умолчанию исходники сохраняются в ./bsl-projects (рядом с docker-compose.yml).
Linux
Через дашборд (рекомендуется). Откройте http://localhost:8080/dashboard → вкладка Настройки → карточка ПАПКА ВЫГРУЗКИ BSL → Изменить → введите путь под /home/... или выберите через браузер папок → Сохранить.
Для путей под /home перезапуск Docker не требуется — шлюз пишет через /hostfs-home (смонтирован при старте как /home:/hostfs-home:rw). Смена пути вступает в силу немедленно: gateway перепривязывает LSP/full-text индекс и автоматически пересоздаёт bsl-graph, чтобы Docker обновил bind mount графа на новый каталог.
Для путей вне /home (например /opt/bsl-projects) дополнительно укажите BSL_WORKSPACE в .env и пересоздайте контейнер:
BSL_WORKSPACE=/opt/bsl-projects
docker compose up -d --force-recreate gateway
Windows
Через дашборд. Откройте дашборд → Настройки → карточка ПАПКА ВЫГРУЗКИ BSL → Изменить → введите путь Windows → Сохранить.
На Windows смена папки требует пересоздания контейнера (Docker volume меняется только при старте). Дашборд автоматически обновляет BSL_WORKSPACE в .env и перезапускает шлюз. Если не сработало — выполните вручную:
docker compose -f docker-compose.yml -f docker-compose.windows.yml up -d --force-recreate gateway
# Windows
BSL_WORKSPACE=C:\Users\user\bsl-projects
Исходники каждой базы хранятся в подпапке {BSL_WORKSPACE}/{slug_базы}/.
Обработка MCPToolkit.epf
Внешняя обработка 1c/MCPToolkit/build/MCPToolkit.epf -- основной способ подключения базы 1С к шлюзу. Обработка открывается в клиенте 1С:Предприятие и предоставляет кнопки:
| Кнопка | Действие |
|---|---|
| Подключиться | Регистрирует текущую базу в шлюзе. Создаёт Docker-контейнер onec-toolkit-{db}. Имя базы и сервер определяются автоматически |
| Отключиться | Останавливает контейнеры базы и удаляет регистрацию из шлюза |
| Выгрузить BSL | Сначала спрашивает подтверждение с указанием реального пути на диске (запрашивается у шлюза через /api/export-preview): «Выгрузить BSL в: /home/user/Z/Z01 — Продолжить?». При подтверждении запускает выгрузку в фоне — обработка не зависает. На типовых конфигурациях (БП, УТ) занимает 5-15 мин, на крупных (ERP, ЗУП) -- 30-60 мин |
| Статус выгрузки | Показывает текущий статус выгрузки и индексации: идёт / завершена успешно (N BSL файлов) / Идёт индексация BSL для поиска по коду... / индексация завершена (N символов) / ошибка. Промежуточные значения индекса вроде 1-2 символов для больших выгрузок не считаются завершением и в UI не показываются |
| Отменить выгрузку | Останавливает текущую выгрузку BSL (kill процесса 1cv8 DESIGNER на хосте) |
Секция «ПАПКА ВЫГРУЗКИ BSL»
В обработке есть секция ПАПКА ВЫГРУЗКИ BSL -- путь к папке на машине шлюза, куда будут сохраняться BSL-исходники. При первом запуске значение берётся из .env (BSL_WORKSPACE). Нажмите «...» чтобы выбрать папку через диалог, затем Сохранить. Для Linux-путей под /home/... новый путь применяется сразу: gateway обновляет runtime-настройки, перепривязывает LSP/full-text индекс и автоматически пересоздаёт bsl-graph. Для сценариев с ручным редактированием .env или путей, требующих полного пересоздания bind mount, используйте docker compose ... --force-recreate как fallback.
Для MCP-инструмента export_bsl_sources поведение теперь такое:
- по умолчанию выгрузка стартует в фоне и сразу возвращает управление клиенту;
- для отслеживания используйте инструмент
get_export_status; - если база требует аутентификацию 1С, передавайте
Usr=...;Pwd=...в строке подключения; - для синхронного ожидания результата можно передать
wait=true.
Если шлюз запущен на отдельной машине, путь должен быть корректным для той ОС, где работает шлюз (Linux или Windows). Диалог выбора папки в этом случае показывает локальные папки -- удобно использовать как ориентир по формату пути.
Автоподключение: при нажатии "Подключиться" обработка отправляет HTTP-запрос на шлюз с параметрами базы. Шлюз автоматически создаёт контейнеры и регистрирует базу -- никакой ручной настройки не требуется.
Автономный режим: если шлюз недоступен (контейнеры остановлены, сеть не работает), обработка переключается на прямое подключение к toolkit-бэкенду. В этом режиме недоступны BSL-навигация, документация платформы и анонимизация.
Безопасность: при каждом свежем открытии MCPToolkit.epf все dangerous-toggle по умолчанию выключены. В форме доступны три независимые опции:
Записать объектПривилегированный режимВсе опасные операции без предупреждения
Последняя включает глобальный bypass dangerous-check и при переключении показывает отдельное предупреждение. На production-базах рекомендуется оставить все три чекбокса выключенными.
Статус подключения отображается на дашборде (http://localhost:8080/dashboard) -- вкладка "Статус", раздел "Подключённые базы". Зелёный индикатор EPF означает, что обработка активна.
Индикатор EPF основан на heartbeat (/api/epf-heartbeat): если heartbeat не приходит дольше EPF_HEARTBEAT_TTL_SECONDS, индикатор становится жёлтым.
По умолчанию EPF_HEARTBEAT_TTL_SECONDS=240. Это значение специально больше toolkit command timeout, чтобы долгие команды не помечали живую EPF-сессию как отключённую.
Файл обработки: 1c/MCPToolkit/build/MCPToolkit.epf.

Работа с несколькими базами
Каждый сеанс AI-ассистента или MCP-клиента работает со своей активной базой данных. Все базы остаются подключёнными одновременно.
Подключи базу ZUP, строка подключения Srvr=server-erp;Ref=ZUP;, папка /home/user/projects/ZUP
Переключись на базу ZUP
Покажи список подключённых баз
Отключи базу ZUP
Per-session routing: если один сеанс Codex работает с ERP, а другой -- с ZUP, они не пересекаются. Idle timeout сессий -- 8 часов.
При перезапуске шлюза все ранее подключённые базы восстанавливаются автоматически.
Удалённое подключение
Если сервер 1С находится на удалённой машине и пользователи подключаются к нему через тонкий клиент, шлюз можно развернуть прямо на этом сервере.
Когда это нужно
Типичная ситуация: сервер 1С стоит в серверной или в облаке. Пользователи работают через тонкий клиент. AI-ассистент или MCP-клиент запущен на рабочей станции разработчика. Платформа 1С не установлена на рабочей станции. В этом случае шлюз разворачивается на сервере 1С, а клиент подключается к нему по сети.
Развёртывание на сервере 1С
# На сервере 1С (server-erp)
git clone https://github.com/AlekseiSeleznev/onec-mcp-universal.git
cd onec-mcp-universal
cp .env.example .env
# Указать путь к платформе в .env
docker compose up -d
# Открыть порт 8080 в файрволе
sudo ufw allow 8080/tcp
Проверить доступность с рабочей станции:
curl http://server-erp:8080/health
Подключение AI-ассистента к удалённому серверу
На рабочей станции разработчика:
# Codex
codex mcp add onec --url http://server-erp:8080/mcp
Для любого другого MCP-клиента используйте тот же URL: http://server-erp:8080/mcp
Здесь server-erp -- имя или IP-адрес сервера 1С (например, 192.168.1.100).
Подключение EPF
Обработку MCPToolkit.epf нужно открыть в тонком клиенте 1С на сервере. В поле "Адрес шлюза" укажите http://localhost:8080, так как шлюз и обработка работают на одной машине. Нажмите "Подключиться".
Если в шлюзе включён GATEWAY_API_TOKEN, укажите токен прямо в этом поле: http://localhost:8080#token=<секрет>.
Если 1С-клиент запущен на рабочей станции (не на сервере), в поле "Адрес шлюза" укажите адрес сервера: http://server-erp:8080.
Что работает удалённо
Всё, что проходит через EPF (данные, метаданные, журнал), работает одинаково -- локально и удалённо.
| Категория | Статус | Примечание |
|---|---|---|
| Запросы к данным (execute_query, execute_code) | Работает | Через EPF на сервере |
| Метаданные (get_metadata, get_access_rights) | Работает | Структура конфигурации и роли |
| Журнал регистрации (get_event_log) | Работает | Чтение и фильтрация журнала |
| Ссылки (get_object_by_link, find_references_to_object) | Работает | Навигационные ссылки |
| Документация платформы (search, info) | Работает | Хранится в контейнере |
| Анонимизация | Работает | Маскировка ПД на стороне шлюза |
| Поиск по ИТС (its_search) | Работает | API 1С:Напарника |
| Валидация запросов (validate_query) | Работает | Статическая + серверная проверка |
| BSL-навигация (definition, symbol_explore) | Требует настройки | Нужно выгрузить BSL-файлы на сервер (кнопка «Выгрузить BSL» в EPF) |
| Выгрузка BSL (export_bsl_sources) | Работает | Шлюз использует 1cv8 DESIGNER с автоопределением версии платформы |
Настройка BSL-навигации удалённо
BSL-навигация (переход к определению, граф вызовов) работает только при наличии BSL-файлов на сервере.
Способ 1 (автоматический). Убедитесь, что на сервере установлена полная платформа 1С (пакет 1c-enterprise-*-client) и путь HOST_PLATFORM_PATH указывает на неё. Шлюз автоматически найдёт 1cv8 нужной версии. Нажмите "Выгрузить BSL" в обработке MCPToolkit.epf -- выгрузка запустится в фоне. Нажмите "Статус выгрузки" для проверки. Пока индекс строится, обработка показывает Идёт индексация BSL для поиска по коду...; итоговое число символов появится только после завершения индексации. На крупных конфигурациях (ERP, ЗУП) занимает 30-60 мин.
Способ 2 (ручной). Выгрузите конфигурацию на любой машине с 1С, скопируйте BSL-файлы на сервер, попросите AI переиндексировать:
Переиндексируй BSL-файлы
Поведение обработки EPF
Если в поле "Адрес шлюза" указан не localhost (например http://server-erp:8080), обработка выводит в лог предупреждение: BSL-навигация и выгрузка BSL недоступны с этой рабочей станции -- нужно использовать шлюз локально или выгружать BSL прямо на сервере.
Для токен-защищённого шлюза поддерживается формат http://server-erp:8080#token=<секрет>: токен подставляется в Authorization: Bearer ... для /api/register, /api/unregister, /api/export-*, /api/action/*.
Порты для удалённого доступа
Минимальный набор портов, которые нужно открыть на сервере 1С:
| Порт | Сервис | Назначение |
|---|---|---|
| 8080 | MCP-шлюз | AI-ассистент подключается к /mcp, дашборд на /dashboard |
| 443 или 80 | Веб-публикация 1С | Тонкий клиент в браузере (обычно уже открыт) |
| 3389 | RDP (опционально) | Удаленный рабочий стол для доступа к Конфигуратору |
Если нужен прямой доступ к Конфигуратору без RDP:
| Порт | Назначение |
|---|---|
| 1540-1541 | Агент и менеджер кластера 1С |
| 1560-1591 | Рабочие процессы кластера 1С |
Все остальные порты (6003, 6100+, 8081) работают внутри сервера через localhost и не требуют открытия наружу.
Схема удалённого подключения
Рабочая станция Сервер 1С (server-erp)
+-----------------+ +-----------------------------+
| Codex / другой | HTTP :8080 | Docker |
| MCP-клиент | ---------------> | onec-mcp-gw (шлюз) |
| | /mcp | onec-toolkit (бэкенд) |
+-----------------+ | platform-context |
| mcp-lsp (навигация BSL) |
+-----------------------------+
^
| localhost
+-----------------------------+
| Тонкий клиент 1С |
| MCPToolkit.epf |
+-----------------------------+
|
+-----------------------------+
| Сервер 1С:Предприятие |
| Информационная база |
+-----------------------------+
Безопасность. Порт 8080 открывает доступ ко всем инструментам шлюза. Ограничьте доступ по IP через файрвол:
sudo ufw allow from 192.168.1.0/24 to any port 8080. Для mutating HTTP API включите токен:GATEWAY_API_TOKEN=<секрет>. В EPF используйте формат адресаhttp://host:8080#token=<секрет>. Не открывайте порт в интернет без VPN или SSH-туннеля.
Примеры команд AI
Все примеры -- запросы на естественном русском языке в чате с AI. Под каждым примером указан MCP-инструмент, который будет вызван.
Запросы к данным
Выбери первые 10 контрагентов с наименованием и ИНН
Инструмент:
execute_query-- выполнит запрос к базе данных и вернёт таблицу результатов
Покажи документы реализации за последний месяц с суммой больше 100 000
Инструмент:
execute_query-- сформирует запрос с условием по дате и сумме
Выбери остатки товара "Кабель ВВГ 3x2.5" на всех складах
Инструмент:
execute_query-- обратится к виртуальной таблице остатков регистра накопления
Посчитай непроведённые документы поступления за текущий год
Инструмент:
execute_query-- выполнит агрегирующий запрос с фильтром по проведённости
Выполнение кода
Выполни код: Результат = ТекущаяДатаСеанса()
Инструмент:
execute_code-- выполнит произвольный BSL-код на сервере 1С и вернёт результат
Выполни код: Результат = Метаданные.Конфигурация.Версия
Инструмент:
execute_code-- получит версию конфигурации через платформенный API
Метаданные
Покажи структуру документа РеализацияТоваровУслуг
Инструмент:
get_metadata-- вернёт реквизиты, табличные части, формы и движения документа
Какие реквизиты есть у справочника Номенклатура?
Инструмент:
get_metadata-- покажет список реквизитов с типами
Сколько объектов в конфигурации по каждому типу?
Инструмент:
get_metadata-- вернёт дерево метаданных с количеством объектов
Валидация запросов
Проверь запрос:
ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Контрагенты ГДЕ Ссылка В (&Список
Инструмент:
validate_query-- обнаружит незакрытую скобку и предложит исправление
Проверь корректность: ВЫБРАТЬ * ИЗ Справочник.НесуществующийСправочник
Инструмент:
validate_query-- проверит существование объектов метаданных в запросе
Журнал регистрации
Покажи последние 10 ошибок из журнала регистрации за сегодня
Инструмент:
get_event_log-- отфильтрует записи по уровню "Ошибка" и дате
Найди записи журнала от пользователя Ivanov за последний час
Инструмент:
get_event_log-- выполнит поиск по имени пользователя с временным фильтром
Права доступа
Какие роли имеют право изменять справочник Номенклатура?
Инструмент:
get_access_rights-- покажет роли с правом "Изменение" на объект
Покажи права на документ РеализацияТоваровУслуг -- чтение, добавление, изменение
Инструмент:
get_access_rights-- вернёт матрицу прав по ролям для документа
Поиск использований и ссылки
Найди все документы где используется контрагент "Электробыт"
Инструмент:
find_references_to_object-- найдёт ссылки на объект во всех связанных таблицах
Открой контрагента по ссылке e1cib/data/Справочник.Контрагенты?ref=80260015e9b8c48d11e2c2d02ff9d345
Инструмент:
get_object_by_link-- получит объект по навигационной ссылке 1С
Получи навигационную ссылку на документ РеализацияТоваровУслуг номер 00000123
Инструмент:
get_link_of_object-- вернёт URL-ссылку для открытия объекта в 1С
Навигация по BSL
Найди процедуру ЗаполнитьТабличнуюЧастьТовары в конфигурации
Инструмент:
symbol_explore-- найдёт символ в дереве модулей конфигурации
Покажи граф вызовов функции ПолучитьСтруктуруОплаты
Инструмент:
call_graph-- построит дерево вызывающих и вызываемых процедур
Покажи иерархию вызовов процедуры ОбработкаПроведения
Инструмент:
call_hierarchy-- покажет входящие и исходящие вызовы процедуры
Какие ошибки в модуле ИнтеграцияЕГАИС?
Инструмент:
document_diagnostics-- вернёт список ошибок и предупреждений BSL Language Server
Покажи определение функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта
Инструмент:
definition-- перейдёт к месту определения процедуры/функции
Покажи информацию о методе ТекстЗапроса объекта Запрос
Инструмент:
hover-- вернёт тип, параметры и документацию символа
Покажи общий анализ BSL-проекта
Инструмент:
project_analysis-- выведет структуру проекта и количество символов
Покажи статус BSL Language Server
Инструмент:
lsp_status-- вернёт версию, состояние индексации, количество файлов
Переименуй функцию ПолучитьДанные в ПолучитьДанныеКонтрагента
Инструмент:
rename-- переименует символ во всех местах использования
Покажи доступные рефакторинги для выделенного фрагмента
Инструмент:
code_actions-- вернёт доступные действия рефакторинга
Поиск по BSL-коду
Проиндексируй BSL-файлы конфигурации
Инструмент:
bsl_index-- создаст полнотекстовый индекс по всем модулям проекта
Найди функцию ЗначенияРеквизитовОбъекта в исходниках
Инструмент:
bsl_search_tool-- выполнит поиск по индексу процедур/функций
Запись BSL-кода
Запиши модуль ОбщегоНазначения с новой функцией ПолучитьДанные
Инструмент:
write_bsl-- запишет BSL-модуль в файл проекта и автоматически переиндексирует
Поиск по ИТС (1С:Напарник)
Как правильно использовать регламентные задания в БСП?
Инструмент:
its_search-- найдёт статьи ИТС через API 1С:Напарника
Найди в ИТС информацию про механизм обмена данными через планы обмена
Инструмент:
its_search-- выполнит поиск по документации ИТС и вернёт релевантные фрагменты
Документация платформы
Покажи описание типа Запрос
Инструмент:
info-- вернёт общую информацию о типе платформы 1С
Покажи все методы и свойства объекта ТаблицаЗначений
Инструмент:
getMembers-- выведет полный список членов типа
Покажи описание метода Выполнить объекта Запрос
Инструмент:
getMember-- вернёт детальное описание метода с параметрами
Покажи конструкторы типа Массив
Инструмент:
getConstructors-- покажет все варианты создания через Новый
Найди в документации платформы всё про HTTPЗапрос
Инструмент:
search-- выполнит полнотекстовый поиск по документации
Важные live-контракты MCP-инструментов
platform-context:searchтребуетquery,type,limitinfoтребуетname,typegetMembers/getConstructorsтребуютtypeNamegetMemberтребуетtypeName,memberName
get_link_of_objectпринимаетobject_description-- объект-описание со ссылкой, а не произвольную строку.find_references_to_objectпринимаетtarget_object_descriptionиsearch_scope;search_scope-- массив категорий/мета-областей, а не файловых путей.execute_code:- для CRUD и работы с
Справочники.*/Документы.*используйтеexecution_context=\"server\" execution_context=\"client\"нужен для работы с реквизитами формы EPF и проверок вродеАвтоРазрешитьЗаписать- dangerous operations из MCP идут «из коробки» до EPF, а фактическое разрешение определяется галочками в самой обработке
- для CRUD и работы с
Анонимизация данных
Включи анонимизацию данных
Инструмент:
enable_anonymization-- активирует маскировку персональных данных
Выключи анонимизацию
Инструмент:
disable_anonymization-- отключит маскировку, данные будут возвращаться как есть
При включённой анонимизации ФИО, ИНН, СНИЛС, телефоны, email и названия компаний заменяются на стабильные фейки. Один и тот же оригинал всегда маппится в один и тот же фейк (hash-маппинг).
Профилирование запросов
Покажи статистику производительности запросов
Инструмент:
query_stats-- вернёт замеры времени выполнения с подсказками по оптимизации
Кеш метаданных
Сбрось кеш метаданных
Инструмент:
invalidate_metadata_cache-- очистит TTL-кеш и следующий запрос метаданных пойдёт напрямую в базу
Переиндексирование
Переиндексируй BSL-файлы
Инструмент:
reindex_bsl-- пересоздаст индекс BSL Language Server для текущей базы
Управление базами
Подключи базу ERP_Test, строка подключения Srvr=server-erp;Ref=ERP_Test;, папка /home/user/projects/ERP_Test
Инструмент:
connect_database-- зарегистрирует базу и создаст Docker-контейнеры
Переключись на базу ZUP
Инструмент:
switch_database-- сменит активную базу в текущей сессии (per-session routing)
Покажи список подключённых баз
Инструмент:
list_databases-- выведет все зарегистрированные базы со статусами
Отключи базу ZUP
Инструмент:
disconnect_database-- остановит runtime базы, но оставит её зарегистрированной в шлюзе
Статус сервера
Покажи статус MCP-сервера
Инструмент:
get_server_status-- вернёт статус всех бэкендов и количество инструментов
Выгрузка исходников
Выгрузи исходники конфигурации
Инструмент:
export_bsl_sources-- запустит1cv8 DESIGNER /DumpConfigToFilesс автоопределением версии платформы
Покажи статус выгрузки исходников для ERP
Инструмент:
get_export_status-- вернёт статус фоновой выгрузки и индексации BSL
Граф зависимостей (опционально, встроенный профиль bsl-graph)
Покажи статистику графа объектов конфигурации
Инструмент:
graph_stats-- количество узлов, рёбер, распределение по типам
Найди объекты связанные с документом ПоступлениеТоваровУслуг
Инструмент:
graph_related-- impact analysis, входящие и исходящие зависимости
Найди в графе все регистры накопления
Инструмент:
graph_search-- поиск объектов по типу и имени
Web UI дашборд
Визуальная панель мониторинга и управления доступна по адресу:
http://localhost:8080/dashboard
Вкладка "Статус"
Обзор состояния системы в реальном времени:
- Статус бэкендов (зелёный / красный) с количеством инструментов
- Список подключённых баз данных со статусом EPF-подключения
- Зачёркивание имени базы и кнопки
Отключить/Подключитьзависят от backend-подключения (контейнеры/маршрутизация), а не от состояния EPF - Профилирование запросов -- время выполнения, количество вызовов
- Кеш метаданных -- размер, TTL, попадания/промахи
- Статус анонимизации (вкл/выкл)
- Docker-контейнеры -- запущенные, остановленные, ресурсы
- Кнопка
Обновить статистикуотдельно перечитывает RAM контейнеров и размеры образов на диске; обычная загрузка страницы делает лёгкий рендер без тяжёлогоdocker stats
Для Docker-карточки важно различать:
RAM сейчас-- текущее потребление оперативной памяти контейнеромОбраз на диске-- размер Docker-образа в локальном хранилище, а не использование RAMСтатус контейнера-- состояние контейнера Docker; это не равно статусу подключенияEPF
Вкладка "Настройки"
Управление конфигурацией шлюза без перезапуска:
- Управление базами -- добавить / изменить / отключить / установить по умолчанию
- Редактирование
.env-- изменение переменных окружения прямо из браузера с автоперезапуском шлюза - Очистка кеша -- сброс TTL-кеша метаданных
- Переключение анонимизации -- вкл/выкл маскировки ПД
Документация
http://localhost:8080/dashboard/docs
Подробное описание всех MCP-инструментов, API-эндпоинтов и переменных окружения. Документация встроена в дашборд, поддерживается в репозитории и доступна на русском и английском языках.
Диагностика
Ссылка "Диагностика" внизу дашборда -- полный JSON-отчёт: версия шлюза, активные сессии, бэкенды, базы, профилирование, кеш, Docker, логи контейнеров, переменные окружения.
Настройка 1С:Напарник (поиск по ИТС)
- Получить API-ключ на https://code.1c.ai (Профиль -> API-токен). Требуется подписка ИТС.
- Добавить в
.env:
NAPARNIK_API_KEY=ваш-ключ-api
- Перезапустить шлюз:
docker compose restart gateway
После этого инструмент its_search станет доступен в AI-ассистенте.
Опциональные модули
Тестирование YaXUnit
Запуск тестов, сборка проекта и проверка синтаксиса. Использует mcp-onec-test-runner.
cp test-runner/application.yml.example test-runner/application.yml
# Отредактировать application.yml -- указать строку подключения
docker compose --profile test-runner up -d
Добавить в .env:
ENABLED_BACKENDS=onec-toolkit,platform-context,bsl-lsp-bridge,test-runner
docker compose restart gateway
Примеры:
Запусти все тесты YaXUnit
Запусти тесты модуля ОбработкаЗаказов
Граф связей конфигурации
Анализ зависимостей между объектами конфигурации: какой объект кто использует, в каких модулях/формах/регистрах встречается. Начиная с v1.8.0, граф поставляется как встроенный локально собираемый профиль репозитория (bsl-graph-lite) и не требует внешнего GitHub-образа или NebulaGraph.
Что это
Отдельный контейнер onec-bsl-graph на порту 8888, который:
- сканирует
BSL_WORKSPACEиdb_state.jsonшлюза; - строит граф узлов (документы, справочники, регистры, модули, BSL-файлы, подсистемы...) и рёбер (ссылки, вхождения имён в BSL) по всем зарегистрированным базам;
- хранит снимок в
/data/graph.json— переживает перезапуск контейнера.
Источник истины — реестр зарегистрированных баз шлюза. Если база удалена из дашборда, её узлы и связи исчезают из графа, даже если BSL-файлы остались на диске.
Как включить
Оба способа идемпотентны:
# при первоначальной установке
./setup.sh --with-bsl-graph
# уже работающий стек: добавить профиль
docker compose --profile bsl-graph up -d --build
Шлюз подхватит BSL_GRAPH_URL=http://localhost:8888 автоматически — инструменты graph_stats, graph_search, graph_related начнут отвечать через MCP.
Как выключить
# остановить и удалить только контейнер графа (сам стек не трогается)
docker compose --profile bsl-graph stop bsl-graph
docker rm -f onec-bsl-graph
# полная очистка образа (если нужно)
docker rmi onec-mcp-universal-bsl-graph
Без работающего контейнера graph_* tools вернут ошибку соединения; остальные MCP-инструменты продолжат работать.
Когда индексирует автоматически
-
При старте контейнера — сразу подгружает последний снимок + делает полный rescan.
-
Фоновый цикл — каждые
GRAPH_RESCAN_SECONDSсекунд (по умолчанию300, минимум30). Увеличить через.env:BSL_GRAPH_RESCAN_SECONDS=600 -
При смене
BSL_WORKSPACE/BSL_HOST_WORKSPACEчерез дашборд — gateway теперь автоматически пересоздаётbsl-graph, чтобы Docker обновил bind mount графа. -
При ручном редактировании
.envили обходе дашборда — пересоздайте контейнерbsl-graphвручную, потому что сам по себе фоновый цикл не меняет уже смонтированный host path:docker compose --profile bsl-graph up -d --build --force-recreate bsl-graph
Как пересканировать вручную
Сразу после новой выгрузки BSL (если не хочется ждать до 5 минут автоцикла):
curl -X POST http://localhost:8888/api/graph/rebuild
Эндпоинт синхронный — возвращает обновлённый stats в теле ответа. Занимает секунды-десятки секунд в зависимости от размера конфигурации.
Альтернатива — перезапустить контейнер (rebuild произойдёт на старте):
docker restart onec-bsl-graph
Веб-интерфейс (браузер)
Когда контейнер onec-bsl-graph запущен, на http://localhost:8888/ доступен интерактивный просмотр графа. Визуально совпадает с дашбордом (та же slate-палитра, одинаковая типографика). Работает полностью оффлайн — cytoscape.js включён в образ.
Тулбар:
- Поле поиска (поддерживает несколько слов через пробел — каждое слово ищется как подстрока во всём имени объекта;
размеры пособийнаходитРазмерыГосударственныхПособий). - ◀ ▶ — история поиска (как в браузере).
- Список — всплывающая панель со списком найденных объектов; клик по элементу анимированно фокусирует камеру на узле.
- Очистить — сброс канваса и поля поиска.
- Пересобрать / Rebuild — синхронный
POST /api/graph/rebuild. - RU / EN — язык интерфейса; при открытии по ссылке из дашборда автоматически подхватывается локаль дашборда.
Левая панель:
- Базы — радиокнопки (одна база одновременно). По умолчанию выбрана первая; если база одна, кнопка неактивна (только информация).
- Типы — список типов объектов в выбранной БД с количеством; клик показывает первые 30 узлов этого типа.
Центральный канвас:
- cytoscape.js с layout'ом
cose, плавной анимацией (600–700 мс ease-out), smoothly-zoom (wheelSensitivity: 0.2, диапазон 0.1…4). - Заливка узла = тип объекта, бордер = база данных.
- Длинные
CamelCase-имена автоматически разбиваются по границам регистра; labels не перекрываются благодаряnodeDimensionsIncludeLabelsв layout'е. - Одинарный клик по узлу — детали справа + подсветка его прямых соседей (остальной граф приглушается).
- Двойной клик — drill-down: через
/api/graph/related/<id>подгружает соседей узла (один хоп). - Лимит 200 узлов на канвасе.
Правая панель:
- Узел — type, db, id, path + кнопка Развернуть соседей (альтернатива двойному клику).
- Легенда — соответствие цвета обводки базе данных.
Плавающая панель «Список»:
- Открывается кнопкой Список в тулбаре.
- Показывает все узлы последнего поиска (цветная точка, имя,
type · db). - Клик по элементу — камера с анимацией летит к узлу; если он не на канвасе, автоматически подгружается через
/related.
Интеграция с gateway:
- Сразу после успешной выгрузки BSL (кнопка Выгрузить BSL в EPF) gateway дёргает
POST /api/graph/rebuild— граф актуализируется за секунды, без ожидания автоцикла (GRAPH_RESCAN_SECONDS). - Файлы
.bslв графе получают читаемые имена видаОбъектИмя/Форма/Module.bsl(без префиксаInformationRegisters/и сегментаExt/) — поиск и список становятся различимыми.
Ссылка из дашборда: http://localhost:8080/dashboard → карточка «Опциональные сервисы» → bsl-graph. Если контейнер не запущен, имя отображается как обычный текст и не кликается.
Примеры команд AI
Покажи статистику графа объектов конфигурации
Найди все объекты, связанные с документом ПоступлениеТоваровУслуг
Диагностика
# работает ли
curl -s http://localhost:8888/health | python3 -m json.tool
# логи
docker logs onec-bsl-graph --tail 50
# прямой запрос к API (минуя MCP)
curl -s -X POST http://localhost:8888/api/graph/search \
-H 'Content-Type: application/json' \
-d '{"query":"КурсыВалют","limit":3}' | python3 -m json.tool
Скилы 1С для Codex и совместимых локальных skill-runner'ов
В репозитории поставляется 96 скиллов для работы с 1С через Codex и совместимые локальные skill-runner'ы. Скилы -- это команды вида /meta-compile, /epf-init, /form-compile, которые работают локально с XML-исходниками конфигурации на диске и не требуют подключения к шлюзу.
install-skills.sh ставит их симлинками в ~/.codex/skills/. В Windows install-skills.ps1 делает то же самое.
Установка скилов
Скилы устанавливаются автоматически при запуске ./setup.sh — отдельный шаг не нужен.
Если нужно установить отдельно (например, после ручного клонирования репозитория):
Linux / macOS:
./install-skills.sh
Windows (PowerShell от администратора):
powershell -ExecutionPolicy Bypass -File install-skills.ps1
Скрипт создаёт символические ссылки из ~/.codex/skills/ на папку skills/ в проекте. После установки скилы доступны Codex как локальные skills.
Категории скилов
| Категория | Скилы | Описание |
|---|---|---|
| Конфигурация (CF) | cf-init, cf-edit, cf-info, cf-validate | Создание пустой конфигурации, изменение свойств, анализ структуры |
| Объекты метаданных | meta-compile, meta-edit, meta-info, meta-remove, meta-validate | Справочники, документы, регистры, перечисления, константы, общие модули |
| Формы | form-compile, form-edit, form-add, form-info, form-remove, form-validate, form-patterns | Создание управляемых форм из JSON-описания, добавление элементов, анализ |
| СКД | skd-compile, skd-edit, skd-info, skd-validate | Схемы компоновки данных для отчётов |
| Обработки (EPF) | epf-init, epf-add-form, epf-build, epf-dump, epf-validate, epf-bsp-init, epf-bsp-add-command | Внешние обработки, интеграция с БСП |
| Отчёты (ERF) | erf-init, erf-build, erf-dump, erf-validate | Внешние отчёты |
| Расширения (CFE) | cfe-init, cfe-borrow, cfe-patch-method, cfe-diff, cfe-validate | Расширения конфигурации, заимствование объектов, перехват методов |
| Роли | role-compile, role-info, role-validate | Создание ролей с набором прав, аудит прав |
| Подсистемы | subsystem-compile, subsystem-edit, subsystem-info, subsystem-validate | Создание подсистем, управление составом |
| Макеты (MXL) | mxl-compile, mxl-decompile, mxl-info, mxl-validate, template-add, template-remove | Табличные документы, печатные формы |
| Командный интерфейс | interface-edit, interface-validate | Настройка видимости команд в подсистемах |
| Базы данных (ИБ) | db-create, db-run, db-update, db-list, db-dump-cf, db-load-cf, db-dump-xml, db-load-xml, db-load-git | Создание ИБ, запуск 1С, обновление, выгрузка/загрузка конфигурации |
| Веб-публикации | web-publish, web-info, web-test, web-unpublish, web-stop | Публикация через Apache, тестирование в веб-клиенте |
| Стандарты кода | standards-code, errors, query-writing, form-work, use-bsp | Правила BSL, транзакции, запросы, формы, паттерны БСП |
| Workflow и UX | epf-expert, erf-expert, mxl-expert, inspect, validate, 1c-project-init, session-save, session-restore, session-retro, brainstorm, write-plan, openspec-proposal, openspec-apply, openspec-archive, 1c-feature-dev, 1c-query-opt, 1c-help-mcp, bsp-patterns, role-expert, subsystem-expert, subagent-dev, 1c-test-runner, 1c-web-session, playwright-test | Оркестрация сценариев, инициализация проекта, сохранение и восстановление состояния сессии |
| Прочее | help-add, img-grid | Встроенная справка, работа с изображениями |
Примеры использования скилов
/cf-init -- создать пустую конфигурацию МояКонфигурация
/meta-compile -- создать справочник Клиенты с реквизитами ИНН и Телефон
/meta-edit -- добавить реквизит Email типа Строка(100) в справочник Клиенты
/epf-init -- создать пустую обработку ЗагрузкаДанных
/epf-add-form -- добавить основную форму к обработке ЗагрузкаДанных
/epf-build -- собрать EPF из исходников
/epf-expert -- выбрать и выполнить нужную EPF-операцию (init/build/dump/form/bsp/validate)
/epf-bsp-init -- добавить регистрацию БСП (СведенияОВнешнейОбработке)
/form-compile -- создать форму списка для справочника Клиенты
/form-edit -- добавить кнопку "Обновить" на форму
/skd-compile -- создать СКД для отчёта по продажам
/skd-edit -- добавить параметр "Период" в СКД
/1c-project-init -- инициализировать проект под onec-mcp-universal и создать .mcp.json из шаблона
/session-save -- сохранить текущее состояние работы в session-notes.md
/session-restore -- восстановить сессию и продолжить с Next Action
/session-retro -- добавить блок Ретроспектива в session-notes.md
/epf-expert -- создать/собрать/разобрать EPF через единый вход
/erf-expert -- собирать и валидировать ERF через единый вход
/mxl-expert -- компилировать/декомпилировать макет и управлять template-add/template-remove
/inspect -- быстро посмотреть структуру справочника, формы или роли
/validate -- проверить корректность созданных/изменённых объектов
/brainstorm -- спланировать сложную задачу перед реализацией
/write-plan -- сформировать tasks.md из design.md
/openspec-proposal -- создать proposal.md/design.md/tasks.md для формального изменения
/openspec-apply -- выполнить задачи из OpenSpec по порядку
/openspec-archive -- архивировать завершённое изменение
/1c-query-opt -- оптимизировать медленный запрос перед выкладкой
/1c-feature-dev -- пройти 9-фазный цикл разработки фичи
/1c-help-mcp -- свериться с документацией 1С по методу/конструкции
/bsp-patterns -- проверить типовые решения БСП перед написанием кода
/role-expert -- создать/исправить роль и сразу проверить права
/subsystem-expert -- создать подсистему, интерфейс, состав и проверить валидацию
/subagent-dev -- координировать выполнение tasks.md по этапам
/1c-test-runner -- прогнать AI-юнит тесты бизнес-логики
/1c-web-session -- проверить базовые пользовательские сценарии в веб-клиенте
/playwright-test -- добавить UI регрессию для изменённой формы
/erf-init -- создать пустой внешний отчёт ОтчётПоПродажам
/cfe-init -- создать расширение ДоработкаЕРП
/cfe-borrow -- заимствовать справочник Номенклатура из конфигурации
/cfe-patch-method -- перехватить метод ПередЗаписью документа
/role-compile -- создать роль Оператор с правами на чтение справочников
/subsystem-compile -- создать подсистему УправлениеЗаказами
/mxl-compile -- создать макет печатной формы счёта
/db-create -- создать файловую базу /tmp/test-db
/db-run -- запустить 1С:Предприятие для базы ERP_Test
/db-dump-xml -- выгрузить конфигурацию в XML-файлы
/db-load-git -- загрузить изменения из последнего коммита
/web-publish -- опубликовать базу ERP_Test через Apache
/meta-info -- покажи структуру документа РеализацияТоваровУслуг
/form-info -- покажи элементы формы ФормаДокумента
/cf-info -- покажи состав конфигурации
Диагностика
Страница диагностики:
http://localhost:8080/dashboard
Ссылка "Диагностика" внизу дашборда -- полный JSON-отчёт: версия шлюза, активные сессии, бэкенды, базы, профилирование, кеш, Docker, логи контейнеров, переменные окружения.
Статус бэкендов:
curl http://localhost:8080/health
Или через AI: Покажи статус MCP-сервера
Логи шлюза:
docker logs onec-mcp-gw -f
Логи toolkit конкретной базы:
docker logs onec-toolkit-ERP_Test -f
Перезапуск шлюза:
docker compose restart gateway
Типичные проблемы:
| Проблема | Решение |
|---|---|
| MCP не появляется в Codex | docker ps — убедитесь, что onec-mcp-gw запущен; curl http://127.0.0.1:8080/health; выполните codex mcp list |
| После перезагрузки MCP не работает | Контейнеры поднимаются автоматически (restart: always) при старте Docker. Убедитесь, что Docker настроен на автозапуск: sudo systemctl enable docker. Windows: Docker Desktop → Settings → General → включить "Start Docker Desktop when you log in". Если контейнеры всё равно не поднялись: docker compose up -d --build из папки проекта |
| Порт 8080 занят | Измените в .env: GW_PORT=8090, затем перерегистрируйте: codex mcp remove onec-universal && codex mcp add onec-universal --url http://localhost:8090/mcp |
| Бэкенд показывает красный статус | docker logs onec-mcp-gw -f, проверить docker compose ps |
| EPF не подключается | Проверить curl http://127.0.0.1:8080/health, кнопка "Подключиться" |
| execute_query/get_metadata возвращает EPF ... is not connected | Откройте MCPToolkit.epf в активной базе и нажмите "Подключиться". Проверить статус можно через list_databases (epf_connected=true) или в дашборде (колонка EPF). |
| BSL-навигация не работает | Проверить docker image inspect mcp-lsp-bridge-bsl:latest, затем нажать "Выгрузить BSL" в обработке и дождаться завершения индексации |
| В Docker-карточке видно н/д | Это нормально после обычной загрузки дашборда. Нажмите Обновить статистику, чтобы явно перечитать RAM контейнеров и размеры образов |
| Ошибка .env в дашборде | cp .env.example .env; дашборд и sidecar принимают только полный текст .env, а неполные patch-обновления отклоняются. DOCKER_CONTROL_TOKEN и ANONYMIZER_SALT также прокидываются в контейнеры через environment, а docker-control /health дозаписывает их обратно в .env, если файл случайно обрезали |
| Контейнеры не создаются | docker system df, очистить: docker system prune |
| Таймаут от шлюза | Нажать "Отключиться" и "Подключиться" повторно |
| AI получает устаревшие метаданные | Сбросить кеш: "Очистить кеш" в дашборде или invalidate_metadata_cache |
Обновление
git pull
docker compose build gateway
docker compose up -d gateway
После docker compose up -d gateway контейнер шлюза пересоздаётся, EPF-обработка теряет heartbeat и требует одного нажатия «Подключиться» — это штатно (registry помнит параметры, но EPF-сессия регистрируется заново).
Добавьте --no-cache к build только если тянете новые git-зависимости или базовые образы обновились.
GitHub Packages
Docker-образ публикуется в GitHub Container Registry:
ghcr.io/alekseiseleznev/onec-mcp-universal:latest— всегда актуальныйmainghcr.io/alekseiseleznev/onec-mcp-universal:X.Y.Z— релизный semver tagghcr.io/alekseiseleznev/onec-mcp-universal:X.Y— minor tag релизной веткиghcr.io/alekseiseleznev/onec-mcp-universal-bsl-graph-lite:latest— встроенный graph backend изmainghcr.io/alekseiseleznev/onec-mcp-universal-bsl-graph-lite:X.Y.Z— релизный tag graph backendghcr.io/alekseiseleznev/onec-mcp-universal-docker-control:latest— внутренний sidecar для Docker lifecycle изmainghcr.io/alekseiseleznev/onec-mcp-universal-docker-control:X.Y.Z— релизный tag sidecar
Используемые проекты
Основные
| Проект | Автор | Назначение | |---|---|---| | 1c-mcp-toolkit | ROCTUP | Запросы к БД, выполнение кода, метаданные, журнал регистрации, права | | mcp-bsl-platform-context | alkoleft | Документация API платформы 1С | | mcp-bsl-lsp-bridge | 1cvibe | MCP-мост к BSL Language Server | | lsp-session-manager | 1cvibe | Мультиплексор сессий BSL Language Server | | bsl-language-server | 1c-syntax | Language Server для BSL | | 1c_mcp | vladimir-kharin | Справочник синтаксиса BSL |
Опциональные
| Проект | Автор | Профиль | Назначение |
|---|---|---|---|
| mcp-onec-test-runner | alkoleft | test-runner | Запуск тестов YaXUnit, сборка, проверка синтаксиса |
| bundled bsl-graph-lite | onec-mcp-universal | bsl-graph | Встроенный профиль графа зависимостей по зарегистрированным базам |
Удаление
# Остановить и удалить контейнеры (включая опциональный bsl-graph) + volume
docker compose --profile bsl-graph down -v
# Удалить per-DB контейнеры (onec-toolkit-<slug>, mcp-lsp-<slug>)
docker ps -a --format '{{.Names}}' | grep -E '^(onec-toolkit-|mcp-lsp-)' | xargs -r docker rm -f
# Удалить образы проекта
docker images --format '{{.Repository}}:{{.Tag}}' \
| grep -E '^(onec-mcp-universal-|mcp-lsp-bridge-bsl|ghcr.io/alekseiseleznev/onec-mcp-universal)' \
| xargs -r docker rmi -f
# Linux: остановить и удалить user systemd service
systemctl --user disable --now onec-export-service.service 2>/dev/null || true
rm -f ~/.config/systemd/user/onec-export-service.service
systemctl --user daemon-reload
# Windows: удалить Scheduled Task
# schtasks /Delete /TN OnecMcpExportService /F
# Удалить MCP-подключение из Codex
codex mcp remove onec-universal
# Удалить установленные скилы Codex (опционально)
rm -rf ~/.codex/skills
# Удалить каталог проекта
cd .. && rm -rf onec-mcp-universal
Данные баз 1С, 1С-лицензии и выгруженные BSL-исходники (вне каталога проекта) не затрагиваются.
Лицензия
MIT -- Copyright (c) 2026 Aleksei Seleznev