v8-runner

Архитектура

Исполнителя выбирает не ключ в конфиге, а пара «операция и цель». А сам раннер ничего не делает с базой: он оркестрирует чужие процессы — утилиты платформы 1С и EDT. Ниже по порядку: кто исполняет операции и как он выбирается, слои и процессы внутри раннера, варианты развёртывания 1С и время жизни компонентов.

Исходники
формат и тип
Операция
глагол раннера
Цель
вид базы
Провайдер
по матрице умолчаний

Исходники

Формат — XML платформы или проект EDT. EDT перед работой с базой экспортируется в XML.
Тип — конфигурация, расширение, внешняя обработка, внешний отчёт. Любой тип бывает в любом формате.

Провайдеры

ПровайдерЧто этоРешение по
Designerпроцесс Конфигуратора на командукоду выхода и появлению артефакта
agentагентский shell по SSH: Конфигуратор в режиме агента или шлюз ibsrv — набор команд одинаковый. У файловой базы и кластера такой точки входа нет: Конфигуратор в агентском режиме поднимает сам раннер, поэтому платформа нужна на его машинеJSON: type и закрытый error-type
ibcmdутилита платформы; у автономного сервера строки в матрице не имееткоду выхода и машинному выводу
ibcmd-rsконвертер XML ↔ CF без платформыкоду выхода
webinstпубликация базы на Apache или IISкоду выхода и появлению публикации

Проза инструмента никогда не решает — только переносится как улика.

Цели: два адреса

У базы всегда два адреса, и они разные. По одному раннер её администрирует, по другому её открывают клиентом или браузером. Строка подключения вида ws=… относится ко второму и не говорит, чем администрировать: за публикацией может стоять файловая база, кластер или автономный сервер.

ЦельРаннер администрируетКлиент открывает
файловаяconnection: File=…после publish или объявленный вручную
кластер 1Сconnection: Srvr=…;Ref=…после publish или объявленный вручную
автономный серверstandalone.gate — SSH-шлюзHTTP-адрес самого сервера

Кластер и автономный сервер могут стоять на другой машине, и их файловая система раннеру недоступна. Поэтому workPath всегда локален, пути в командах, адресованных цели, разрешаются на её стороне, а результат с удалённой цели забирается объявленным каналом обмена, а не чтением чужого пути. Режим, где раннер сам поднимает процесс, работает только с локальной точкой входа.

Следствие для диагностики: журнал платформы на стороне цели и технологический журнал сервера раннеру не видны — квитанция их не обещает.

Адрес для клиента живёт в infobase.web.url: у автономного сервера он известен сразу, у остальных появляется после публикации.

Выбор провайдера

  1. Умолчания заданы нами и живут в коде — матрица (операция, цель) → цепочка.
  2. Раннер берёт первого готового в этом окружении.
  3. providers.<операция> в конфиге переопределяет жёстко: неготовый — отказ, без отката.
  4. На проводе и в CLI провайдера нет: вызывающий не выбирает исполнителя.
  5. Квитанция объясняет выбор: selected, origin, skipped.

Эксперименты: как включить и выключить

Часть строк матрицы помечена экспериментальными: исполнитель реализован и прогнан, но в цепочку умолчаний не входит — раннер сам его не выберет. Включается он только явно, на одну операцию, ключом providers.<операция>; выключается удалением ключа. Другого выключателя нет: ни флага CLI, ни переменной окружения, ни состояния на диске.

Режим (операция)Экспериментальный исполнительВключитьЧто даёт
buildagentproviders.build: agentзагрузка и update-db-cfg одной сессией, поколение записывается
dumpagentproviders.dump: agentпропуск выгрузки по поколению; инкремент и частичная — на месте
makeagentproviders.make: agentcf/cfe через dump-cfg, epf/erf через загрузку из файлов
extensionsagentproviders.extensions: agentсостав и свойства расширений группой config extensions
infobase.configuration.exportagentproviders.infobase.configuration.export: agentтолько рабочая конфигурация
infobase.dumpibcmdproviders.infobase.dump: ibcmdдо появления проверки монопольного доступа
infobase.restoreibcmdproviders.infobase.restore: ibcmdто же

Ключ пишется в v8project.yaml или в личный слой v8project.local.yaml — второй удобен, чтобы включить эксперимент у себя и не трогать общий конфиг:

providers:
  build: agent
  dump: agent

Проверить, что включилось, можно по квитанции в ответе любой команды: provider.selected называет исполнителя, provider.origin.kind: override — что его назначил ключ, а не умолчание. Валидация отвергает ключ там, где выбирать не из чего (у автономного сервера исполнитель один — agent через шлюз, ключ ему не нужен и не разрешён) и там, где названный исполнитель операцию не реализует; отказ называет, кто её реализует.

Экспериментальный исполнитель не откатывается: если он не готов (нет платформы для управляемого агента, точка входа не отвечает), команда отказывает, а не берёт следующего по цепочке. Место agent в цепочке умолчаний решится вместе с долгоживущей сессией: пока старт агента на каждую команду съедает выигрыш.

Изменилась ли база

У раннера две независимые проверки. По файлам исходников он считает хеши и хранит их в workPath — это отвечает на вопрос «что изменилось у меня». У платформы он спрашивает идентификатор поколения конфигурации — это отвечает на вопрос «менялась ли база».

что это40-значный токен конфигурации; меняется при любом её изменении
как сравниватьтолько на равно и не равно: «больше» и «меньше» смысла не имеют
у кого спроситьКонфигуратор /GetConfigGenerationID, ibcmd config generation-id, агентская сессия — около секунды
на что не отвечаетне говорит, что именно изменилось и кто менял; для этого нужно сравнение конфигураций
предметсвой токен у основной конфигурации и у каждого расширения

Замер: токен основной конфигурации у Конфигуратора и ibcmd совпадает, а токены расширений у них разные — сравнивать нужно значения, полученные одним и тем же инструментом.

Агент: два режима

managedattached
кто поднялраннервы
где бываетфайловая база и кластеравтономный сервер — всегда, он держит свой шлюз сам; файловая база и кластер — только если агент Конфигуратора подняли вы
признак в конфигеключей tools.designer_agent.attach нет — раннер поднимает самinfobase.standalone.gate / tools.designer_agent.attach
флаги запускараннер плюс вашитолько ваши
если недоступеношибка запускаendpoint_unreachable, свой рядом не поднимает

Правила

замоккоманда владеет workPath целиком; сессия агента живёт столько же
дедлайну каждой команды; отмена засчитывается только после терминального состояния процесса
публикацияполная замена цели идёт через staging и backup
превью--dry-run не берёт замок и ничего не создаёт
секретымаскируются во всех выводах

Unica вызывает CLI с --json-message. MCP — для хостов, подключающих раннер напрямую; там 8 инструментов.

Слои

flowchart TB
  subgraph adapters["Адаптеры транспорта"]
    CLI["cli
аргументы, текст и JSON"] MCP["mcp
8 инструментов, stdio и HTTP"] end UC["use_cases — оркестрация
замок, пайплайн, дедлайн"] subgraph shared["Общее"] CFG["config"] DOM["domain"] CD["change_detection"] PARS["parsers"] end PLAT["platform — вызов утилит"] SUP["support — файлы, staging, журналы"] CLI --> UC MCP --> UC UC --> CFG UC --> DOM UC --> CD UC --> PARS UC --> PLAT PLAT --> SUP
СлойОтвечает заНе знает про
cliразбор аргументов, вывод текстом и JSON, взятие замкакак устроены утилиты платформы
mcpинструменты, сессии HTTP, лимит одновременных вызововто же
use_casesпорядок шагов, замок, дедлайн, выбор провайдерани clap, ни MCP-типы
configчтение и проверка v8project.yaml и overlayисполнение
domainтипы результата, матрица провайдеровпроцессы
change_detectionчто изменилось с прошлого разачем грузить
parsersжурналы и отчёты → типырешения
platformаргументы, запуск, коды выхода утилитбизнес-смысл команды

Процессы

flowchart LR
  R["раннер
CLI или MCP-сервер"] R -->|"процесс на операцию"| D["1cv8 DESIGNER"] R -->|"процесс на операцию"| I["ibcmd"] R -->|"сессия SSH"| A["агент: 1cv8 /AgentMode
или шлюз ibsrv"] R -->|"одна живая сессия"| E["1cedtcli"] R -->|"процесс на запуск"| C["клиент 1С"] R -->|"процесс на операцию"| W["webinst"]

Варианты развёртывания 1С

Вид цели решает, какими утилитами раннер работает, по какому каналу отдаёт команду и откуда забирает результат. Видов три — файловая база, кластер 1С, автономный сервер, — а машин под ними бывает сколько угодно. Ниже одиннадцать развёрток, которые встречаются на практике. Последние три отличаются не видом цели, а тем, кто владеет её процессом: служба, ваша консоль или контейнер.

Как читать схемы

Схемы нарисованы в нотации ArchiMate, уровень технологий: рамка — машина (node), прямоугольник — процесс (system software), скруглённый блок — точка входа (technology service), «документ» и цилиндр — данные (artifact), синий блок — сам раннер (application component). Подпись на стрелке называет канал и протокол; пунктир — сеть, сплошная — процесс или файл на той же машине. Серое — то, с чем раннер не разговаривает.

flowchart TB
  L1["процесс
утилита платформы"] L2(["точка входа
SSH-шлюз, HTTP"]) L3@{ shape: doc, label: "файл или каталог" } L4@{ shape: cyl, label: "база данных СУБД" } L5["v8-runner"] L6["вне раннера"] class L1 sw class L2 svc class L3 art class L4 art class L5 run class L6 off classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef svc fill:#e7f3dc,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; classDef off fill:#e4e4e7,stroke:#9a9aa2,color:#33333a;

Сам раннер ничего не исполняет. Утилиту он вызывает запуском процесса — аргументы командной строки, код выхода и журнал; с агентом и шлюзом говорит сессией SSH. Поэтому на стрелке от раннера стоит вид вызова, а не имя команды. Где раннер поднимает процесс сам, у стрелки написано «поднимает»: агент Конфигуратора он запускает и только потом к нему подключается, а шлюз автономного сервера поднимаете вы — туда идёт одна сессия.

Общая карта

Раннер запускает утилиты у себя и достаёт цель тремя способами: файлом, сетевым протоколом платформы и SSH. Четвёртого нет — консоль кластера и его RAS остаются вне раннера. Здесь показан только канал администрирования; чем и откуда базу открывает человек, видно в каждом варианте отдельно.

flowchart LR
  subgraph HOST["машина раннера"]
    R["v8-runner
CLI · MCP"] EDT["1cedtcli"] DES["1cv8 DESIGNER"] IBC["ibcmd"] WEB["webinst"] AGT(["1cv8 /AgentMode
127.0.0.1:1543"]) end SRC@{ shape: doc, label: "исходники
XML, проект EDT" } FDB@{ shape: doc, label: "файловая база
каталог с 1Cv8.1CD" } CLU["кластер 1С
ragent · rmngr · rphost"] DBMS@{ shape: cyl, label: "СУБД" } GATE(["автономный сервер
SSH-шлюз ibsrv 1543"]) WS(["Apache · IIS"]) R -->|"одна живая сессия"| EDT R -->|"процесс на операцию"| DES R -->|"процесс на операцию"| IBC R -->|"процесс на операцию"| WEB R -->|"поднимает"| AGT R -->|"SSH 127.0.0.1:1543"| AGT R -.->|"SSH · SFTP"| GATE EDT --> SRC DES --> SRC DES -->|"файл"| FDB DES -.->|"TCP 1541"| CLU IBC -->|"--db-path"| FDB IBC -.->|"--dbms: прямо в СУБД"| DBMS AGT -->|"файл"| FDB AGT -.->|"TCP 1541"| CLU WEB -->|"публикация"| WS CLU --> DBMS class R run class DES,IBC,WEB,EDT,CLU sw class AGT,GATE,WS svc class SRC,FDB,DBMS art classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef svc fill:#e7f3dc,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233

Утилиты EDT к базе не подключаются: 1cedtcli работает только с исходниками, поэтому во всех одиннадцати вариантах он одинаков.

1. Файловая база

Всё на одной машине: и раннер, и платформа, и каталог базы. Самый частый случай для разработчика и для CI, который поднимает базу с нуля.

flowchart LR
  subgraph HOST["машина раннера"]
    R["v8-runner"]
    DES["1cv8 DESIGNER"]
    IBC["ibcmd"]
    AGT(["1cv8 /AgentMode
127.0.0.1:1543"]) CLI["1cv8c · клиент"] IB@{ shape: doc, label: "каталог базы
1Cv8.1CD" } WP@{ shape: doc, label: "workPath
журналы, хеши, .cf, .dt" } end R -->|"процесс на операцию"| DES R -->|"процесс на операцию"| IBC R -->|"поднимает"| AGT R -->|"SSH 127.0.0.1:1543"| AGT R -->|"процесс на запуск"| CLI DES -->|"файл, монопольно"| IB IBC -->|"--db-path"| IB AGT -->|"файл"| IB CLI -->|"файл"| IB DES --> WP class R run class DES,IBC,CLI sw class AGT svc class IB,WP art classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef svc fill:#e7f3dc,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233

2. Файловая база и веб-сервер

Файловая база и веб-сервер Apache или IIS на одной машине с раннером. У базы два адреса: по файловому пути её администрируют, по HTTP — открывают веб-клиентом.

flowchart LR
  subgraph HOST["машина раннера"]
    R["v8-runner"]
    WEBI["webinst"]
    DES["1cv8 DESIGNER"]
    CLI["1cv8c · клиент"]
    WS(["Apache · IIS
модуль wsap · wsisapi"]) PUB@{ shape: doc, label: "каталог публикации
default.vrd" } IB@{ shape: doc, label: "каталог базы
1Cv8.1CD" } end BR(["браузер · тонкий клиент"]) R -->|"процесс на операцию"| WEBI R -->|"процесс на операцию"| DES R -->|"процесс на запуск"| CLI CLI -->|"File=…, файл"| IB WEBI -->|"-dir, -wsdir, -connstr File=…"| PUB WEBI -->|"-confpath: правка конфига"| WS WS -->|"файл"| IB WS --> PUB DES -->|"файл, монопольно"| IB BR -.->|"HTTP · HTTPS, ws=…"| WS class R run class WEBI,DES,CLI sw class WS,BR svc class PUB,IB art classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef svc fill:#e7f3dc,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233

3. Кластер на своей машине

Сервер 1С и раннер стоят на одной машине. Данные базы держит СУБД, а раннер работает с ней через кластер — по строке подключения.

flowchart LR
  subgraph BOX["одна машина"]
    subgraph HOST["раннер и утилиты"]
      R["v8-runner"]
      DES["1cv8 DESIGNER"]
      IBC["ibcmd"]
      AGT(["1cv8 /AgentMode
127.0.0.1:1543"]) CLI["1cv8c · клиент"] WP@{ shape: doc, label: "workPath
.cf, .dt, журналы" } end subgraph SRV["сервер 1С"] RAG["ragent 1540
rmngr 1541"] RPH["rphost 1560–1591"] end end DBMS@{ shape: cyl, label: "СУБД" } R -->|"процесс на операцию"| DES R -->|"процесс на запуск"| CLI R -->|"процесс на операцию"| IBC R -->|"поднимает"| AGT R -->|"SSH 127.0.0.1:1543"| AGT DES -->|"Srvr=…;Ref=…, TCP"| RAG CLI -->|"TCP"| RAG AGT -->|"TCP"| RAG IBC -->|"--dbms, --database-server"| DBMS RAG --> RPH RPH --> DBMS DES --> WP class R run class DES,IBC,CLI,RAG,RPH sw class AGT svc class WP,DBMS art classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef svc fill:#e7f3dc,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; style BOX fill:#fbfbfc,stroke:#c3c9d0,color:#4b5560 style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233 style SRV fill:#f1f8ea,stroke:#8aad76,color:#12210c

4. Кластер на другой машине, несколько rphost

Рабочая или тестовая база на сервере приложений с пулом рабочих процессов. Раннер дотягивается до неё по сети: файловая система сервера и его журналы ему недоступны.

flowchart LR
  subgraph HOST["машина раннера"]
    R["v8-runner"]
    DES["1cv8 DESIGNER"]
    CLI["1cv8c · клиент"]
    WP@{ shape: doc, label: "workPath
.cf, .dt, отчёты тестов" } end subgraph SRV["сервер приложений 1С"] RAG["ragent 1540 · rmngr 1541"] RP1["rphost"] RP2["rphost"] RP3["rphost"] LOG@{ shape: doc, label: "журнал регистрации,
технологический журнал" } end DBMS@{ shape: cyl, label: "СУБД
5432 · 1433" } R -->|"процесс на операцию"| DES R -->|"процесс на запуск"| CLI DES -.->|"TCP 1541, дальше 1560–1591"| RAG CLI -.->|"TCP"| RAG RAG --> RP1 RAG --> RP2 RAG --> RP3 RP1 --> DBMS RP2 --> DBMS RP3 --> DBMS RP1 --> LOG DES --> WP class R run class DES,CLI,RAG,RP1,RP2,RP3 sw class WP,DBMS art class LOG off classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; classDef off fill:#e4e4e7,stroke:#9a9aa2,color:#33333a; style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233 style SRV fill:#f1f8ea,stroke:#8aad76,color:#12210c

5. Кластер, RAS поднят удалённо

Сервер администрирования вынесен на отдельную машину, консоль и скрипты ходят к кластеру через него. Для раннера это соседний канал: он им не пользуется.

flowchart LR
  subgraph HOST["машина раннера"]
    R["v8-runner"]
    DES["1cv8 DESIGNER"]
  end
  subgraph SRV["сервер 1С"]
    RAG["ragent 1540 · rmngr 1541"]
    RPH["rphost"]
  end
  subgraph ADMIN["машина с RAS"]
    RAS(["RAS 1545"])
    RAC["rac · консоль"]
  end
  R -->|"процесс на операцию"| DES
  DES -.->|"TCP 1541, Srvr=…;Ref=…"| RAG
  RAS -.->|"TCP 1541"| RAG
  RAC --> RAS
  RAG --> RPH
  class R run
  class DES,RAG,RPH sw
  class RAS,RAC off
  classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233;
  classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c;
  classDef off fill:#e4e4e7,stroke:#9a9aa2,color:#33333a;
  style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233
  style SRV fill:#f1f8ea,stroke:#8aad76,color:#12210c
  style ADMIN fill:#eeeef0,stroke:#a8a8b0,color:#33333a

6. Кластер и веб-сервер

Кластерная база, опубликованная на Apache или IIS. Веб-сервер держит подключение к кластеру по сети; файловый доступ к базе ему не нужен.

flowchart LR
  subgraph HOST["машина раннера"]
    R["v8-runner"]
    WEBI["webinst"]
    CLI["1cv8c · клиент"]
    WS(["Apache · IIS
модуль wsap · wsisapi"]) PUB@{ shape: doc, label: "каталог публикации
default.vrd" } end subgraph SRV["сервер 1С"] RAG["ragent · rmngr 1541"] RPH["rphost"] end BR(["браузер · тонкий клиент"]) R -->|"процесс на операцию"| WEBI R -->|"процесс на запуск"| CLI CLI -.->|"Srvr=…;Ref=…, TCP 1541"| RAG WEBI -->|"-dir, -wsdir, -connstr Srvr=…;Ref=…"| PUB WEBI -->|"-confpath: правка конфига"| WS WS --> PUB WS -.->|"TCP 1541"| RAG BR -.->|"HTTP · HTTPS, ws=…"| WS RAG --> RPH class R run class WEBI,CLI,RAG,RPH sw class WS,BR svc class PUB art classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef svc fill:#e7f3dc,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233 style SRV fill:#f1f8ea,stroke:#8aad76,color:#12210c

7. Автономный сервер на своей машине

ibsrv поднимаете вы, раннер его не запускает и не ищет. Разговор идёт не с утилитой платформы, а с процессом сервера — через его SSH-шлюз.

flowchart LR
  subgraph BOX["одна машина"]
    subgraph HOST["раннер"]
      R["v8-runner"]
      WP@{ shape: doc, label: "workPath
всегда локален" } end subgraph SRV["автономный сервер"] GATE(["SSH-шлюз 1543
ibsrv --enable-ssh-gate"]) IBSRV["ibsrv
поднят вами"] UD@{ shape: doc, label: "каталог пользователя шлюза
users-data и имя пользователя" } HTTPS(["HTTP 8314"]) DB@{ shape: cyl, label: "база данных" } end end BR(["браузер · тонкий клиент"]) R -->|"SSH: команда строкой, ответ JSON"| GATE R -->|"exchange: dir — ссылки и копии"| UD R -->|"файл"| WP GATE --> IBSRV IBSRV --> UD IBSRV --> DB IBSRV --> HTTPS BR -->|"HTTP"| HTTPS class R run class IBSRV sw class GATE,HTTPS,BR svc class WP,UD,DB art classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef svc fill:#e7f3dc,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; style BOX fill:#fbfbfc,stroke:#c3c9d0,color:#4b5560 style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233 style SRV fill:#f1f8ea,stroke:#8aad76,color:#12210c

8. Автономный сервер на другой машине

Автономный сервер на отдельной машине. Раннеру не нужна ни платформа, ни доступ к чужому диску — нужен SSH до шлюза и объявленный канал файлов.

flowchart LR
  subgraph HOST["машина раннера"]
    R["v8-runner"]
    WP@{ shape: doc, label: "workPath
остаётся здесь" } SRC@{ shape: doc, label: "исходники и артефакты" } end subgraph SRV["другая машина"] GATE(["SSH-шлюз 1543"]) IBSRV["ibsrv"] UD@{ shape: doc, label: "каталог пользователя шлюза
пути разрешаются здесь" } HTTPS(["HTTP 8314"]) end DB@{ shape: cyl, label: "база данных" } BR(["браузер · тонкий клиент"]) R -->|"файл"| WP R -->|"файл"| SRC R -.->|"SSH: команда строкой, ответ JSON"| GATE SRC -.->|"SFTP того же соединения"| UD GATE --> IBSRV IBSRV --> UD IBSRV --> DB IBSRV --> HTTPS BR -.->|"HTTP"| HTTPS class R run class IBSRV sw class GATE,HTTPS,BR svc class WP,SRC,UD,DB art classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef svc fill:#e7f3dc,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233 style SRV fill:#f1f8ea,stroke:#8aad76,color:#12210c

9. Кластер поднят из консоли, а не службой

Обычный приём разработки: сервер 1С запускают руками в окне терминала, чтобы служба не висела постоянно. Канал до него тот же, что у службы, — меняется владелец процесса.

flowchart LR
  subgraph BOX["одна машина"]
    subgraph HOST["раннер и утилиты"]
      R["v8-runner"]
      DES["1cv8 DESIGNER"]
      CLI["1cv8c · клиент"]
    end
    subgraph CON["ваша консоль"]
      RAG["ragent, запущенный руками
1540 · 1541"] RPH["rphost"] LOG@{ shape: doc, label: "журнал сервера
у вас перед глазами" } end end DBMS@{ shape: cyl, label: "СУБД" } R -->|"процесс на операцию"| DES R -->|"процесс на запуск"| CLI DES -->|"Srvr=localhost:1541;Ref=…"| RAG CLI -->|"TCP"| RAG RAG --> RPH RAG --> LOG RPH --> DBMS class R run class DES,CLI,RAG,RPH sw class DBMS art class LOG off classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; classDef off fill:#e4e4e7,stroke:#9a9aa2,color:#33333a; style BOX fill:#fbfbfc,stroke:#c3c9d0,color:#4b5560 style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233 style CON fill:#f1f8ea,stroke:#8aad76,color:#12210c

10. Кластер 1С в контейнере

Сервер 1С и СУБД подняты в контейнерах, раннер работает на хосте. Про Docker раннер не знает ничего: для него это цель на другой машине, к которой ведёт опубликованный порт.

flowchart LR
  subgraph HOST["машина раннера"]
    R["v8-runner"]
    DES["1cv8 DESIGNER"]
    CLI["1cv8c · клиент"]
    WP@{ shape: doc, label: "workPath
.cf, .dt, отчёты" } end subgraph C1["контейнер сервера 1С"] RAG["ragent 1540 · rmngr 1541"] RPH["rphost 1560–1591"] end subgraph C2["контейнер СУБД"] DBMS@{ shape: cyl, label: "база данных" } end R -->|"процесс на операцию"| DES R -->|"процесс на запуск"| CLI DES -.->|"опубликованные порты"| RAG CLI -.->|"TCP"| RAG DES --> WP RAG --> RPH RPH -.-> DBMS class R run class DES,CLI,RAG,RPH sw class WP,DBMS art classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233 style C1 fill:#f1f8ea,stroke:#8aad76,color:#12210c style C2 fill:#f1f8ea,stroke:#8aad76,color:#12210c

11. Автономный сервер в контейнере

Тот же ibsrv, но поднятый контейнером. Единственный вариант, где на машине раннера не нужно ни одной утилиты 1С.

flowchart LR
  subgraph HOST["машина раннера"]
    R["v8-runner"]
    WP@{ shape: doc, label: "workPath
остаётся здесь" } end subgraph C["контейнер ibsrv"] GATE(["SSH-шлюз 1543"]) IBSRV["ibsrv"] UD@{ shape: doc, label: "каталог пользователя шлюза
смонтирован томом" } HTTPS(["HTTP 8314"]) DB@{ shape: cyl, label: "база данных" } end BR(["браузер · тонкий клиент"]) R --> WP R -.->|"SSH: команда строкой, ответ JSON"| GATE R -.->|"exchange: sftp"| UD R -->|"exchange: dir — если том виден раннеру"| UD GATE --> IBSRV IBSRV --> UD IBSRV --> DB IBSRV --> HTTPS BR -.->|"HTTP"| HTTPS class R run class IBSRV sw class GATE,HTTPS,BR svc class WP,UD,DB art classDef run fill:#cfe4fa,stroke:#3f7ba6,color:#0d2233; classDef sw fill:#cde8b9,stroke:#4f7a3c,color:#12210c; classDef svc fill:#e7f3dc,stroke:#4f7a3c,color:#12210c; classDef art fill:#f6e8c8,stroke:#a4813a,color:#241c0c; style HOST fill:#eef5fb,stroke:#8fb4cf,color:#0d2233 style C fill:#f1f8ea,stroke:#8aad76,color:#12210c

Что доступно по виду цели

Ни местоположение цели, ни владелец её процесса — служба, консоль, контейнер — на этот список не влияют: он зависит только от вида. Первый исполнитель в клетке — умолчание; следующего реализованного раннер пробует, если первый не готов, а экспериментальные включаются только ключом providers.<операция>.

ОперацияФайловая базаКластер 1САвтономный сервер
initdesigner ibcmddesigner ibcmdнет сервер поднят вами
builddesigner ibcmd agentdesigner ibcmd agentagent через шлюз
loaddesignerdesignerнет у шлюза нет compare-cfg
dumpdesigner ibcmd agentdesigner ibcmd agentagent
makedesigner agentdesigner agentagent
extensionsibcmd agentibcmd agentagent
infobase configuration exportdesigner ibcmd agentdesigner ibcmd agentagent
infobase dump · restoredesigner ibcmd agentdesigner ibcmd agentнет dump-ib роняет ibsrv 8.3.27
syntaxdesignerdesignerнет
testклиент: 1cv8c, иначе --client-modeклиент: 1cv8c, иначе --client-modeнет нужна строка подключения
launchdesigner · thin · thick · ordinary · mcp; web — когда объявлен infobase.web.urldesigner · thin · thick · ordinary · mcp; web — когда объявлен infobase.web.urllaunch web — браузером, launch thin — тонким клиентом по тому же адресу; --via выбирает адрес там, где их два
publishwebinstwebinstне нужна: сервер отдаёт HTTP сам

У тонкого клиента два пути, и раннер умеет оба: по строке подключения — прямо в файловую базу или кластер, по веб-адресу — через Apache, IIS или автономный сервер. Какой возьмёт launch thin без ключа, задаёт вид цели: у файловой и кластерной — строка подключения, у автономного сервера — веб, другого адреса у него нет. Ключ --via web|connection умолчание переопределяет и принимается только там, где клиент тонкий; launch web открывает тот же веб-адрес браузером. ibcmd серверную цель открывает прямо в СУБД, мимо кластера, по секции infobase.dbms; у файловой базы ему хватает пути к каталогу, а у автономного сервера секция не принимается вовсе. Какие строки помечены экспериментальными и как их включить — в разделе Эксперименты.

Каналы и протоколы

КаналМежду кемЧемЧто ходит
запуск утилитыраннер → 1cv8, 1cv8c, ibcmd, webinst, 1cedtcliпроцесс ОС: аргументы, код выхода, журналкоманда и её артефакты на диске
файловая базаКонфигуратор, ibcmd, клиент → каталог с 1Cv8.1CDфайловый доступ; у операций с конфигурацией — монопольныйданные базы
кластерКонфигуратор, клиент, агент → ragent 1540, rmngr 1541, rphost 1560–1591протокол платформы поверх TCPсеанс работы с ИБ
СУБДibcmd → сервер СУБД (5432, 1433, …)--dbms, --database-server, --database-nameсоздание серверной базы; тем же каналом идут и другие операции, если исполнителем выбран ibcmd
агент Конфигураторараннер → 1cv8 /AgentMode на 127.0.0.1:1543SSH встроенным клиентом, без псевдотерминала: команда строкой, ответ JSONкоманды сессии; файлы — через AgentBaseDir в workPath
шлюз автономного серверараннер → ibsrv на host:1543SSH встроенным клиентом: команда строкой, ответ JSONкоманды сессии
обмен файлами с цельюраннер ↔ каталог пользователя шлюзаexchange: sftp — подсистема SFTP того же соединения; exchange: { dir } — видимый каталогисходники, списки, .cf, .cfe, результаты выгрузки
публикацияwebinst → Apache или IIS на машине раннеразапуск процесса, запись каталога публикации и правка конфига веб-сервераdefault.vrd целиком
веб-клиентбраузер, тонкий клиент → веб-сервер 80 · 443HTTP, HTTPS; адрес вида ws=…сеанс пользователя
автономный сервер, клиентбраузер, тонкий клиент → ibsrv 8314HTTP, HTTPSсеанс пользователя
клиентский MCPраннер → клиент 1С, поднятый командой launch mcp с /C runMcpHTTP на 127.0.0.1, путь /mcpпроверка готовности и инструменты внутри клиента
MCP-сервер раннераИИ-хост → раннерstdio или HTTP на 127.0.0.1:3000вызовы восьми инструментов
вне раннераконсоль кластера, rac → RAS 1545сеансы, лицензии, блокировки — раннер их не трогает

Сколько живёт

КомпонентГдеСколько живётСколько штук
CLI-процессОСодна команда1
MCP-серверОСдо остановки хоста1
замок workPathфайл в workPathвремя команды1 на каталог
поиск утилитпамять процессавремя процесса, с кешем1
состояние измененийworkPath/hash-storagesоткрыто на время команды, хранится между запускамипо набору исходников
сессия EDTпроцесс 1cedtcliв CLI — до конца команды; в MCP-сервере — до остановки, греется заранее1 на хост
сессия агентапроцесс агента или ibsrvровно столько, сколько раннер владеет workPath1 на цель
Designer, ibcmd, webinstотдельный процессодна операция1 одновременно
автономный серверваш процессне наш; раннер его не поднимает и не перезапускает
клиент 1Спроцессвремя теста или запуска1
HTTP-сессии MCPпамять серверадо закрытия или простоя (idle_ttl_secs)до max_sessions

Что из этого следует

Правила выбора провайдера и режимы агента — в разделе Эксперименты.