Files
knowledge-base/decisions/2026-06-21-buzharovo-mcp-1c-deploy.md
2026-06-23 13:58:02 +03:00

7.8 KiB
Raw Permalink Blame History

date, type, tags
date type tags
2026-06-21 decision
buzharovo
1c
mcp
mcp-1c
iis
claude-code

MCP-сервер mcp-1c к базе 1С Бужарово (RitmUl / Розница)

Развёрнут feenlace/mcp-1c — Claude Code читает метаданные и выполняет SELECT-запросы к боевой базе RitmUl (1С:Розница 2.3.23.27) на projects/buzharovo/server1c.

Итоговая схема (работает end-to-end)

Mac (mcp-1c stdio, ~/.local/bin/mcp-1c v1.8.0)
  → NetBird → http://100.70.75.103:8080/mcp/hs/mcp-1c   (Basic-Auth, юзер 1С)
  → IIS (app /mcp, пул 1CMCP «No Managed Code») → wsisapi.dll
  → кластер 1С Server1C:1541 → база RitmUl → расширение MCP_HTTPService
  • Клиент (Mac): ~/.local/bin/mcp-1c (darwin-amd64 v1.8.0). Зарегистрирован: claude mcp add 1c --scope user -e MCP_1C_BASE_URL=http://100.70.75.103:8080/mcp/hs/mcp-1c -e MCP_1C_USER=… -e MCP_1C_PASSWORD=… -- ~/.local/bin/mcp-1c. claude mcp list → ✓ Connected. Конфиг ~/.claude.json chmod 600.
  • Расширение: MCP_HTTPService (HTTP-сервис MCPService, RootURL mcp-1c) поставлено mcp-1c.exe --install "Server1C\RitmUl" --server --db-user <админ ИБ> --db-password …. Несёт свою роль MCP_ОсновнаяРоль (только Use на сервис, без привилег. режима).
  • Публикация: IIS, приложение /mcpC:\inetpub\mcp (default.vrd + web.config). Бинарь сервера: C:\mcp-1c\mcp-1c.exe (Windows).
  • Безопасность: 8080 — firewall-правило mcp-1c HTTP (NetBird only) только из 100.64.0.0/10; публичное IIS-правило для :80 отключено; Basic-Auth = пользователь 1С.

Грабли (в порядке появления — все реальные)

  1. NetBird на server1c лежал не из-за NetBird: DNS сервера указывал только на роутер 192.168.1.1, у которого сдох резолвинг (даже google.com=0). api.netbird.io не резолвился → меш не вставал. Фикс: netsh interface ipv4 set dnsservers Ethernet static 1.1.1.1 primary + 8.8.8.8 (статикой, иначе DHCP перетирает). От админ-PowerShell (интерактивная не-админ сессия падала на CIM permission).
  2. WinRM с Мака к server1c (5985, NetBird): pywinrm transport='basic' (NTLM отклоняется). Креды dttb/1qaz!QAZ, по сети — админ-токен.
  3. /HTTPPort не работает в сборке 8.3.27.1606: ни headless (толстый клиент = GUI, дохнет в session 0), ни интерактивно (база открывается, порт не поднимается). Вариант self-host отвергнут.
  4. Веб-сервера и веб-модулей 1С не было (платформа ставилась «только сервер»). Дистрибутив нашёлся локально по реестру InstallSource = E:\Distr\Update\windows64full_8_3_27_1606\. Доустановка модуля: msiexec /i "…\1CEnterprise 8 (x86-64).msi" ADDLOCAL=WebServices,WebServices_RU /qn /norestart → появились wsisapi.dll/wsap24.dll/webinst.exe. Затем Install-WindowsFeature Web-Server,Web-CGI,Web-ISAPI-Ext,Web-ISAPI-Filter -IncludeManagementTools.
  5. ★ w3wp падал 0xc0000005 (Application Error, faulting module «unknown»; VS JIT-отладчик ловил краш и вешал воркер — отключил AeDebug Auto=0). Причина — нативный ISAPI-модуль 1С в DefaultAppPool, куда грузится .NET CLR. Фикс: отдельный пул «No Managed Code» (appcmd add apppool /name:1CMCP; set apppool /managedRuntimeVersion:"" /enable32BitAppOnWin64:false /processModel.loadUserProfile:true; приложение /mcp → этот пул). VC++ redist не при чём (уже стоял). Конфигуратор при републикации сбрасывает пул на DefaultAppPool — каждый раз возвращать 1CMCP.
  6. rmngr-loop на server1c был активен (2 ядра в idle) → новые веб-сессии висли (w3wp idle, ждёт кластер). Лечится известным рецептом: Restart-Service '1C:Enterprise 8.3 Server Agent (x86-64)' -Force (при 0 сессий). См. decisions/2026-05-07-buzharovo-1c-rmngr-loop-after-crash.
  7. ★ vrd: HTTP-сервис расширения не публикуется publishByDefault. Нужно publishExtensionsByDefault="true" — в Конфигураторе это галочка «Публиковать HTTP сервисы расширений по умолчанию» (вкладка «HTTP сервисы»). webinst так не умеет; правильный vrd сгенерил только Конфигуратор. Элемент сервиса — <service name=… rootUrl=… enable="true">.

Не доделано

  • mcp_ro (RO-юзер вместо интерим-ПальмановаНВ). Розница 2.x — сотни гранулярных ролей, единой «read-all» нет; обработчик без привилег. режима → нужны и роль сервиса MCP_ОсновнаяРоль, и право чтения данных. Прагматика: dedicated mcp_ro = MCP_ОсновнаяРоль + ПолныеПрава (через mcp-1c всё равно только SELECT). После создания: claude mcp remove 1c + re-add с MCP_1C_USER=mcp_ro.

Запись/управление 1С (отложено — вернуться при необходимости)

Открытая (наша) версия — только чтение. Единственный пишущий инструмент = code_execute (action="code") в Расширенной версии mcp-1c (1 990 ₽/мес, 14 дней триал, регистрация feenlace.ru) — исполняет произвольный BSL в базе (создание/проведение документов, изменение справочников/регистров, обработки) со встроенной песочницей + подтверждением + аудитом. Pro-инструменты (4 990) — это анализ кода (семантический поиск, граф зависимостей, аудит безопасности), не запись.

Чтобы включить запись нужно: (1) Расширенная версия mcp-1c; (2) пользователь 1С с правами на запись (не RO); (3) переустановить расширение версией Расширенной.

Риск: боевая money-база + произвольный BSL от LLM = максимум риска. План безопасного PoC: тест-копия (restore RitmUl_pre-mcp_*.bak → SQL RitmUl_test → тест-ИБ Server1C\RitmUl_test), отладка записи там, на боевую RitmUl — только после. 2026-06-21 Олег решил отложить.

Безопасность лицензии

Лицензия 1С на server1c неофициальная — ничего, что её активирует/переактивирует, не трогать. Рестарт кластера и веб-сессии её не задевают (это просто сессии на чтение).