ИИ-агент для 1С: микросервис на Python и FastAPI
Привет, программисты 1С! Разберём практическую схему подключения большой языковой модели (LLM) к учётной системе 1С, не трогая при этом конфигурацию 1С глубже необходимого. Задача типовая: 1С не умеет напрямую стучаться в облачные API нейросетей, зато отлично умеет ходить по HTTP. Поэтому весь ИИ-агент выносится в отдельный микросервис на Python, а 1С обращается к нему обычным HTTP-запросом — так же, как к любому стороннему REST-сервису.
В статье соберём микросервис на Python с помощью FastAPI, который отправляет запросы к LLM (в примерах — ChatGPT/OpenAI API, но принцип такой же для любой OpenAI-совместимой модели), и обработку в 1С, которая обменивается данными с этим микросервисом. Заодно разберём, почему для интеграции с 1С обычного текстового ответа модели недостаточно — и как получить от неё предсказуемый структурированный ответ через structured output и function calling.
Курс «Применение искусственного интеллекта ChatGPT для 1С» — если нужна не разовая интеграция, а системный разбор: ИИ-агенты, RAG и MCP-серверы для 1С на практике.
Микросервис на Python и FastAPI с обращением к LLM
Обновляем PIP
python.exe -m pip install --upgrade pipСоздаём .env файл для хранения ключа
Прописываем токен, который получили в консоли OpenAI
OPENAI_API_KEY=Для работы с env установим библиотеку django-environ
pip install django-environУстанавливаем актуальный клиент OpenAI
pip install openaiДля работы с HTTP запросами устанавливаем FastAPI
pip install fastapiУстанавливаем uvicorn – асинхронный web сервер
pip install uvicornСоздаём скрипт main.py. Обратите внимание: старый синтаксис openai.ChatCompletion.create(...) из библиотеки версии 0.x больше не работает — актуальный клиент создаётся через OpenAI() и вызывается как client.chat.completions.create(...)
# Импортируем необходимые библиотеки
import environ
from fastapi import FastAPI
from pydantic import BaseModel
from openai import OpenAI
env = environ.Env()
environ.Env.read_env() # читаем переменные из .env
app = FastAPI()
client = OpenAI(api_key=env('OPENAI_API_KEY')) # актуальный клиент OpenAI (SDK 1.x/2.x)
MODEL = "gpt-5.4-mini" # проверьте актуальный список моделей в консоли OpenAI
def chat_with_llm(system: str, question: str) -> str:
result = client.chat.completions.create(
model=MODEL,
messages=[
{"role": "system", "content": system},
{"role": "user", "content": question},
],
temperature=0.5,
)
return result.choices[0].message.content
class ChatData(BaseModel):
system: str
question: str
@app.post('/chatgpt', status_code=200)
async def process_data(payload: ChatData):
# Получаем данные и проводим их валидацию
data = payload.model_dump()
print(data)
# Выполняем запрос к LLM
response = chat_with_llm(data["system"], data["question"])
# Возвращаем обратно результат запроса
return {'gpt_response': response}
Запускаем сервер и тестируем отправку запросов
uvicorn main:app --reloadОстанавливаем сервер и создаём requirements.txt
pip freeze > requirements.txtУстановку всех пакетов из этого файла можно произвести командой
pip install -r requirements.txtStructured output: делаем ответ ИИ-агента предсказуемым для 1С
Свободный текст от модели — плохой формат для интеграции: 1С придётся разбирать ответ регулярками и гадать, что модель имела в виду. Правильнее заранее описать схему ответа Pydantic-моделью и передать её в response_format — клиент OpenAI сам провалидирует и распарсит ответ модели под эту схему через метод .parse().
from pydantic import BaseModel
class Answer(BaseModel):
reply: str # текст ответа для клиента/менеджера
needs_human: bool # True, если модель не уверена и нужна проверка человеком
def chat_with_llm_structured(system: str, question: str) -> Answer:
completion = client.chat.completions.parse(
model=MODEL,
messages=[
{"role": "system", "content": system},
{"role": "user", "content": question},
],
response_format=Answer,
temperature=0.3,
)
message = completion.choices[0].message
if message.refusal:
raise ValueError(message.refusal)
return message.parsed
В обработчике эндпоинта достаточно вернуть response.model_dump() — 1С получит гарантированно валидный JSON с полями reply и needs_human, а не произвольный текст.
Function calling: агент сам запрашивает данные 1С
Следующий уровень интеграции — не просто ответить текстом, а дать модели возможность самой запросить данные из 1С (остаток товара, статус заказа, курс валюты) через function calling. Модель решает, когда ей не хватает контекста, и просит вызвать конкретную функцию с конкретными аргументами, а код микросервиса уже сам обращается к 1С (например, через OData) и возвращает результат обратно в диалог.
import json
import openai
from pydantic import BaseModel
class GetStockLevel(BaseModel):
"""Запросить остаток товара в 1С по артикулу"""
sku: str
tools = [openai.pydantic_function_tool(GetStockLevel)]
messages = [
{"role": "system", "content": "Ты помощник менеджера, при вопросах об остатках вызывай функцию."},
{"role": "user", "content": "Есть ли в наличии товар с артикулом A-1025?"},
]
completion = client.chat.completions.create(model=MODEL, messages=messages, tools=tools)
message = completion.choices[0].message
if message.tool_calls:
tool_call = message.tool_calls[0]
args = GetStockLevel.model_validate_json(tool_call.function.arguments)
stock = get_stock_from_1c(args.sku) # ваш HTTP-запрос к 1С (OData или своя HTTP-служба)
messages.append(message)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps({"sku": args.sku, "stock": stock}),
})
final = client.chat.completions.create(model=MODEL, messages=messages)
print(final.choices[0].message.content)
Это и есть минимальный ИИ-агент для 1С: модель не просто генерирует текст, а совершает действие — запрашивает актуальные данные и только потом формулирует ответ. Дальше схему можно расширять: несколько инструментов (остатки, цены, статус заказа), несколько шагов рассуждения, память диалога.
Обработка в 1С для обращения к ИИ-агенту
Создаем форму с текстовыми реквизитами и размещаем их на форме.
Создаем команду для отправки запросов и размещаем ее в командной панели

Обработчик команды
&НаКлиенте
Процедура Отправить(Команда)
ОчиститьСообщения();
Результат = "";
// Проверяем заполнение полей
Если Не ЗначениеЗаполнено(Роль) ИЛИ Не ЗначениеЗаполнено(Вопрос) Тогда
Сообщить("Заполните обязательные поля ""Роль"" и ""Вопрос""");
Возврат;
КонецЕсли;
// Создаем данные для тела запроса
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("system", Роль);
ДанныеЗапроса.Вставить("question", Вопрос);
// Преобразуем структуру в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
ДанныеJSON = ЗаписьJSON.Закрыть();
// Отправляем запрос
HTTPСоединение = Новый HTTPСоединение("localhost", 8000);
HTTPЗапрос = Новый HTTPЗапрос("chatgpt");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос.УстановитьТелоИзСтроки(ДанныеJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
РезультатЗапроса = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
// Выводим ответ
Результат = "Код ответа от сервера: " + РезультатЗапроса.КодСостояния + Символы.ПС + Символы.ВК + РезультатЗапроса.ПолучитьТелоКакСтроку();
КонецПроцедурыПримеры ответов ИИ-агента

Меняем роль, но вопрос оставляем тот же. Честно говоря, я не специалист в хоккее, но похоже, что модель просто придумала ответ — классическая галлюцинация LLM. Именно для таких случаев и нужны приёмы из разделов выше: поле needs_human в structured output и function calling за реальными данными вместо угадывания.

Что дальше
Если нужна модель без оплаты внешнего API — разверните LLM локально на своём железе: vLLM на связке RTX 3090 и Tesla V100 или Qwen 3.6 27B с MTP — обе статьи разбирают запуск локальных моделей с OpenAI-совместимым API, так что код микросервиса выше меняется буквально в пару строк (адрес и ключ). Если задача не «ответить текстом», а «достать и обработать данные 1С», разбор структурированного доступа к данным через LLM есть в статье LLM и 1С: как использовать TextToSQL и Pandas для анализа данных и продаж.
Курс «Применение искусственного интеллекта ChatGPT для 1С» — практика по ИИ-агентам, RAG и MCP-серверам для 1С с нуля.
