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

49 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
date: 2026-06-21
type: decision
tags: [buzharovo, 1c, mcp, mcp-1c, iis, claude-code]
---
# MCP-сервер mcp-1c к базе 1С Бужарово (RitmUl / Розница)
Развёрнут [feenlace/mcp-1c](https://github.com/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, приложение `/mcp``C:\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 **неофициальная** — ничего, что её активирует/переактивирует, не трогать. Рестарт кластера и веб-сессии её не задевают (это просто сессии на чтение).