Как дать ИИ-агенту доступ к боевой базе 1С и не поседеть

04.08.26

Интеграция - Нейросети

Дали четырём ИИ-агентам (Fable 5, Opus 5, Codex) одинаковое задание — оптимизировать тормозящую обработку прямо в продуктивной базе работающей розничной сети. Сотни выполненных запросов, один прочитал 1,89 млн строк. Записей в базу — ноль по построению: рассказываю про обёртку из 59 строк, которая исполняет код агента внутри транзакции с безусловным откатом, показываю smoke-тесты и честно разбираю, чего этот механизм НЕ закрывает — нагрузку, блокировки, внешние эффекты, чтение чувствительного.

Недавно мы провели эксперимент: дали четырём ИИ-агентам — Fable 5 и Opus 5 в Claude Code, двум прогонам GPT в Codex — одинаковое задание: оптимизировать тормозящую обработку в продуктивной базе. Не в тестовой копии, не на выгрузке — в живой базе работающей розничной сети, где в этот момент шли продажи. Агенты выполнили в базе сотни запросов, построили десятки замеров, один из них прочитал 1,89 миллиона строк регистра цен. Кто из них что нашёл — разбираем в отдельной статье цикла; эта — про фундамент, который сделал эксперимент возможным.

Количество записей, изменённых в базе за всё это время, — ноль. Не «мы проверили, и вроде ноль». Ноль по построению: записать в базу агент физически не мог. Эта статья — про механизм, который это гарантирует. Он занимает 59 строк кода, разворачивается за полчаса и, судя по нашему опыту, является обязательным условием для любых экспериментов с ИИ на живых данных. Заодно честно расскажу, чего этот механизм не гарантирует — без этого раздела статья была бы вредной.

 

Зачем агенту вообще продуктив

Первый вопрос на этом месте: «а зачем пускать ИИ в прод, работайте на копии». Ответ короткий: потому что задача этого требует, а копии не всегда есть. Наша задача звучала так: «обработка выполняется 1 минуту 32 секунды, найди причину с доказательствами, оптимизируй, докажи, что результат не изменился». Что для этого нужно агенту:

  • Реальные объёмы. По выгрузке конфигурации не видно, что в регистре цен 1,89 млн строк, а у регистра отключена таблица итогов среза последних. Именно эти два факта оказались корнем главного тормоза — и оба живут в данных, а не в коде.
  • Реальные замеры. «Этот запрос медленный» — гипотеза. «Этот запрос выполняется 42 935 мс, а переписанный — 3 359 мс на тех же данных» — диагноз. Замер возможен только там, где есть данные боевого масштаба.
  • Реальная проверка эквивалентности. Доказать, что оптимизированный запрос возвращает то же самое, можно только сравнив оба результата на одном снимке живых данных.

Тестовая копия недельной давности решает вопрос безопасности, но портит замеры: другое железо, другой кэш, другие объёмы. А главное — копии на несколько терабайт не всегда существуют в природе. Значит, нужен способ пустить агента в прод так, чтобы худшее, что он может сделать, — это медленный запрос.

 

Почему запрета в промпте недостаточно

Первое, что приходит в голову: написать в задании «выполняй только чтение». Мы это, разумеется, написали. Но полагаться на это нельзя. Запрет в промпте — это просьба. Модель может:

  • неверно понять задачу — и решить, что «исправь обработку» включает «запиши исправленные данные»;
  • сгенерировать код с побочным эффектом, не осознавая его — например, вызвать процедуру конфигурации, которая внутри себя пишет в регистр. Снаружи вызов выглядит как невинное «получить данные», а всех 9 тысяч строк вызываемого кода модель не читала;
  • честно ошибиться — перепутать чтение и запись в конструкции, которую сама же и написала.

Ни один из этих сценариев не ловится текстом «пиши только запросы». Текст задания контролирует намерение; нужен механизм, который контролирует результат. Разница та же, что между табличкой «не входить» и закрытой дверью.

 

Решение: транзакция, которая всегда откатывается

В нашей конфигурации есть HTTP-сервис Data API: метод принимает JSON {"code": "<текст на встроенном языке>"}, выполняет его через Выполнить() и возвращает результат из переменной ЛокальныйРезультат. Штука мощная и опасная — поэтому для агентов сделана обёртка execute_code_ro. Схема потока — на картинке ниже, а затем весь код целиком.

 

Агент U94; HTTP-метод U94; транзакция U94; безусловный откат

// execute_code_ro — выполнение произвольного кода в режиме «только чтение».
// Весь переданный код исполняется внутри транзакции, которая безусловно
// откатывается, поэтому изменения данных в базе не сохраняются.
// Контракт: вход {"code": "<BSL>"}, результат — в переменной ЛокальныйРезультат.

КодДляВыполнения = Неопределено;
Если ТипЗнч(Аргументы) = Тип("Соответствие") Тогда
    КодДляВыполнения = Аргументы.Получить("code");
ИначеЕсли ТипЗнч(Аргументы) = Тип("Структура") Тогда
    Если Аргументы.Свойство("code") Тогда
        КодДляВыполнения = Аргументы.code;
    КонецЕсли;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(КодДляВыполнения) Тогда
    СтруктураОтвета = Новый Структура;
    СтруктураОтвета.Вставить("success", Ложь);
    СтруктураОтвета.Вставить("error", "Не указан параметр code");
    Результат = ОбщегоНазначения.СтруктураВJSON(СтруктураОтвета);
    Перейти ~Конец;
КонецЕсли;

ЛокальныйРезультат = Неопределено;

НачатьТранзакцию();
Попытка
    // В коде доступна переменная ЛокальныйРезультат для записи результата
    Выполнить(КодДляВыполнения);

    СтруктураОтвета = Новый Структура;
    СтруктураОтвета.Вставить("success", Истина);
    СтруктураОтвета.Вставить("result", БезопасноеЗначение(ЛокальныйРезультат));
    Результат = ОбщегоНазначения.СтруктураВJSON(СтруктураОтвета);

Исключение
    СтруктураОтвета = Новый Структура;
    СтруктураОтвета.Вставить("success", Ложь);
    СтруктураОтвета.Вставить("error", ОписаниеОшибки());
    Результат = ОбщегоНазначения.СтруктураВJSON(СтруктураОтвета);
КонецПопытки;

// Откат ВСЕГДА: контракт метода — ничего не менять в базе.
// Если переданный код сам закрыл нашу транзакцию — фиксируем нарушение.
Если ТранзакцияАктивна() Тогда
    ОтменитьТранзакцию();
Иначе
    СтруктураОтвета = Новый Структура;
    СтруктураОтвета.Вставить("success", Ложь);
    СтруктураОтвета.Вставить("error",
        "Нарушение контракта read-only: переданный код управлял транзакциями");
    Результат = ОбщегоНазначения.СтруктураВJSON(СтруктураОтвета);
КонецЕсли;

~Конец:;

(ОбщегоНазначения.СтруктураВJSON — тривиальный сериализатор структуры в JSON; подставьте свой или ЗаписьJSON напрямую.)

Разберём три места, на которых всё держится.

Начать транзакцию до, отменить после — безусловно. Не «при ошибке», не «если что-то пошло не так» — всегда. Успешно выполненный код и код, упавший с исключением, заканчиваются одинаково: всё, что было изменено, исчезает. Читается всё, сохраняется ничего. Прелесть в том, что внутри транзакции переданный код полноценно работает: может создать элемент справочника, записать регистр, провести документ — и тут же прочитать результат своих действий. Для задач вида «проверь, как поведёт себя запись» это даже полезно. Снаружи транзакции не останется ничего.

«Попытка» вокруг «Выполнить». Код агента падает регулярно — это нормально. Исключение превращается в аккуратный JSON с текстом ошибки, агент читает его и чинит свой код. Без попытки первое же кривое обращение уронило бы соединение.

Проверка «ТранзакцияАктивна» — детектор взлома контракта. Самое интересное место. Если переданный код сам вызвал фиксацию транзакции — наша транзакция больше не активна, и её откат уже невозможен: данные зафиксированы. Предотвратить это внутри Выполнить() нельзя, зато можно обнаружить: если после выполнения транзакция не активна — кто-то ею управлял. Ответ агенту подменяется ошибкой «нарушение контракта», а в задании этот случай объявлен немедленным провалом. Дополнительно управление транзакциями запрещено промптом — и вот здесь запрет в промпте уместен: он не единственная линия обороны, а дублирующая.

 

Проверяем, что защита работает

Перед тем как подпускать агента, — два smoke-теста руками.

Тест 1: чтение живо. Передаём {"code": "ЛокальныйРезультат = 2 + 2;"} — получаем {"success": true, "result": 4}. Метод работает, код выполняется, результат возвращается.

Тест 2: запись умирает. Передаём код, который создаёт элемент справочника, записывает его и тут же читает из базы:

Спр = Справочники.Контрагенты.СоздатьЭлемент();
Спр.Наименование = "SMOKE_TEST_УДАЛИ_МЕНЯ";
Спр.Записать();
Найден = Справочники.Контрагенты.НайтиПоНаименованию("SMOKE_TEST_УДАЛИ_МЕНЯ");
ЛокальныйРезультат = ?(Найден.Пустая(), "НЕ НАЙДЕН", "НАЙДЕН: " + Найден.Код);

Ответ: НАЙДЕН — внутри транзакции запись честно существует. А теперь тот же поиск, но отдельным вызовом:

Найден = Справочники.Контрагенты.НайтиПоНаименованию("SMOKE_TEST_УДАЛИ_МЕНЯ");
ЛокальныйРезультат = ?(Найден.Пустая(), "В БАЗЕ НЕТ", "УТЕЧКА: " + Найден.Код);

Ответ: В БАЗЕ НЕТ. Запись жила ровно до конца транзакции. Это и есть контракт: внутри вызова — полноценная база, между вызовами — ни следа.

 

Два smoke-теста: внутри транзакции НАЙДЕН, следующим вызовом В БАЗЕ НЕТ

Чего обёртка НЕ закрывает

Раздел, без которого всё написанное выше вводило бы в заблуждение. Транзакция с откатом решает ровно одну проблему — сохранность данных. Остальные четыре остаются на вас.

Нагрузка. Читающий запрос агента — полноценный запрос к СУБД. Агент, которому велели «найди тормоза», с удовольствием напишет соединение двух срезов регистра на 1,89 млн строк — мы такое видели: 43 секунды исполнения. Пользователи в это время делят с ним диск и процессор. Лечится требованиями в задании: ПЕРВЫЕ N в разведочных выборках, отборы по периоду и организации, тяжёлые серии — в часы минимальной нагрузки. У нас агенты эти требования соблюдали, но проверять надо.

Блокировки. Всё выполнение живёт в одной транзакции — длинной. Если переданный код успел изменить данные (внутри транзакции — можно!), эти записи заблокированы до отката. Код, который «на пробу» перезаписывает популярный регистр и потом десять секунд что-то считает, подержит блокировку все десять секунд. Правило то же: читающие сценарии — пожалуйста, пишущие эксперименты — короткими.

Внешние эффекты. Транзакция СУБД откатывает данные. Она не откатывает: отправленное письмо, исходящий HTTP-запрос, созданный файл на сервере, COM-объект, запущенное фоновое задание. Всё это надо запрещать отдельно — у нас в задании перечислено явно: файлы, COM, исходящие соединения, фоновые задания. И это как раз тот случай, где промпт-запрет работает в паре с проверкой: журнал регистрации после прогона покажет, не было ли попыток.

Чтение чувствительного. Агент видит всё, что видит учётная запись, под которой он ходит. Зарплаты, персональные данные, себестоимость — если учётке можно, агенту можно. Отдельная учётная запись с урезанными правами — не паранойя, а гигиена. И помните, что всё прочитанное агент отправляет в облако провайдера модели — на это у вас должно быть право.

 

Чек-лист внедрения

  1. Развернуть метод-обёртку (у нас — справочник методов Data API, у вас может быть HTTP-сервис напрямую). Проверить, что «голый» execute_code наружу не торчит.
  2. Прогнать оба smoke-теста. Убедиться в ответе «В БАЗЕ НЕТ».
  3. Завести агенту отдельную учётную запись с минимальными правами чтения.
  4. Выдать агенту ровно один метод — обёртку. Не адрес сервиса «вообще».
  5. В задании запретить: управление транзакциями, файлы, COM, исходящий HTTP, фоновые задания. Потребовать щадящие запросы.
  6. После первого прогона — журнал регистрации: что читал, не пытался ли писать.

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

 

Что показал боевой прогон

Четыре агента, четыре сессии в продуктивной базе, сотни выполненных фрагментов кода — от невинных 2 + 2 до серий замеров по семь прогонов тяжёлого запроса. Один агент получил 401 из-за проблем с кодировкой Basic-заголовка и полчаса честно дебажил доступ. Другой прочитал регистр на 1,89 млн строк и нашёл, почему срез последних строится на лету. Третий вычитал из метаданных, что у измерения длина 10 символов, и поймал на этом потенциальный баг сравнения ключей.

Записей в базу — ноль. Проверено журналом регистрации, а не верой в промпт.

Механизм не отменяет голову: нагрузку, блокировки и права никто за вас не продумает. Но он переводит главный страх — «ИИ испортит данные» — из категории рисков в категорию невозможного. А с остальными рисками инженеры работать умеют.

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

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданным 1С, справке синтакс-помощника и проверки синтаксиса.

15250 руб.

25.08.2025    64834    132    36    

140

SALE! %

Банковские операции Обмен с интернет-банком Мастера заполнения Нейросети Программист Бухгалтер Пользователь 1С:Предприятие 8 1C:ERP 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:ERP. Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 3.0 Платные (руб)

Корректируйте банковские документы быстро и легко! Создайте правило обработки — и оно автоматически применится при загрузке выписки (отбор по любому реквизиту или регулярному выражению). Решение заполняет расшифровку платежа, комиссию эквайринга, подбирает ведомости на выплату зарплаты, помечает дубли из банка на удаление и многое другое. Доплачивать за алгоритмы не нужно — они включены в решение. Обработка работает при загрузке из файлов клиент-банка и через DirectBank. Новое — искусственный интеллект: модель приводит нестандартные назначения платежа к виду, понятному алгоритмам, а ИИ-ассистент прямо в 1С консультирует по решению и разбирает код правил и алгоритмов. Поддерживаются локальные и облачные OpenAI-совместимые модели — данные могут не покидать ваш контур.

15250 руб.

20.12.2024    17042    84    29    

75

Нейросети Системный администратор Программист Бизнес-аналитик Бухгалтер Пользователь Руководитель проекта 1С 8.3 1С:Документооборот 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Россия Платные (руб)

Подключите Codex к открытой или серверной базе 1С и ставьте задачи обычным языком: получайте данные, находите ошибки и связанные документы, проверяйте права, работайте с вложениями и контролируемо вносите изменения.

12078 руб.

30.07.2026    938    3    2    

5

Нейросети Программист Бесплатно (free)

SFT-адаптация Qwen/Qwen3.6-27B для разработки на платформе 1C:Enterprise: код на BSL, структура выгрузок BSL+XML, схемы XML и типовые практики конфигураций. Модель ориентирована на ассистента разработчика 1С: навигация по метаданным/XML-выгрузке, пояснение и правка BSL, следование внутренним стандартам кодирования, работа с открытыми кодовыми базами 1С.

вчера в 18:00    1148    andrew.ab    31    

11

Облачные сервисы, хостинг Сервера Нейросети Программист Бесплатно (free)

В последние годы спор «облако или локалка» стал одним из самых горячих в мире работы с нейросетями. Давайте разберемся.

вчера в 10:00    448    dsdred    21    

10

Нейросети Программист Бесплатно (free)

Рассказываем, как использовать библиотеку искусственного интеллекта для 1С не просто как инструмент генерации кода, а как основу для новых бизнес-решений. Показываем, как с ее помощью строить BI-систему на естественном языке: пользователь формулирует вопрос по продажам обычным текстом, а система генерирует запрос к базе и возвращает результат в виде таблицы или графики. Разбираем пример торгового бота-продавца, который общается с покупателем, консультирует по товару и отправляет платежную ссылку, а также объясняем, зачем в таких решениях нужны границы, точки контроля и обычное программирование. Отдельно показываем, как векторные базы и нечеткий поиск помогают создавать помощников менеджера (например, для подбора аналогов), и почему новые задачи лучше решать новыми методами, а не пытаться применять ИИ только к старым сценариям.

31.07.2026    6527    mkalimulin    5    

13

Нейросети Программист Бесплатно (free)

Эта статья не столько про новую программу, сколько про путь: от желания немного улучшить чужой open-source проект — до создания собственного инструмента, который закрывает весь цикл работы с речью. Транскрибация, генерация статей и описаний через LLM, синтез аудиокниг — всё локально, в одном приложении. Исходники открыты, лицензия MIT.

29.07.2026    1576    Ibrogim    22    

27

Нейросети Программист Бесплатно (free)

Новые результаты теста топовых ИИ в вайбкодинге на 1С. Это продолжение прошлой статьи, где нейросети написали внешнюю обработку за 19 минут. Теперь же с этой же задачей справляются за 3–4 минуты. Прошло всего несколько недель. Что будет дальше?

24.07.2026    11091    top_1c    107    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gybson 13 04.08.26 20:13 Сейчас в теме
Хотелось бы почитать рассказ о подобных экспериментах от уволенных тоже, а то картина однобокая очень.
2. nedomolkov.ivan 41 04.08.26 21:12 Сейчас в теме
(1) Замечание справедливое: пишут те, кто ставил эксперимент, — картина по определению с одной стороны.

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

Убавилось другое: час на «переписать запрос и собрать замеры». Если чья-то работа состоит из таких часов целиком, разговор для него действительно другой, и делать вид, что это не так, было бы нечестно.
3. gybson 13 04.08.26 21:41 Сейчас в теме
(2) про ИИ я и сам знаю, меня удивляет смелость, сколько будет неудачных экспериментов на живой базе.
Он ведь мог попробовать и напрямую в базу полезть посмотреть, сделать транкейт проблемной таблицы и т.д. и т.п.
Для отправки сообщения требуется регистрация/авторизация