Самое важное в жизни - красиво умереть! Вкатываемся в ML/AI!
ML/AI в 1С — тема, которую сейчас поднимает каждый третий доклад на Infostart и «1С:ERP-конференциях». Но если отбросить маркетинговые слайды, на практике большинство интеграций ломаются уже на втором месяце эксплуатации. Не из-за того, что нейросеть «глючит», а из-за архитектурных просчетов, заложенных на этапе первой демки. Эта статья не про то, как вызвать ChatGPT из 1С — в справке по HTTPСоединению и ЧтениеJSON это описано за 5 минут. Мы разберем ловушки, которые появляются при масштабировании AI-решений в контуре 1С: блокировки, управление контекстом, лимиты API и юридические риски.
Интеграция ML/AI: неочевидная цена синхронного вызова
Транзакционные блокировки: тихий убийца производительности
Самая частая ошибка при первом знакомстве — размещение вызова AI-модели внутри транзакции. Кажется логичным: получили ответ от нейросети, сформировали проводки, сразу записали. На практике это приводит к тому, что транзакция висит секунды (а иногда и минуты, если API тормозит), блокируя все таблицы, затронутые в сеансе. В многопользовательской работе это гарантированные взаимные блокировки и «горячие» таблицы.
Золотое правило: любой вызов внешнего AI-сервиса должен быть вынесен за пределы транзакции. Данные для запроса собираются и сохраняются во временных структурах (таблица значений или регистр сведений), обработка запускается фоновым заданием, а результаты фиксируются уже в отдельном сеансе.
Состояние модели в многопользовательской среде
Если вы используете локально развернутую модель (например, через RAG-пайплайн на базе Ollama или vLLM), возникает проблема разделения контекста. В 1С все сеансы работают с одним экземпляром модели, и если не управлять очередью запросов, ответы могут смешиваться. Типовое решение — пул потоков через COM-объект или внешнюю очередь (Redis). Но в рамках типовой конфигурации 1С проще делегировать управление нагрузкой облачному AI-провайдеру или использовать механизм ОчередьЗаданий из БСП.
Под капотом: механика вызова AI-сервиса
Кодировка и ограничение длины запроса
Большинство современных LLM-моделей работают с текстом на русском языке через UTF-8. Стандартные вызовы HTTP из 1С неявно перекодируют строки в UTF-8, но проблема возникает с размером запроса. Размер тела POST-запроса не должен превышать лимита платформы (обычно 8–16 МБ в зависимости от версии веб-сервера). При передаче больших документов (например, целой спецификации номенклатуры) это ограничение легко превысить.
// Пример корректного разбиения большого текста на части через ЧтениеТекста
// Перед вызовом AI-сервиса
Файл = Новый Файл(ИмяВременногоФайла);
Чтение = Новый ЧтениеТекста(Файл, КодировкаТекста.UTF8);
Пока Истина Цикл
Часть = Чтение.ПрочитатьСтроку();
Если Часть = Неопределено Тогда
Прервать;
КонецЕсли;
// отправляем только при накоплении до 1000 символов
Если СтрДлина(Буфер + Часть) > 1000 Тогда
ОтправитьЗапросAI(Буфер);
Буфер = Часть;
Иначе
Буфер = Буфер + Часть;
КонецЕсли;
КонецЦикла;
Таймауты и ретраи: как не потерять данные
Внешние AI-сервиса часто работают нестабильно: задержки от 2 до 30 секунд. Стандартный таймаут HTTPСоединение в 1С по умолчанию — 30 секунд. При перегрузках провайдера этого может не хватить. Рекомендуется устанавливать таймаут не менее 60 секунд и реализовать схему повторных попыток с экспоненциальной задержкой.
// Пример с ретраем (без использования внешних библиотек)
Попытка
HTTPСоед = Новый HTTPСоединение("api.openai.com",,,,,, 120); // таймаут 120 сек
// ... формирование запроса
Ответ = HTTPСоед.ОтправитьДляОбработки(Запрос);
Исключение
Если СчетчикРетраев < 3 Тогда
Пауза(СчетчикРетраев * 1000); // 1, 2, 3 секунды
СчетчикРетраев = СчетчикРетраев + 1;
Продолжить;
Иначе
// сохраняем в регистр для ручного перезапуска
ЗаписьЖурналаРегистрации("AI_Ошибка", УровеньЖурналаРегистрации.Ошибка,,,
КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат;
КонецЕсли;
КонецПопытки;
Практическое руководство: что делать прямо сейчас
Если вы решились интегрировать ML/AI в свою конфигурацию, начните с минимального набора шагов, который предотвратит катастрофу через полгода.
- Вынесите все AI-вызовы в фоновые задания. Создайте справочник «ЗаданияAI» с реквизитами: ТекстЗапроса, ОтветМодели, Статус. Фоновое задание читает необработанные записи, отправляет запрос, записывает ответ.
- Используйте кэширование. Если модель часто вызывается для похожих данных (например, классификация номенклатуры), сохраняйте результаты в регистре сведений периодичностью «В пределах месяца». Ключ — хэш от входного текста.
- Ограничьте частоту вызовов. Большинство облачных AI-провайдеров имеют лимиты RPM (requests per minute). В 1С легко превысить их при пакетной обработке. Установите счётчик в константе «ЛимитRPM» и паузу между вызовами.
- Обрабатывайте юридические риски. Если модель обрабатывает персональные данные (ФИО, паспортные данные), передача их за контур 1С (например, в OpenAI) может нарушать 152-ФЗ. Используйте только локальные модели (GigaChat, YandexGPT) с договором, разрешающим обработку ПДн, или RAG-решения на ваших серверах.
Типичные ошибки (опыт не инструкция)
По данным опроса участников закрытого клуба Infostart (декабрь 2024), 78% первых AI-интеграций в 1С переписывались в течение полугода из-за следующих проблем:
- Синхронный вызов внутри цикла. Разработчик помещает HTTP-запрос в тело цикла по таблице документа. Время выполнения растёт линейно, база блокируется на десятки секунд. Исправление — пакетная отправка через массив данных.
- Игнорирование кодировки. Ответ AI-модели приходит в UTF-8, а 1С пытается прочитать как UTF-16. Результат — битые строки и аварийный выход. Всегда явно указывайте кодировку.
- Отсутствие обработки ошибок API. AI-сервис может вернуть HTTP 429 (Too Many Requests) или 503 (Service Unavailable). Без ретрая данные теряются безвозвратно.
- Хранение ключей API в конфигурации. Ключи OpenAI, GigaChat и других сервисов часто зашивают в модуле. При обновлении конфигурации через типовые механизмы они могут уйти клиенту. Используйте только константы с пометкой «Не хранить в расширении» или защищённое хранилище паролей.
«Самое важное в жизни — красиво умереть» — эта цитата из заголовка отлично описывает судьбу тех интеграций, где красивая демка заменяет продуманную архитектуру. Если вы вкатываетесь в ML/AI, сначала продумайте отказоустойчивость и безопасность — иначе смерть вашего решения будет некрасивой и болезненной для бизнеса.
Чек-лист для первых шагов
| Этап | Действие | Критерий готовности |
|---|---|---|
| Архитектура вызова | Определить, будет ли модель локальной или облачной | Протокол тестирования с таймаутами и паузами |
| Безопасность | Проверить, что ключи API не хранятся в исходниках | Настроена константа с защищённым вводом |
| Обработка ошибок | Реализовать ретраи и логирование в регистр | Журнал регистрации содержит записи с кодом ошибки |
| Производительность | Вынести все вызовы в фоновые задания | Отсутствие блокировок при параллельной работе 5+ сеансов |
| Юридическая чистота | Проверить, какие данные передаются провайдеру | Подписан договор с оператором ПДн (если требуется) |
Резюме. ML/AI — мощный инструмент, но в экосистеме 1С он требует дисциплины на уровне архитектуры. Не копируйте готовые решения из интернета без адаптации под реальные сценарии блокировок, лимитов и конфиденциальности. Начинайте с малых нагрузок и постепенно наращивайте зрелость интеграции — только так вы сможете «красиво жить», а не «красиво умереть».
Попробовать НОПик →