От монолита к автономным агентам: архитектура и граф состояний ИИ-агента в 1С
Первая статья цикла из 7 практических руководств по проектированию, разработке и промышленному внедрению автономных мультиагентных систем в корпоративном контуре «1С:Предприятие 8» на примере открытого проекта NOPik.
Целевая аудитория: Архитекторы решений 1С, ведущие разработчики, руководители ИТ-отделов, специалисты по интеграции ИИ.
Применимость: 1С:Предприятие 8.3 (не ниже 8.3.20), любая типовая конфигурация (ERP, УТ, КА, УНФ, БП, ЗУП). Точка входа подключается через сменный адаптер: «Команда формы» работает уже сегодня, адаптер на основе объекта «Бот» Системы взаимодействия - начиная с платформы 8.5.5 (пока не выпущена, см. раздел «Точка входа»).
Серия: NOPik - автономный ИИ-агент для 1С:Предприятие 8 (статья 1 из 7).
Репозиторий: https://github.com/NickScherbakov/nopik-articles-public
- Кризис наивного вайб-кодинга в Enterprise
- Архитектурный манифест проекта NOPik
- Точка входа: адаптерный слой вместо жесткой привязки к объекту «Бот»
- Теория управления агентом: FSM и HSM
- Репозиторий, Git и ibcmd
- Модуль бота в 1С
- Учебная ветка: свой оркестратор на Python / LangGraph
- Дорожная карта цикла
🔍 Введение: кризис наивного вайб-кодинга в Enterprise
Первая волна энтузиазма вокруг больших языковых моделей (LLM) в сообществе 1С породила десятки однотипных решений: внешняя обработка, на форму которой выведено поле ввода промпта, многострочное текстовое поле ответа и кнопка, отправляющая синхронный HTTP-запрос к публичному API нейросети.
В реальном корпоративном секторе такой подход терпит немедленный крах по четырем причинам.
- Иллюзия агентности (Stateless Predictor vs Stateful Agent). Сама по себе языковая модель - это статический вероятностный предсказатель следующего токена. У нее нет ни долгосрочной памяти, ни воли, ни внутреннего детерминированного состояния. Попытка возложить на один гигантский промпт («Ты ведущий эксперт 1С, проверь остатки, сформируй проводки и создай документ») приводит к катастрофическому росту контекста, галлюцинациям в именах реквизитов и нарушению ссылочной целостности базы.
- Закон Люссера: падение надежности цепочки шагов. Согласно закону Люссера, надежность последовательной системы равна произведению надежностей каждого ее элемента:
R_sys = R_1 × R_2 × ... × R_n. Если на каждом шаге вероятность корректного ответа модели составляет даже 90% (0.9), то цепочка всего из 5 невалидируемых шагов завершится успехом с вероятностью менее 60% (0.9^5 ≈ 0.59). В контуре бухгалтерского или складского учета такая погрешность недопустима: за долей несошедшихся цепочек стоят не абстрактные проценты, а неверные проводки и расхождения в остатках. - Хрупкость кастомных интерфейсов (UI Fragmentation). Попытки встроить в форму 1С веб-документ (HTML/JS/React WebView) для имитации чата приводят к постоянным сбоям: несовместимость движков рендеринга на разных ОС (Windows, Linux-дистрибутивы Astra/RED OS), проблемы с пробросом событий через
document.locationи сломанная верстка при обновлении платформы. - Нарушение транзакционной изоляции. Синхронное ожидание ответа модели внутри сеанса пользователя 1С блокирует интерфейс, вызывает клиентские таймауты и создает риск зависания транзакций при сетевых лагах.
Чтобы преодолеть эти ограничения, необходим переход от монолитных скриптов к системной инженерии автономных агентов, где модель помещена внутрь строгого математического автомата состояний, отделена от прикладных данных протокольными контрактами и встроена в нативные механизмы платформы.
🎯 Архитектурный манифест: проект NOPik
В качестве сквозного демонстрационного проекта цикла мы берем архитектуру NOPik - корпоративного ИИ-агента. Исходный код расширения и примеры оркестратора публикуются в открытом репозитории проекта.
Фундаментальный принцип NOPik - «Zero-Footprint Core» (минимальный след в целевой конфигурации): внутри контура 1С:Предприятие живет только точка входа - сменный адаптер и пара обслуживающих модулей - а вся оркестрация, память и рассуждение вынесены за периметр учетной системы. Сам адаптер не фиксирован жестко: единый программный контракт приема сообщений реализован в общем модуле, а способ его физического вызова - через объект «Бот» или через команду формы - подключается отдельно (подробности - в разделе «Точка входа» ниже).
Такое разделение убирает из контура 1С любую бизнес-логику, специфичную для ИИ, и позволяет обновлять «мозг» агента, не трогая продуктивную базу.
📂 Точка входа: адаптерный слой вместо жесткой привязки к объекту «Бот»
В платформе «1С:Предприятие 8.3» существует штатный объект дерева метаданных Общие → Боты. У него есть реальные преимущества как у точки входа: нативность (пользователь общается с агентом в стандартном окне обсуждений, рядом с коллегами и привязанными к документам чатами - одинаково в тонком клиенте на Windows и Linux, в браузере и в мобильном клиенте) и готовый контекст обсуждения (бота можно тегать через @NOPik в чате конкретного заказа, где агент сразу получает ИдентификаторОбсуждения и ссылку на объект).
Но у этого преимущества есть срок начала действия, который честно нужно назвать: для расширений конфигурации (CFE) объект «Бот» становится доступен только начиная с платформы 8.5.5 - на момент публикации эта версия еще не вышла (по объявленному 1С плану выпуск ожидается во второй половине 2026 года, а массовое распространение на типовых конфигурациях - позже). До этого момента объект «Бот» существует только в основной конфигурации (CF), а не в расширении, и жесткая привязка к нему в расширении делает цикл нерабочим прямо сейчас. Проверено эмпирически на платформе 8.3.27.2130: пункт «Добавить» для объекта «Боты» в дереве расширения недоступен независимо от режима совместимости.
Решение - не ждать 8.5.5 и не снимать конфигурацию с поддержки ради обхода, а развязать точку входа от бизнес-логики через адаптерный слой. Весь прием сообщения сведен к одному программному контракту в общем модуле НОПик_Сеть:
НОПик_Сеть.ПоставитьЗадачуНаОтправку(АвторID, ТекстСообщения, ИдентификаторОбсуждения = "")К этому контракту сегодня подключены два адаптера, каждый из которых лишь извлекает (автора, текст, идентификатор обсуждения) из своего родного события и передает их дальше без дублирования логики:
- «Команда формы» (доступен уже сейчас). Общая команда
НОПик_СпроситьАгентазапрашивает у пользователя текст сообщения стандартным диалогом ввода строки и передает его в тот же контракт. Не требует объекта «Бот», работает на любой поддерживаемой версии платформы, устанавливается и проверяется в тестовой базе за минуты. - «Бот» Системы взаимодействия (с 8.5.5). Код обработчика сообщений уже написан и лежит в расширении - он активируется как только целевая платформа и конфигурация подтвердят поддержку 8.5.5, без изменения контракта и без переписывания оркестратора.
Такое разделение - пример разрешения противоречия «точка входа должна быть объектом «Бот» и одновременно не может им быть» через отделение способа доставки сообщения от бизнес-логики его обработки, а не через компромисс или ожидание. Один и тот же прием применяется в цикле еще как минимум дважды: в изоляции MCP-контура от специфики 1С и в Circuit Breaker, отделяющем доступность сети от бизнес-логики (см. статьи 3 и 5).
🎯 Теория управления агентом: граф состояний FSM и HSM
Отличие Predictor от Agent
Агентная система возникает только тогда, когда рассуждение модели связывается с циклом действий и обратной связи из среды: c(t+1) = (c_t, a_t, o_t), где a_t - действие в среде (вызов инструмента/API) или рассуждение (мысль/план), а o_t - наблюдаемый отклик среды (ошибка компиляции, результат SQL/BSL-запроса, ответ пользователя).
Чтобы агент не уходил в бесконечные циклы и сохранял управляемость, его поведение моделируется в виде конечного автомата состояний (Finite State Machine, FSM), описываемого кортежем M = (S, Σ, δ, s_0, F), где:
S- конечное множество состояний агента (например:RECEIVE,PLAN,CALL_TOOL,VERIFY,RESPOND);Σ- входной алфавит событий (получено сообщение, инструмент вернул данные, ошибка валидации, отказ пользователя);δ: S × Σ → S- функция переходов между состояниями с предикатами защиты (Guards);s_0 ∈ S- начальное состояние (IDLE/RECEIVE);F ⊆ S- терминальные состояния (RESPOND,ABORT).
Переход к иерархическим автоматам (HSM)
Для сложных сценариев плоский FSM приводит к взрывному росту числа связей («спагетти-маршрутизация»). В архитектуре NOPik мы используем иерархический автомат состояний (Hierarchical State Machine, HSM). В HSM состояния могут быть сгруппированы в суперсостояния (Superstates):
- Суперсостояние
WORKINGобъединяет подсостоянияANALYZE_METADATA,COMPOSE_QUERY,EXECUTE_READ. - Общие политики (Global Guards). Лимиты токенов, тайм-ауты транзакций и контуры безопасности (Circuit Breakers) вешаются на суперсостояние один раз и наследуются всеми дочерними узлами.
- Чекпоинтинг (Deep History). Маркер состояния сохраняет снимок контекста на диск/в БД. Если на шаге 4 из 6 произошел сбой сети или падение сервиса, выполнение возобновляется ровно с контрольной точки шага 4, не требуя повторных затрат на предшествующие вызовы LLM.
💻 Инфраструктура разработки: от монолита к Git и ibcmd
Разработка ИИ-агентов требует высокой скорости итерирования. Классическая схема «Конфигуратор → Сохранить → Обновить конфигурацию БД» здесь неприменима: она медленная и не автоматизируется скриптами агентов.
Конфигурация расширения версионируется в формате открытых иерархических файлов (XML/JSON/BSL) — том же, что дают штатная выгрузка конфигурации в файлы средствами платформы и 1C:EDT:
Вместо запуска тяжелого графического Конфигуратора для применения изменений используется утилита командной строки ibcmd, доступная в дистрибутивах платформы 8.3. Для частичной накатки изменений из Git-репозитория в тестовую базу выполняется скрипт:
При работе в ОС Linux (или WSL2 под Windows) критически важно задать локальную настройку Git, исключающую экранирование кириллических путей к объектам метаданных 1С: git config core.quotepath false.
💻 Практическая реализация: модуль бота в 1С
Создадим расширение со свойствами:
- Имя: NOPik
- Префикс:
НОПик_ - Назначение: Дополнение
- Режим совместимости: Соответствует основной конфигурации (не ниже 8.3.20).
Ниже - модуль адаптера «Бот»: Общие → Боты → НОПик в дереве метаданных расширения. Напоминание из раздела «Точка входа» выше: этот объект физически создается в расширении начиная с платформы 8.5.5. Код приведен как целевая реализация адаптера и уже лежит в репозитории проекта; для проверки цикла на текущей платформе используйте адаптер «Команда формы» (код - сразу после этого блока).
Обратите внимание, насколько тонкий этот модуль: он не собирает контекст запроса сам, а лишь извлекает из объекта «Сообщение обсуждения» три значения (автора, текст, идентификатор обсуждения) и передает их в единый контракт общего модуля НОПик_Сеть - тот же самый, которым пользуется адаптер «Команда формы».
А вот адаптер «Команда формы» - тот, который можно проверить прямо сейчас, без ожидания 8.5.5. Общая команда НОПик_СпроситьАгента запрашивает текст сообщения стандартным диалогом ввода строки и передает его через клиент-серверный модуль НОПик_КлиентСервер в тот же контракт НОПик_Сеть.ПоставитьЗадачуНаОтправку:
Истина у ПрочитатьJSON (баг №6 из раздела «Живое тестирование» ниже).Оба фрагмента выше показаны уже в финальном, исправленном виде. Первая версия компилировалась без единой ошибки («Проверка модулей» в Конфигураторе - синтаксический контроль, не выполнение) и выглядела корректной на бумаге. Реальный прогон в 1С:Предприятии вскрыл 6 runtime-ошибок, которые статический контроль платформы не поймал ни разу - полный разбор, с точными формулировками ошибок и скриншотами живого выполнения, в разделе «Живое тестирование» ниже. Модуль на стороне сервера (CommonModules/НОПик_Сеть/Module.bsl) обращается к настоящему, действующему сервису nopikreport.com/api/ask - без ключа авторизации, с ответом за десятки секунд (замерено живым вызовом - 42 секунды на простом вопросе), а не быстрым подтверждением приема: таймаут HTTP-соединения выставлен в 90 секунд именно поэтому. Полученный ответ фоновое задание публикует обратно в то же обсуждение Системы взаимодействия, из которого пришел вопрос.
🧪 Живое тестирование: 6 runtime-ошибок, которые не поймал компилятор
Код выше - уже финальная версия. Первая версия компилировалась в Конфигураторе без единой ошибки («Проверка модулей» - синтаксический контроль, не выполнение) и выглядела правильной на бумаге. Реальный прогон в 1С:Предприятии - не в Конфигураторе - вскрыл 6 отдельных ошибок, ни одну из которых статический контроль платформы не поймал: все они проявляются только в runtime, потому что связаны с типизацией, которая определяется во время исполнения, а не во время компиляции.
- Ссылка вместо
Неопределено.Новый ОписаниеОповещения("Обработчик", Неопределено)падает с «Ошибка при вызове конструктора» - конструктору нужна настоящая ссылка на модуль, где определена процедура-обработчик. - Клиент не может вызвать серверную процедуру двухконтекстного модуля по имени. Платформа резолвит такой вызов к клиентскому экземпляру модуля, где серверных методов нет вообще - «Метод объекта не обнаружен» в runtime. Рабочий паттерн - чисто серверный модуль (
ВызовСервера = Истина), вызываемый с клиента напрямую по имени. УникальныйИдентификатор- свойство, не метод. Вызов со скобками,...ТекущийПользователь().УникальныйИдентификатор(), падает с «Метод объекта не обнаружен» - скобки нужно убрать.- Конструктору
Массивнужно число, а не объект.Новый Массив(КонтекстЗапроса)падает с «Ошибка при вызове конструктора» - единственный позиционный параметр конструктораМассив- это размерность, а не элемент. Массив параметров собирается через.Добавить(). - Позиционные параметры
HTTPСоединениесдвигаютТаймаут. Пропуск одной лишней запятой при пропуске необязательных параметров (Сервер, Порт, Пользователь, Пароль, ИнтернетПрокси, Таймаут, ЗащищенноеСоединение, ...) сдвигает значение 90 в позициюЗащищенноеСоединение, а объектЗащищенноеСоединениеOpenSSL- в позициюИспользоватьАутентификациюОС. Платформа ловит это только в runtime как «Конструктор не найден», потому что позиционные параметры типизируются во время исполнения. ПрочитатьJSONбез второго параметра возвращаетСтруктуру, а неСоответствие. УСтруктурыметодаПолучить(Ключ)нет вообще - вызовРезультатОтвета.Получить("answer")падает с «Метод объекта не обнаружен». Второй параметрИстиназаставляет читать JSON-объекты какСоответствие, у которого этот метод есть.
Каждая ошибка найдена и исправлена по одной и той же схеме: реальный клик «NOPik: Спросить агента» в открытом сеансе 1С:Предприятия → «Метод объекта не обнаружен» / «Ошибка при вызове конструктора» в Журнале регистрации с номером строки модуля → правка → повторный клик. Ниже - скриншоты этого цикла на последней, успешной итерации.
nopikreport.com/api/ask и разобрало ответ. Это единственное надежное доказательство успеха для адаптера «Команда формы»: он не выводит ответ обратно в интерфейс, только протоколирует (см. ограничение выше про адаптер «Бот»).Честное ограничение: адаптер «Команда формы» не показывает текст ответа пользователю - он существует ровно для того, чтобы можно было проверить всю цепочку до появления объекта метаданных «Бот» в 8.5.5. Единственное наблюдаемое сегодня доказательство успеха - запись в Журнале регистрации выше. Когда «Бот» станет доступен, тот же контракт НОПик_Сеть.ПоставитьЗадачуНаОтправку доставит текст ответа прямо в чат Системы взаимодействия - код для этого уже написан и ждет платформы (см. Bots/НОПик/Ext/Module.bsl).
💻 Учебная ветка: свой оркестратор на Python и LangGraph
Важное уточнение, прежде чем читать этот раздел: то, что сейчас реально отвечает на сообщение бота - живой сервис nopikreport.com, показанный в разделе выше, а не граф ниже. Этот граф - не описание того, что происходит на стороне nopikreport.com (туда мы не заглядываем и не должны), а самостоятельный учебный путь: как построить свой оркестратор, если вам нужна логика поверх ваших собственных данных 1С (а не общий вопрос, на который отвечает готовый сервис). Ниже - минимальная, но полностью функциональная архитектурная реализация графа FSM такого агента на базе Python и контрактов Pydantic; она не подключена к боевому пути и развивается отдельно в следующих статьях цикла.
Ключевые узлы графа:
analyze_intent_node- определяет намерение пользователя (построение отчета, диагностика ошибки, общий вопрос) и формирует план шагов;plan_executor_node- выполняет сформированный план и готовит текст ответа;deliver_to_1c_node- отправляет ответ обратно в Систему взаимодействия 1С через обратный webhook.
Узлы связываются в StateGraph с чекпоинтером MemorySaver (в production заменяется на PostgresSaver - тема статьи 6 цикла), что дает агенту устойчивость к сбоям сети и падениям процесса ровно в духе HSM-чекпоинтинга, описанного выше.
🤝 Итоги: дорожная карта цикла
Дальше цикл переходит к остальным компонентам корпоративной инженерии ИИ-агентов. Следующие материалы серии:
- Статья 2. Паттерны рассуждений и мультиагентная оркестрация enterprise-процессов 1С. Декомпозиция задач NOPik на роли: Супервайзер, Аналитик метаданных, Сборщик СКД. Паттерны ReAct и Tree-of-Thoughts.
- Статья 3. Универсальные контракты и протокол MCP. Развертывание MCP-сервера 1С, валидация через Instructor/Pydantic, кликабельные навигационные ссылки
e1cib/data/.... - Статья 4. Надежность и качество. TDD для агента: модульные тесты YAxUnit, сценарии Vanessa Automation, статический анализ BSL Language Server.
- Статья 5. Изоляция и DevSecOps. Контейнеризация в Docker/Kubernetes, безопасные песочницы, защита от Path Traversal.
- Статья 6. Корпоративная память агентов. Двухуровневая память:
ConversationIDпротив семантического поиска в Qdrant, шины RabbitMQ и 1С:Шина. - Статья 7. Безопасность, мониторинг и наблюдаемость. Threat Modeling по OWASP ASI Top 10, Human-in-the-Loop прямо в чате, трейсы в Grafana/ClickHouse.
Исходные коды расширения NOPik и примеры конфигурации графов доступны в репозитории проекта.
Какие узкие места вы видите в переходе от «монолитных» обработок с ИИ к архитектуре на графах состояний в вашей инфраструктуре 1С? Делитесь опытом и вопросами в комментариях - разберем в следующих статьях цикла.
Теги: 1С:Предприятие 8.3, Система взаимодействия, Объект Бот, ИИ-агент, LLM, LangGraph, FSM, HSM, Граф состояний, MCP, ibcmd, BSL, Фоновые задания, Zero-Footprint, Автоматизация 1С, Python, Pydantic, Enterprise AI, NOPik
Вступайте в нашу телеграмм-группу Инфостарт