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

14.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 символов, и поймал на этом потенциальный баг сравнения ключей.

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

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

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

 

Наши инструменты для работы 1С с нейросетями:

Продолжение вышло. Здесь разобран доступ к одной базе. Когда баз десять и они в трёх странах, схема получается другая: вся сложность живёт в одной служебной базе, а в продуктивных остаётся переходник на пятнадцать строк, который после установки не меняется. Разбор - Один MCP управляет десятью базами. В самих базах MCP нет.

Другие наши инструменты диагностики 1С:

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

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

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

См. также

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

Задавайте вопросы базе 1С обычными словами: получайте данные, находите ошибки и связанные документы, проверяйте права, работайте с вложениями и контролируемо вносите изменения. Всё это работает в самой программе, а Codex и Claude подключаются по желанию.

15989 руб.

30.07.2026    11890    25    4    

26

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

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

15250 руб.

25.08.2025    70511    140    41    

148

Нейросети 1С:Управление торговлей 11 Бесплатно (free)

Я не считаю покупку специализированных платных инструментов обязательной для разработки с ИИ: нужную обвязку тоже можно создать с агентом. Показываю этот подход на расширении УТ 11 с динамическим списком остатков. Одно задание Codex, 37 минут до проверки, работающая форма. Рассказываю, как устроено окружение, почему первую попытку пришлось переснять и что получилось в повторном прогоне.

вчера в 16:42    2254    7    Ibrogim    36    

16

Нейросети Программист Руководитель проекта 1C:ERP Бесплатно (free)

Служба на Rust, через которую Claude Code, Cursor или другой MCP-клиент вызывает узких ИИ-агентов. Агент — папка с prompt.md и config.toml, модель — строка в конфиге: DeepSeek, Claude Code по подписке, Codex или локальная модель. Агент получает MCP-инструменты, работает в фоне, каждый ход записывается. Внутри — цифры за три месяца: 10 351 вызов, 78 агентов.

вчера в 09:20    1081    0    Sorm    5    

10

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

Отладка кода 1С традиционно выглядит примерно одинаково: поставить точку останова, запустить клиент, воспроизвести сценарий, дождаться остановки, посмотреть локальные переменные, пройти несколько строк, раскрыть очередную структуру или коллекцию, вычислить выражение — и повторить все это еще несколько раз. А что, если значительную часть этой рутины поручить AI-агенту?

15.09.2026    2641    andrew.ab    5    

14

Нейросети Программист Бизнес-аналитик Руководитель проекта Бесплатно (free)

Я принёс команде приём, с которым нейронка наконец начала понимать нашу конфигурацию: у меня он работал, у коллег — нет. Дело было не в постановке задач и не в настройках: причина в том, что на их машинах индекс конфигурации считался бы несколько дней. Замер на одном и том же своде из 26 035 записей: три часа на процессоре против трёх с половиной минут на видеокарте. Разбираю, что такое индексация конфигурации и почему она дорогая ровно один раз, почему наша основная серверная машина — 64 ядра, 768 гигабайт памяти — на этой задаче проигрывает домашнему компьютеру, и почему приём одного человека упирается в вопрос, который никто не любит задавать.

09.09.2026    4442    solbol    9    

9

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

Первая часть подборки простых приёмов для работы с ИИ-агентами. Без «секретных техник» — скорее сверим часы и посмотрим, какие подходы действительно помогают экономить время, лимиты и нервы. Разберём шесть практических приёмов: как выбирать модель под задачу и не тратить дорогую модель на мелочи; зачем сначала составлять план сложной работы; как сохранять агентские сессии на VPS с помощью tmux и Herdr; почему голосовой ввод даёт больше контекста, но требует проверки; как перепроверять решения одного агента другим; и как организовать параллельную работу через Git worktree. Большинство этих вещей опытным пользователям наверняка знакомо. Но иногда именно «очевидная» мелочь оказывается той, о которой узнаёшь слишком поздно. Возможно, из этой подборки вам пригодится хотя бы один приём.

04.09.2026    3162    Ibrogim    11    

16

Инструментарий разработчика Нейросети Программист 1С:Предприятие 8 Бесплатно (free)

Как мы в 42Clouds научили агента открывать формы, заполнять поля, проверять списки и собирать доказательные отчёты — и чем Answer42 отличается от Vanessa Automation MCP, Тестер, CodexTestBridge UI-worker и браузерных инструментов.

04.09.2026    1924    amoarok    15    

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

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

Убавилось другое: час на «переписать запрос и собрать замеры». Если чья-то работа состоит из таких часов целиком, разговор для него действительно другой, и делать вид, что это не так, было бы нечестно.
3. gybson 13 04.08.26 21:41 Сейчас в теме
(2) про ИИ я и сам знаю, меня удивляет смелость, сколько будет неудачных экспериментов на живой базе.
Он ведь мог попробовать и напрямую в базу полезть посмотреть, сделать транкейт проблемной таблицы и т.д. и т.п.
15. aeg2 26.08.26 18:57 Сейчас в теме
(2) а час ли на переписать запрос? Если есть инструменты для работы с ТЖ внедрённые, то нужно обычно лишь включить получение плана, забрать план. Это если все как говорится настроено, времени не требует. Ну а потом если план анализировать не умеешь - уже его скармливаешь ИИ и быстро получаешь ответ, где тормозит, ИИ отлично анализируют планы. Остаётся не переписать запрос целиком, а точечно решить проблему тормозов, и не методом подбора а осознанно.

Все это делается легко, дедовскими методами и без риска обрушить прод (* транзакции не панацея, в целом это и в статье признавалось)

И даже так любимый многими ИИ применен - если не хочется анализировать план запроса самому или не умеешь.

Тормозящий код - тут тоже по старинке замерами и головой, ну либо современно: замерами + кодовая база в гит + AI для гипотезы.

Но всем хочется вместо работы вайбкодить, да ещё на проде).

Ладно, это так, старческое брюзжание. ИИ отличные инструменты, но лучше все же применять их более безопасно, а все хотят не работать)
4. SerVer1C 1143 04.08.26 23:35 Сейчас в теме
А вы, случаем, не переобувшийся Майоров, который строчит однотипный нейрослоп ?
Человек не в состоянии выдавать несколько публикаций в день, да ещё и оформленных одной и той же БЯМ
5. nedomolkov.ivan 236 05.08.26 04:40 Сейчас в теме
(3) Смелости там ровно столько, сколько позволяет обёртка: полезть напрямую агент не может физически, ради этого всё и затевалось.

Код, который он присылает, исполняется не «в базе», а внутри транзакции, которая откатывается всегда — и при успехе, и при ошибке. Внутри неё он хоть Удалить() вызовет: сам результат увидит, а база после отката его не увидит. Отдельная проверка ловит попытку обойти это изнутри — если после выполнения наша транзакция оказалась уже закрыта, метод возвращает «нарушение контракта read-only» вместо результата.

TRUNCATE не проходит по другой причине: встроенный язык такого не умеет, а прямого доступа к SQL у агента нет — ему выдан ровно один метод-обёртка, а не адрес сервиса вообще.

Но в главном вы правы, и в статье под это отдельный раздел: * закрывает только сохранность данных. Нагрузку он не закрывает — агент однажды написал соединение двух срезов регистра на 1,89 млн строк, 43 секунды, и пользователи это время делили с ним диск. Блокировки на время длинной транзакции не закрывает. И внешние эффекты — письмо, файл, исходящий HTTP, фоновое задание — не откатываются вовсе: их приходится запрещать заданием и потом проверять по журналу регистрации.
8. gybson 13 05.08.26 10:28 Сейчас в теме
(5) еще он может прислать и выполнение команд ADO/OLEDB и прочих скриптов от имени сервера
иногда он очень неожиданно мыслит
6. nedomolkov.ivan 236 05.08.26 04:40 Сейчас в теме
(4) ИИ при подготовке текста использую и не скрываю — писал об этом открытым текстом в первом же ответе под соседней публикацией. Статья о том, как ИИ-агенты работают на боевой базе; готовить её гусиным пером было бы странно.

«Однотипный нейрослоп» проверяется быстро, и проверить можно не на слово. В публикации 2752991 читатель принёс замер и показал, что мой раздел неверен: я написал, что в журнал tempdb пишутся только структуры распределения, а там LOP_DELETE_ROWS. Признал в комментариях и переписал раздел целиком. В 2754238 коллега с рейтингом 596 три захода уточнял параметры базы, и по ходу выяснилось, что моя формулировка про двадцать секунд смазана — тоже признал и объяснил, в чём. Генератор так себя не ведёт: он не признаёт ошибку и не переписывает статью через сутки после выхода.

Про темп спорить не буду, по-человечески вы правы: несколько публикаций подряд выглядят подозрительно. Но проверяется не темп, а содержание. Цифры там конкретные — 3,85 ТБ мёртвого кэша из 4,2 ТБ базы, ускорение в 390 раз без единой правки в логике запроса, 8 400 строк в замещении периода. За каждой стоит работа, которая делалась месяцами. Спросите про любую — расскажу, откуда она взялась и чем мерялась.
7. SerVer1C 1143 05.08.26 09:04 Сейчас в теме
(6) По мне так, что каждый ваш комментарий тоже пропущен через нейросеть...
SweetSweetLoot; curdate; Viver; BDSolutions; user631937_amam1; +5 Ответить
10. ArtVadan 4 08.08.26 18:25 Сейчас в теме
(7) тут даже не обсуждается, как часто мы видим дефисы в сообщениях?) это явный признак нейросети)
9. nedomolkov.ivan 236 05.08.26 11:23 Сейчас в теме
(8) Вы правы, и это самая настоящая дыра в моём изложении. Транзакция откатывает данные, а COM — это не данные: ADO/OLEDB открывает собственное соединение к СУБД мимо транзакции платформы, и * его не касается вообще. Ровно то же с ЗапуститьПриложение, WScript.Shell и файловыми операциями.

Чёрный список имён в тексте присланного кода тут не помощник: COMОбъект собирается склейкой строки и вызывается через Вычислить, обходится за минуту. Барьер должен стоять не внутри кода, который присылает агент, а вокруг него — и в платформе он для этого есть.

Первое — УстановитьБезопасныйРежим(Истина) вокруг Выполнить(). В безопасном режиме отменяется привилегированный режим и запрещаются именно те вещи, о которых вы говорите: COMОбъект() и ПолучитьCOMОбъект(), ЗагрузитьВнешнююКомпоненту() и ПодключитьВнешнююКомпоненту(), файловые операции, а также создание ИнтернетСоединение, HTTPСоединение и FTPСоединение. Присланный код физически не соберёт ADODB.Connection, как бы неожиданно он ни мыслил.

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

Признаю честно: в статье этот слой описан слабее, чем следовало, акцент ушёл на *, а * отвечает за данные, не за побочные эффекты. Ваш пример подсвечивает это точнее, чем мой текст.

Встречный вопрос, раз вы явно об это спотыкались: в вашей практике агент или чужая внешняя обработка лезли именно в COM — или чаще в ЗапуститьПриложение и файлы?
11. Dipod 118 10.08.26 09:14 Сейчас в теме
Пишете, что: "Проверка «ТранзакцияАктивна» — детектор взлома контракта. Самое интересное место. Если переданный код сам вызвал фиксацию транзакции — наша транзакция больше не активна, и её * уже невозможен: данные зафиксированы. Предотвратить это внутри Выполнить() нельзя, зато можно обнаружить: если после выполнения транзакция не активна — кто-то ею управлял."

Это значит, что от факапов вы не защитились. По сути всё равно ИИ может сделать что угодно в базе и его только постфактум накажут.

Разумнее в самом коде до исполнения через "Выполнить" искать строки команд управления транзакциями и не давать исполнять такой код, возвращая ошибку нарушения контракта, а не детектить через проверку "ТранзакцияАктивна", когда по сути вы ничего не можете сделать и в этот момент ИИ уже что-то необратимо изменил в базе.
YA_1028196361; +1 Ответить
14. nedomolkov.ivan 236 11.08.26 06:17 Сейчас в теме
(11) Согласен, это сигнализация, а не защита. Но и разбор строк до Выполнить не спасёт: ЗафиксироватьТранзакцию соберётся склейкой и уйдёт в Вычислить. Держит другое - роль учётки без Добавления/Изменения/Удаления плюс безопасный режим: запись падает на правах, до транзакций дело не доходит.
12. NikolaevSergey1C 10.08.26 13:41 Сейчас в теме
А почему собственно не выполнить в безопасном режиме? тогда за com и т.д. уже не нужно переживать.
13. nedomolkov.ivan 236 11.08.26 06:15 Сейчас в теме
(12)
А почему собственно не выполнить в безопасном режиме? тогда за com и т.д. уже не нужно переживать.


(12) Безопасный режим тут нужен, я его в этой ветке и советую как основную защиту. Только он закрывает не то, чего боишься в первую очередь.
Что он реально снимает: COM, внешние компоненты, внешние обработки и отчёты, доступ к файловой системе и привилегированный режим. Против ADO, которое открывает своё соединение мимо транзакции, работает.
Чего он не делает: он не запрещает менять данные. Код в безопасном режиме спокойно вызовет Записать, снимет пометку удаления и перепроведёт документы за год. То есть от главного страха "агент что-то поменял в проде" безопасный режим не спасает, спасает роль учётки без прав на изменение.
И транзакцию он тоже не трогает: ЗафиксироватьТранзакцию внутри вызванного кода остаётся доступной, так что проверка ТранзакцияАктивна нужна ровно так же.
Получается связка из трёх кусков: безопасный режим на внешние вызовы, роль без Добавления/Изменения/Удаления на данные, транзакция как рамка для замеров. По отдельности каждый дырявый.
16. nedomolkov.ivan 236 03.09.26 04:57 Сейчас в теме
aeg2, по плану запроса вы правы, и спорить тут не с чем: если ТЖ настроен и события плана снимаются, разбор занимает минуты. Только час в моей фразе был не про разбор. Час это цикл целиком: правка, замер, повтор, и доказательство, что результат не поехал на том же снимке данных. Разбор плана в этом цикле кусок, остальное механика, и вот её и стало меньше.

Расхождение у нас в другой посылке - "если всё настроено". На базах, куда меня зовут, ТЖ обычно не настроен вовсе, а включить сбор планов на проде это тоже правка прода, просто обратимая. В этом смысле ваш порядок безопаснее, тут возразить нечего.

Про вайбкодинг на проде подписываюсь, статья ровно об этом. Не "пустите агента в базу", а "если уже пустили, то читателем, с учёткой без прав на запись и в безопасном режиме". Замеры плюс гит плюс ИИ на гипотезу это и есть то, что там описано, только длиннее и с затыками.
Для отправки сообщения требуется регистрация/авторизация