MAKER получил MCP-сервер: от ТЗ заказчика до кода в 1С – без потери контекста
Интеграция 1С с AI-моделями через MCP-сервер обещает сквозную передачу контекста от ТЗ до кода. Но за красивой картинкой скрывается ловушка: стандартная реализация MCP теряет контекст при перезапуске сессии, а 1С-специалисты, привыкшие к синхронным вызовам, часто забывают про управление состоянием. Разбираем, как MAKER решает эту проблему и какие грабли ждут на практике.
MCP-сервер в экосистеме 1С: что изменилось?
MAKER — инструмент для разработки на платформе 1С:Предприятие, который теперь поддерживает MCP (Model Context Protocol). Это протокол, позволяющий AI-модели «помнить» предыдущие шаги диалога: от формулировки технического задания до генерации конкретного кода. В классической схеме каждый запрос к LLM (Large Language Model) был изолирован — контекст приходилось передавать явно в каждом сообщении. MCP-сервер хранит историю сессии на своей стороне, экономя трафик и упрощая разработку.
Однако для 1С-специалиста, привыкшего к детерминированным алгоритмам, это создаёт неочевидную проблему: сессия MCP живёт не вечно. При перезапуске сервера, таймауте или ошибке сети контекст теряется, и AI начинает «забывать» требования заказчика. В статье на Infostart.ru (источник) показано, как MAKER решает эту проблему через механизм контрольных точек, но мы пойдём глубже — разберём, почему стандартные подходы к сохранению контекста в 1С не работают.
Ключевой тезис: MCP-сервер — это не «чёрный ящик», а управляемое состояние. Если вы не контролируете время жизни сессии, вы рискуете получить код, который не соответствует последним правкам ТЗ.
Механика под капотом: как MCP хранит контекст
MCP-сервер использует сессионные токены и временные хранилища (обычно in-memory). Каждый запрос от 1С к серверу содержит идентификатор сессии. Сервер накапливает историю сообщений и возвращает ответ, учитывая весь предыдущий диалог. В MAKER это реализовано через HTTP-эндпоинты:
/session/start— создание новой сессии, возвращает токен./session/chat— отправка сообщения в рамках сессии./session/checkpoint— сохранение текущего состояния (контрольная точка).
Проблема в том, что стандартный MCP-сервер (например, от OpenAI) не гарантирует долговременное хранение. При перезапуске сервера все сессии сбрасываются. MAKER решает это через персистентное хранилище — сериализацию контекста в файл или базу данных. Но здесь кроется ловушка для 1С-разработчика: сериализация сложных структур (например, таблиц значений) может привести к потере типов данных.
Пример: потеря контекста при перезапуске
Представьте, что вы в диалоге с AI уточняете требования к документу «РеализацияТоваровУслуг». После 10 сообщений сервер перезапускается. Без контрольных точек AI «забывает» все предыдущие уточнения. В MAKER вы можете явно вызвать /session/checkpoint после каждого ключевого шага. Но если вы этого не сделали — контекст потерян.
// Пример вызова контрольной точки через HTTP из 1С
Функция СохранитьКонтекстMCP(ТокенСессии, ДополнительныеДанные) Экспорт
Запрос = Новый HTTPЗапрос("/session/checkpoint");
Запрос.Заголовки = Новый Соответствие;
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенСессии);
// Формируем тело запроса в JSON
Тело = Новый Структура;
Тело.Вставить("context", ДополнительныеДанные); // например, последние требования
ЗаписьJSON = Новый ЗаписьJSON;
СтрокаJSON = "";
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON);
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("context");
ЗаписатьJSON(ЗаписьJSON, ДополнительныеДанные);
ЗаписьJSON.ЗаписатьКонецОбъекта();
ЗаписьJSON.Закрыть();
СтрокаJSON = ЗаписьJSON.Закрыть(); // на самом деле Закрыть() не возвращает строку, нужно использовать другой подход
// Корректный способ: использовать глобальную функцию ЗаписатьЗначениеJSON
СтрокаJSON = ЗаписатьЗначениеJSON(Тело);
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8");
HTTPСоединение = Новый HTTPСоединение("localhost", 8080);
Ответ = HTTPСоединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Возврат Истина;
Иначе
ЗаписьЖурналаРегистрации("MCP", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка сохранения контекста: " + Ответ.КодСостояния);
Возврат Ложь;
КонецЕсли;
КонецФункции
Предупреждение: В примере выше использован
ЗаписатьЗначениеJSON— это глобальная функция, которая возвращает строку. Не путайте с объектной техникойЗаписьJSON, где нужно вызыватьЗакрыть()и затем получать строку через свойство (но такого свойства нет). В реальном коде для простоты используйтеЗаписатьЗначениеJSON.
Сравнение подходов: прямой вызов LLM vs MCP-сервер
Многие 1С-специалисты, знакомые с HTTP-запросами, предпочитают напрямую вызывать API LLM (например, OpenAI), передавая всю историю диалога в каждом запросе. MCP-сервер берёт управление контекстом на себя. У каждого подхода есть условия применимости.
| Критерий | Прямой вызов LLM | MCP-сервер (MAKER) |
|---|---|---|
| Управление контекстом | Полностью на стороне 1С (нужно хранить историю) | На стороне сервера (сессия) |
| Объём передаваемых данных | Растёт с каждым запросом (вся история) | Только новое сообщение (история на сервере) |
| Устойчивость к сбоям | Низкая: при ошибке нужно повторно отправлять всю историю | Средняя: при перезапуске сервера контекст теряется без контрольных точек |
| Сложность реализации в 1С | Низкая: достаточно HTTP-запроса | Средняя: требуется управление сессиями и контрольными точками |
| Подходит для длительных диалогов | Нет (история разрастается) | Да (при правильной настройке персистентности) |
Вывод: MCP-сервер оправдан, когда диалог с AI длится более 5-10 шагов и требования часто меняются. Для одноразовых запросов (например, «сгенерируй отчёт по шаблону») прямой вызов проще и надёжнее.
Когда MCP-сервер становится узким местом
Если ваш MAKER-сервер работает в контейнере без постоянного хранилища (например, в Docker без volume), то при каждом перезапуске контейнера сессии сбрасываются. Это типичная ошибка DevOps-настройки. В статье на Infostart упоминается, что MAKER поддерживает сохранение контекста в файл, но по умолчанию эта опция отключена. Рекомендуется сразу настроить персистентное хранилище (SQLite или файл на диске).
Практическое руководство: как не потерять контекст
На основе опыта внедрения MCP-сервера в 1С-проектах сформулируем чек-лист для специалиста.
Чек-лист: настройка MCP-сервера в MAKER
- Включите персистентное хранение сессий. В конфигурации MAKER укажите путь к файлу или строку подключения к БД.
- Настройте таймаут сессии. По умолчанию он может быть 30 минут. Для длительных диалогов увеличьте до 2-3 часов.
- Реализуйте контрольные точки. После каждого значимого уточнения ТЗ вызывайте
/session/checkpoint. В 1С это можно сделать в обработчике «ПередЗаписью» документа-задания. - Обрабатывайте ошибки восстановления сессии. Если сервер вернул ошибку 404 (сессия не найдена), создайте новую сессию и передайте последний известный контекст из резервной копии.
- Логируйте все действия. Используйте
ЗаписьЖурналаРегистрациидля отслеживания потери контекста.
Типичные ошибки
- Забыли про контрольные точки. После перезапуска сервера AI «забывает» всё, что было до этого. Результат — код, не соответствующий последним правкам.
- Передача слишком большого контекста. MCP-сервер может иметь лимит на размер истории (например, 128K токенов). Если диалог слишком длинный, сервер обрежет контекст. Выход — периодически создавать новую сессию с кратким резюме.
- Использование синхронных вызовов без таймаута. HTTP-запрос к MCP-серверу может зависнуть. Всегда устанавливайте таймаут через параметр конструктора
HTTPСоединение.
// Пример создания сессии с таймаутом и обработкой ошибок
Функция СоздатьСессиюMCP() Экспорт
Запрос = Новый HTTPЗапрос("/session/start");
Соединение = Новый HTTPСоединение("localhost", 8080, , , , 30); // таймаут 30 сек
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку("UTF-8"));
СтруктураОтвета = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();
Возврат СтруктураОтвета.token;
Иначе
ВызватьИсключение "MCP: ошибка создания сессии, код " + Ответ.КодСостояния;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("MCP", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось создать сессию: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Неопределено;
КонецПопытки;
КонецФункции
Что делать прямо сейчас
Если вы уже используете MAKER или планируете интеграцию с MCP-сервером:
- Проверьте настройки персистентности в вашем экземпляре MAKER. Если их нет — добавьте volume для Docker или укажите путь к файлу.
- Добавьте в свой код 1С вызов контрольной точки после каждого этапа формирования ТЗ. Это можно автоматизировать через подписку на событие «ИзменениеТЗ».
- Настройте мониторинг сессий: если сессия неактивна более 10 минут, сохраняйте её контекст в регистр сведений 1С как резервную копию.
- Проведите нагрузочное тестирование: отправьте 50 запросов подряд и проверьте, не теряется ли контекст после перезапуска сервера.
Помните: MCP-сервер — это мощный инструмент, но он требует дисциплины в управлении состоянием. Без контрольных точек вы рискуете получить код, который не соответствует последним требованиям заказчика. А это уже не просто техническая ошибка, а провал коммуникации.
Попробовать НОПик →