Вызов функций 1С в Ollama

03.04.25

Интеграция - WEB-интеграция

В этой статье мы научим LLM-модель вызывать функции 1С и расширять свой ответ информацией из нашей базы.

Например, пользователь спросит «Есть ли у вас красные яблоки в наличии?», после чего модель зайдёт в 1С, посмотрит остатки красных яблок и даст точный ответ.  

Для снижения порога вхождения статья будет построена на облачных серверах. Поэтому для реализации нам понадобится лишь Windows 10 или выше, т.к. начиная с Windows 10 появился встроенный SSH-клиент. А также нам понадобится 115 рублей для аренды серверов. Примерно столько мне потребовалось денег, чтобы за 2 часа аренды двух серверов с тарифами на апрель 2025 решить поставленную задачу.  

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

 

Шаг 1. Публикуем демо-базу 1С

Заходим на сайт 1С и запрашиваем учебную платформу 1С. Нам потребуется платформа не ниже 8.3.25.1394. Замечание: если есть стандартная платформа и комьюнити-лицензия (для разработчика), то можно воспользоваться таким вариантом.

Регистрируемся в Selectel и создаем облачный сервер (Продукты — Облачные серверы). Имя сервера — fc-1c (далее его IP адрес — IP_АДРЕС_FC_1C). Источник - Windows Server 2019 Standard. Конфигурация — Фиксированная, Standard, 1 vCPU. Диски — 40 Гб. Сохраняем пароль администратора. Нажимаем кнопку «Создать сервер». Данный сервер стоит 2,81 руб. в час. Если использовать собственный сервер, то достаточно выбрать машину, которая удовлетворяет минимальным требованиям для запуска Windows 10.

Через RDP заходим на выданный IP-адрес сервера — IP_АДРЕС_FC_1C.

Устанавливаем учебную платформу 1С: указываем «Web server extension modules» и «Additional interface — Russian».  
Загрузим демо-конфигурацию 1С в локальную базу с именем ollama-function-calling-1c.

Устанавливаем IIS и даём доступ на локальный путь к базе пользователю IUSR. Т. к. учебная платформа x86, не забываем включить разрешение 32-разрядных приложений (такая описана в этой статье). Публикуем демо-базу от имени администратора в вебе и убеждаемся, что база доступна по ссылке http://IP_АДРЕС_FC_1C/ollama-function-calling-1c/ru/.

 

Шаг 2. Публикуем LLM-модель

На своём компьютере генерируем SSH-ключ. Открываем командную строку (CMD) и набираем ssh-keygen. На все вопросы следует просто нажимать Enter. Запоминаем публичный ключ, который сформировался в файле C:\Users\ИМЯ_ПОЛЬЗОВАТЕЛЯ/.ssh/id_ed25519.pub.

В Selectel и создаем облачный сервер (Продукты — Облачные серверы). Имя сервера — fc-ollama (далее его IP-адрес — IP_АДРЕС_FC_OLLAMA). Источник — Ubuntu 24.04 LTS 64-bit CUDA 12.8 Docker. Конфигурация — Фиксированная, GPU, 4 vCPU и 1 x Tesla T4 16 Гб, диски — 60 Гб. SSH-ключ — указываем наш сформированный ключ. Нажимаем кнопку «Создать сервер». Данный сервер стоит 54,2 руб. в час. Если использовать собственный сервер, то необходимо выбрать машину с видеокартой с памятью не менее 16 Гб.

Через командную строку подключаемся к нашему серверу: ssh root@IP_АДРЕС_FC_OLLAMA.

Обновляем индексы — apt-get update.
Обновляем пакеты — apt-get upgrade. На всё соглашаемся и во всплывающем окне нажимаем Enter.
Устанавливаем git — apt install git.
Устанавливаем docker compose — apt-get install docker-compose-plugin.
Скачиваем демо-проект LLM-модели — git clone https://github.com/HardAndHeavy/ollama-function-calling.
Переходим в каталог ollama-function-calling — cd ollama-function-calling.
Создаём файл настроек — make gen. На все вопросы нажимаем Enter, устанавливая значения по умолчанию.
Запускаем конфигурацию для модели — make run-1c.
Загружаем LLM-модель — make seed-saiga-llama.

Убеждаемся, что LLM-модель работает, — заходим на http://IP_АДРЕС_FC_OLLAMA и общаемся с моделью. Внимание, первое сообщение будет обрабатываться долго, т. к. модель всё ещё загружается в видеокарту. Необходимо подождать.

Переходим в настройки Open WebUI (иконка пользователя справа сверху — Настройки).  
Свяжем 1С и Open WebUI: Учетная запись — Ключи API (показать) — Создать новый секретный ключ (далее КЛЮЧ_API).  
Свяжем Open WebUI с 1С: Настройки администратора — Конвейеры — Base Url (далее BASE_URL) устанавливаем http://IP_АДРЕС_FC_1C/ollama-function-calling-1c/hs/function-calling и нажимаем кнопку «Сохранить».

Заходим в базу 1С — Демо. Вызов функций 1С из Ollama — Настройки. Имя сервера - IP_АДРЕС_FC_OLLAMA. Ключ API — КЛЮЧ_API.

Замечание. Остановить работу сервисов LLM-модели можно командой — make stop. Запустить работу — make run-1c.

 

Шаг 3. Тестирование

Внимание, т. к. платформа учебная, то необходимо закрыть конфигуратор 1С и предприятие 1С. Не должно быть никаких соединений с базой. Проверить работу HTTP-сервиса можно по ссылке http://IP_АДРЕС_FC_1C/ollama-function-calling-1c/hs/function-calling — успешным ответом будет «Calling 1C functions from Ollama».

Демо работы в Open WebUI

Для полноценного функционирования и тестирования в 1С необходима стандартная платформа и лицензии. Для учебной версии протестировать функционал в 1С не получится.

Демо работы в 1C

 

 

Как это работает

Для того чтобы заработал механизм вызова функций, Open WebUI расширяется плагином Pipelines. После его включения Open WebUI начинает прогонять каждый вопрос дважды. В результате чего мы получаем:

  • Фильтр сообщений — проверяет сообщения на запретные темы (взлом, мошенничество, создание запрещенных вещей и т. д.).
  • Лимит запросов — ограничение пользователей по количеству запросов.
  • Логирование запросов — сохранение того, что пользователи спрашивают и что им отвечает модель.
  • Дополнение запросов нужным контекстом — например, документацией.
  • Вызов функций.


В нашем случае Pipelines перехватывает сообщение и пытается определить, нет ли в вопросе чего-то, что связано с описанными функциями в файле function_calling_1c.py:

def cost_of_remaining_stock(
            self,
            days: int,
        ) -> str:
            """
            Get the cost of the remaining stock on the specified date.

            :param days: The number of days of deviation from the current date. If it is now, then 0. If yesterday, then -1. If a week ago, then -7.
            :return: The value of the remaining stock on the specified date.
            """

            date = now()
            date = date + timedelta(days=days)
            res = requests.post(self.pipeline.valves.BASE_URL, json={ "name": "store", "date": date.strftime('%Y-%m-%dT%H:%M:%S.%f') })
            json = res.json()
            return f"The product in stock is estimated at ${json['value']} at {date.strftime('%d %B %Y')}"

Т. е. если человек начинает говорить про склад, то надо запустить эту процедуру. В ней же срабатывает POST-запрос по пути BASE_URL (http://IP_АДРЕС_FC_1C/ollama-function-calling-1c/hs/function-calling).

По пути BASE_URL работает HTTP-сервис FunctionCalling быза 1С. В модуле менеджера вычисляется сумма по формуле 3 * (НомерМесяца * 1000 + НомерДняВГоду). Поэтому модель отвечает, что остаток на складе оценивался в 12 273 на третье апреля и 12 276 на второе апреля. И это правильные ответы.

Функция ЛюбойURLМетодPOST(Запрос)
	
	ДанныеЗапроса = ОбщегоНазначения.ЗначениеИзJSONСтроки(Запрос.ПолучитьТелоКакСтроку());
	ИмяПоказателя = ДанныеЗапроса.name;
	Дата = ПолучитьДатуИзСтроки(ДанныеЗапроса.date);
	
	Если ИмяПоказателя = "store" Тогда
		Значение = 3 * (Месяц(Дата) * 1000 + ДеньГода(Дата));
	ИначеЕсли ИмяПоказателя = "money" Тогда
		Значение = 5 * (Месяц(Дата) * 1000 + ДеньГода(Дата));
	Иначе
		Значение = 0;
	КонецЕсли;
	
	ДанныеОтвета = Новый Структура;
	ДанныеОтвета.Вставить("value", Значение);
	
	Ответ = Новый HTTPСервисОтвет(200);
	Ответ.УстановитьТелоИзСтроки(ОбщегоНазначения.СтрокаJSONИзЗначения(ДанныеОтвета));
	Возврат Ответ;
	
КонецФункции

 

На этом наша работа завершена, не забудьте удалить облачные сервера.

 

Дополнительно

  • Open WebUI —  Очень простая и мощная платформа ИИ, поддерживающая множество LLM-моделей и RAG. В связке с Ollama и Pipelines позволяет настроить агентов, которые будут работать над приватными данными локально в собственном окружении.
  • Код демо базы 1С

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    3414    5    0    

11

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    35542    70    45    

30

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

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

57600 руб.

26.11.2024    3066    3    3    

5

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    5174    5    2    

6

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    19486    24    22    

20

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    1258    8    2    

10
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1832003 58 04.04.25 02:14 Сейчас в теме
по факту сделан обычный сервер 1с с публикацией на веб http сервисов и вызов их же. Казалось бы при чем тут какая-то ollama и 1с в целом... в запрос можно любой ресурс выбрать, лишь бы на той стороне обработка была
2. Soloist 551 04.04.25 09:43 Сейчас в теме
(1) Всё так. Изначально была написана статья «Вызов функций в Ollama» (https://habr.com/ru/articles/863232/). И она содержит саму суть так, как вы и описали. Но спустя время я понял, что можно расширить аудиторию, снизив порог вхождения. Поэтому решил написать пример конкретно для 1С, а также подобрал такой маршрут, что любой человек, не имеющий оборудования и знаний в разворачивании системы, сможет попробовать вызывать функцию.
3. maxx 998 06.04.25 23:57 Сейчас в теме
А можно было просто установить локально Ollama и 1c и спросить у неё промтом нет ли в вопросе пользователя вопрос об остатках склада и вернуть тогда остатки, без Питонов и Open Web Ui?
4. Soloist 551 07.04.25 11:48 Сейчас в теме
(3) Возможно.

Первый вариант — это опереться на статью «Ollama Python library 0.4 with function calling improvements» от 25 ноября 2024. Думаю, можно будет позвать функцию на чистой Ollama. Надо попробовать.

Второй вариант — разобрать механику работы Pipelines (расширение для Open Web UI) и перехватывать вопрос вручную. Далее вопрос надо будет проанализировать, добавить контекст и послать в модель дальше. Основная механика описана здесь blueprints/function_calling_blueprint.py:
self.valves = self.Valves(
            **{
                "pipelines": ["*"],  # Connect to all pipelines
                "OPENAI_API_BASE_URL": os.getenv(
                    "OPENAI_API_BASE_URL", "https://api.openai.com/v1"
                ),
                "OPENAI_API_KEY": os.getenv("OPENAI_API_KEY", "YOUR_OPENAI_API_KEY"),
                "TASK_MODEL": os.getenv("TASK_MODEL", "gpt-3.5-turbo"),
                "TEMPLATE": """Use the following context as your learned knowledge, inside <context></context> XML tags.
<context>
    {{CONTEXT}}
</context>

When answer to user:
- If you don't know, just say that you don't know.
- If you don't know when you are not sure, ask for clarification.
Avoid mentioning that you obtained the information from the context.
And answer according to the language of the user's question.""",
            }
        )
Показать
Оставьте свое сообщение