PunchNobel Peace Prize jury treads carefully after Trump campaignCNN TürkApple iPad Mini serisine OLED dokunuşuThe Jerusalem PostHerzog says he will recommend Israelis who aided in flydubai attack for medal for civilian heroismRTP DesportoPrimeiro semestre de 2026 com maior volume de apostas de sempre em PortugalInquirerGenZennial Tour brings nat’l issues, vote discussions to GenSan youthThe South AfricanBafana Bafana vs Egypt: Salah, rotations, and what’s really at stakeUOLQuando uma eleição presidencial vai para o segundo turno? EntendaХабрКак Splash ускоряет локальные LLM на MacBBC NewsWho is the 'hero' Indian pilot who was stabbed on Israel-bound flight?Sportstar13-year-old S. Ishaan becomes youngest S14 para swimmer to double-cross Palk StraitIl Fatto QuotidianoLavoro nero e sfruttamento, 102 lavoratori irregolari: sequestrate due aziende tessili tra Napoli e SalernoSeeking AlphaEmerging Markets Bond ETF declares monthly distribution of $0.1110
The Daily Newsstand · Free, Always
Thursday, October 1, 2026

Как пустить ИИ в 1С и ничего не сломать: на примере одного HTTP-метода

Translate

Всем привет! Раз вы откликнулись на эту статью, предполагаю, что вы тоже давно точите зуб на то, как работает ваша 1С. А когда появляется новая задача по ERP, вы с небольшой опаской наблюдаете за её реализацией. Вот и я такой же. Только с недавних пор мне пришлось погрузиться в 1С сильнее, чем среднестатистическому пользователю.

В одном предложении о себе. Меня зовут Дмитрий Чащин, у нас со старшим братом свой стартап по речевой аналитике. Но, как это обычно бывает, стартап сам себя не прокормит, поэтому мы работаем ещё и в семейном бизнесе, который производит системы пожаротушения. Имён называть не буду, потому что Хабр опять меня забанит :)

Делайте Ctrl+P или Cmd+P на эту статью и вставляйте в свою ИИшку, если лень читать

А теперь к делу. Появилась задача: генерировать в 1С серийные номера для продукции. Что обычно происходит в этот момент? Задача спускается на человека, который занимается 1С. Он готовит очень базовое описание для нашего подрядчика-интегратора, и дальше мы всё это мусолим на созвонах. Для начала хватило бы двух-трёх простых HTTP-методов: создание и сохранение серийных номеров, без сложной логики привязки к продукции при оформлении заказов и прочего. Глубоко в разработку мы уходить не хотели специально: на первом этапе нужно было отработать саму логику «запрос — ответ» для генерации и гравировки серийников. Интегратор 1С прислал на это смету, и сумма в ней оказалась в три раза больше, чем мы рассчитывали.

Я немного ошалел: откуда такие цены? И это в то время, когда все активно ускоряют разработку с помощью ИИ. Хотя, честно говоря, начать надо не с этого. Этот же подрядчик раньше сделал нам аж девять HTTP-запросов с глубочайшей интеграцией в существующие макросы нашей ERP, и обошлось это втрое дешевле. С этим интегратором мы работаем давно. Работу он делает нормально, ни хорошо ни плохо, а какое-то время был даже дешевле остальных.

В тот момент я дал себе установку. Ок, я чайник в 1С. Но я своими глазами вижу, как ИИ пишет код для методов, полей и макросов. Мне не хватало одного: чтобы он сам находил, куда «тыкнуть» в Конфигураторе, и сам всё настроил. Если у ИИ получится (вариант А), значит, задача не стоит таких денег. Если не получится от и до (вариант Б) — значит, стоит, а я молодой дурачок, который слишком плотно сел на иглу ИИ и потихоньку тупеет под влиянием кодовых агентов. Кстати, вторая половина вывода Б уже частично сбывается: мы явно ленимся и всё меньше читаем свой код. Но статья не о моей трагедии.

Чем кончилось? Открытая модель Qwen3-VL через удалённый рабочий стол сама создала в 1С:ERP шаблон URL, метод GET и обработчик, сохранила бэкап расширения и обновила конфигурацию базы. Самое важное: я принципиально поставил условие, что всё делается без доступа к файлам, только по картинке экрана и мышью.

Откуда вообще задача

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

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

Дальше начинается веселье. Единый формат номера согласовать гораздо сложнее, чем кажется, потому что каждый хочет видеть в нём своё: группу товара, завод, дату, порядковый номер за день. Идея такая: по самому номеру сразу видно базовое (что за изделие, где и когда сделано), а по базе данных можно узнать подробности, что и когда в него собрали. Формат не утверждён до сих пор. А лазерное оборудование куплено давно, и хочется уже сейчас повесить на него какой-нибудь Raspberry Pi Zero и начать слать запросы в 1С на генерацию хоть чего-то. Пока внутри спорят о формате, генерацию и самый базовый бизнес-процесс хочется уже тестировать.

Формат номера всё ещё обсуждаем, а начинать хочется уже сейчас

Формат номера всё ещё обсуждаем, а начинать хочется уже сейчас

Сразу отвечу на вопрос, который наверняка прилетит в комментариях: а почему не OData? Потому что это совсем другое измерение. OData в 1С по сути открывает наружу таблицы: справочники, документы, регистры. Читай, пиши, фильтруй. А нам нужен метод с логикой внутри 1С: собрать номер по формату, взять следующий порядковый номер за день так, чтобы два одновременных запроса не получили один и тот же, отметить, нанесён он или нет. Через OData всю эту логику пришлось бы унести на ту самую Raspberry Pi у лазера, и каждая железка считала бы счётчик сама. Дубли номеров гарантированы :) Плюс HTTP-метод — это свой договор с внешним миром, хоть и ограниченным стенами предприятия: формат номера внутри поменялся, а адрес и ответ остались прежними. Если бы нужно было просто читать данные из 1С, OData был бы быстрее, и агент тут вообще бы не понадобился.

Теперь представьте, что мы покупаем всё у интегратора. Платим втрое больше, потом формат меняется (а он точно поменяется, возможно, на 180 градусов), всё надо переделывать, и тут включается рубильник почасовой поддержки, где ценник ещё выше. В итоге деньги и время потрачены, а мы ещё и выясняем, почему ничего не работает. Никто же не признаёт свои ошибки :)

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

Отсюда и цель статьи. Я хочу, чтобы люди вроде меня, которые не 1С-ники, могли сами сделать первые простые вещи, а доделку и перенос в рабочую базу отдавали профессионалу.

Что подготовить до старта

Скажу очевидную для многих вещь, которая совсем не очевидна тем, кто захочет автоматизировать свою 1С: всё, что делается в Конфигураторе, тестируется на копии базы. Если что-то упадёт в рабочей, упадёт вся компания :)

Всё своё агент делает в отдельном расширении конфигурации api (назвать его можно как угодно), объекты называет с префиксом api_ и чужого не трогает. Перед каждой правкой расширение выгружается в файл .cfe с датой в имени. Если что-то пошло не так, загружаешь старый файл обратно, и всё как было.

Всё своё — в отдельном расширении api, остальные расширения базы не трогаем (их названия размыты)

Всё своё — в отдельном расширении api, остальные расширения базы не трогаем (их названия размыты)

Всё своё — в отдельном расширении api, остальные расширения базы не трогаем (их названия размыты)

1С обычно стоит на Windows-сервере, и заходят туда по удалённому рабочему столу, RDP. Значит, нужен ИИ-агент, который понимает, куда нажать и что прокрутить на удалённом столе, а не на моём. Разницу объясню ниже, она попила мне немало крови.

Модель нужна не обычная текстовая, а визуальная, с буквами VL в названии (vision-language): агент работает по картинке экрана, и текстовая модель просто не поймёт, что на ней. Брать её можно облачную или локальную. У большинства компаний есть данные, которые в облако отправлять нельзя. Те же финансы и переписку с контрагентами лучше, мягко говоря, в облако не посылать. Если в вашей задаче их мало, берите облако и сэкономите себе время и силы. А самый простой путь вообще — Claude Cowork: там даже думать не надо, в нашей же 1С он сделал такой метод за один заход. Но мне было интересно пройти путь на открытой модели.

И последнее: пароли вводит человек. Агенту их не дают никогда.

Почему RDP и рецепт «идеальной» работы

Что нужно, чтобы всё заработало?

  1. Изолированный рабочий стол, к которому можно подключиться по RDP. Попросите сисадмина сделать изолированное пространство с правами администратора внутри него. Без этого вы не сможете опубликовать правки из Конфигуратора.

  2. Реплика 1С:ERP. Снимите копию базы и разверните её в этом пространстве. Ни в коем случае не проделывайте всё это на рабочей базе.

  3. Пользователь 1С с правами администратора. Для реплики можно завести отдельного администратора с новым паролем, никаких проблем. Иначе опубликовать изменения в Конфигураторе не получится.

  4. Модель, облачная или локальная.

В какой-то момент я понял, что RDP тут ровно то, что нужно.

Чтобы опубликовать HTTP-сервис, нужен рабочий стол с правами администратора. Давать такие права агенту на своей машине страшно. А сессия RDP на сервере с копией базы даёт очень понятную стенку. Агент сидит у меня на компьютере, с сервера получает только картинку экрана, а обратно отправляет только клики и текст. На сервер ничего не ставится, к файлам базы доступа у него нет. По сути это стажёр, которого посадили за чужой компьютер.

Откуда что берётся: картинка приходит с сервера, клик уходит обратно, больше ничего

Откуда что берётся: картинка приходит с сервера, клик уходит обратно, больше ничего

Откуда что берётся: картинка приходит с сервера, клик уходит обратно, больше ничего

Напрягся ли я? Конечно. В какой-то момент подумал: а вдруг у него всё-таки есть доступ к файловой системе. На самом деле бояться тут нечего. Агент ходит под контролем, и если он захочет выйти за пределы 1С, это будет видно физически: вместо Конфигуратора на экране окажется другое приложение.

Так и случилось один раз. Модель Kimi K3, которую мы пробовали в роли «мозга», нажала Alt+Tabи ушла из окна RDP. Увидели сразу и остановили.

Важная оговорка, возможно, очевидная: полностью закрытый контур даст только локальная модель.

Наш путь к рабочему инструменту

Чтобы было понятно, откуда взялось время:

Дни

Что пробовали

Чем кончилось

1–2

Open Cowork + локальная qwen3-vl:30b

Видит, но не попадает: промах ~1600 px при уверенности 0,95

3–4

Open Cowork + облачная qwen3-vl-plus, четыре своих патча

Попадать научилась, но блуждает. Бросили

5–6

Сам Claude Desktop на Qwen через шлюз

Экрана в этом режиме нет, модель выдумала «ТЕСТ ЗАВЕРШЁН»

6-й, утро

Agent S3

Промахов ноль, завершений тоже ноль (профессиональный прокрастинатор :)

7-й

agent-rdp + своя обвязка на 177 строк

Метод создан, сохранён, база обновлена

Если одной картинкой, то основа у всех попыток была общая, а менялось то, кто смотрит на экран и кликает:

Слева три попытки, где агент смотрит на мой рабочий стол и промахивается; справа agent-rdp, который сам подключается к серверу

Слева три попытки, где агент смотрит на мой рабочий стол и промахивается; справа agent-rdp, который сам подключается к серверу

Слева три попытки, где агент смотрит на мой рабочий стол и промахивается; справа agent-rdp, который сам подключается к серверу

Дальше про главные грабли. Если нужен только рецепт, листайте к разделу «Как собрать у себя».

Open Cowork, или майнкрафт в майнкрафте

Популярные у энтузиастов решения по факту оказываются полной шляпой, и тут я вам сэкономлю кучу времени.

Open Cowork — это открытая оболочка десктопного агента, куда можно подставить любую модель. Ставится чисто, без аккаунта и телеметрии. Первое, что видишь в настройках: «Sandbox disabled — commands run directly on system». Песочница требует WSL2, так что «поставил и безопасно» тут не работает.

Ставили релиз v3.3.1 для Windows с GitHub: OpenCoworkAI/open-cowork. Модель подключается в настройках, для локальной Ollama всё находится само:

Установщик:  Open.Cowork-3.3.1-win-x64.exe (123 МБ), «Только для меня», без прав администратора
Провайдер:   Ollama
Base URL:    http://localhost:11434/v1     ← подставился сам по кнопке «Find Local Ollama»
Модель:      qwen3:30b-a3b, потом qwen3-vl:30b (у первой нет зрения, об этом ниже)
API-ключ:    не нужен
Open Cowork на GitHub: 2,2 тыс. звёзд, в описании обещана песочница

Open Cowork на GitHub: 2,2 тыс. звёзд, в описании обещана песочница

Open Cowork на GitHub: 2,2 тыс. звёзд, в описании обещана песочница

Почему промахивались все модели? Агент фотографирует весь ваш рабочий стол, а окно RDP на нём всего лишь картинка внутри картинки. Модель показывает точку, а пересчитывают её по вашему экрану, где всё совсем по-другому. Это как запустить майнкрафт в майнкрафте :)

Майнкрафт, собранный внутри майнкрафта из редстоуна. Источник: sammyuri, I made Minecraft in Minecraft with redstone!

Майнкрафт, собранный внутри майнкрафта из редстоуна. Источник: sammyuri, I made Minecraft in Minecraft with redstone!

Майнкрафт, собранный внутри майнкрафта из редстоуна. Источник: sammyuri, I made Minecraft in Minecraft with redstone!

Сверху добавилась ещё одна прелесть. Коннектор ждал координаты в формате Gemini, где сначала идёт y, потом x, а Qwen отдаёт наоборот. Ехать по европейской колее вместо русской мы не хотели, хотя и попробовали. Модель показывала ровно на нужный плюсик в дереве, а клик улетал в зеркальную точку. Со стороны казалось, что модель тупая, а виноват был стык, и видно это было только в логе.

Почему клик уходил мимо

Почему клик уходил мимо

Почему клик уходил мимо

Самое смешное случилось в первый же день. Модель без зрения записала себе в долговременную память «не умею работать с графическим интерфейсом и удалённым рабочим столом» и неделю этому свято следовала. Запись пережила даже чистку через интерфейс, удалять пришлось руками из файла.

А самое удивительное — насколько даже большая облачная модель, qwen3-vl-plus (класс 235B), начинает галлюцинировать, если задача 5–6 раз подряд не выполняется. Она писала «ветка раскрыта» при свёрнутом дереве и «после нажатия down…», хотя в логе не было ни одного нажатия. Меня это искренне удивило.

Мы написали к Open Cowork четыре патча, и попадать модель научилась: пять кликов, пять попаданий. Но каждая починка снимала один слой проблем и открывала следующий.

Девять слоёв: чинили одно, вылезало другое

Девять слоёв: чинили одно, вылезало другое

Девять слоёв: чинили одно, вылезало другое

Главный урок отсюда: подсказку в промпте модель в действие не превращает. Мы прямо писали ей формулу пересчёта координат, и она ни разу её не применила. Чинить надо инструмент, а не уговаривать модель.

На девятом слое я Open Cowork закрыл.

Сильнее модель — не значит лучше

Agent S на GitHub: 12,4 тыс. звёзд и слоган «пользуйся компьютером как человек»

Agent S на GitHub: 12,4 тыс. звёзд и слоган «пользуйся компьютером как человек»

Agent S на GitHub: 12,4 тыс. звёзд и слоган «пользуйся компьютером как человек»

Следующим был Agent S3 (simular-ai/agent-s). Там за «куда кликнуть» и «что делать» отвечают разные модели.

Сначала он у меня «установился» не тот. На Python 3.13 pip молча ставит gui-agents 0.1.3, а это ещё Agent S1: версии 0.2–0.3.2 требуют Python не новее 3.12. Поэтому отдельное окружение на 3.11 через uv, системный Python не трогаем:

pip install uv
uv venv --python 3.11 .venv311
.venv311\Scripts\activate
uv pip install gui-agents==0.3.2
:: свой запуск: задание из JSON, снимки до/после каждого шага, блок-лист опасных действий
py run_s3_task.py tasks\sh5_http_templates.json

Планировщик и наводчик ходили в Qwen через тот же шлюз LiteLLM, о нём ниже. Попадала Qwen с ошибкой 4–9 пикселей, промахов ноль. Но и завершений тоже ноль: агент видел цель на пятом шаге и уходил гулять в соседнее дерево.

Agent S3, один прогон: к шагу 10 нужные шаблоны уже видны справа (зелёное), а агент раскрывает дерево слева (красное)

Agent S3, один прогон: к шагу 10 нужные шаблоны уже видны справа (зелёное), а агент раскрывает дерево слева (красное)

Agent S3, один прогон: к шагу 10 нужные шаблоны уже видны справа (зелёное), а агент раскрывает дерево слева (красное)

Заодно нашлась неприятная вещь про безопасность. Библиотека Agent S3 выполняет строки кода, которые пишет модель, а в коде ввода текста у неё зашита установка пакетов через sudo с паролем от их тестового стенда. Без своего списка запретов такое запускать нельзя, и мы его написали.

Логичная мысль: мозг слабоват, давай посильнее. qwen3.8-max думала 270 секунд над одним шагом, мы её остановили. Kimi K3 за 313 секунд сделала четыре шага и нажала Alt+Tab, ту самую историю я рассказал выше.

Agent S3 с разными моделями в роли мозга. До конца не дошла ни одна

Agent S3 с разными моделями в роли мозга. До конца не дошла ни одна

Agent S3 с разными моделями в роли мозга. До конца не дошла ни одна

С координатами всё было в порядке: проблема была в том, что модель не понимала «цель уже достигнута». Нужен был свой, очень узкий цикл: мелкие подцели и проверка после каждого шага.

Что сработало: agent-rdp и своя обвязка

agent-rdp (thisnick/agent-rdp) — это RDP-клиент, сделанный специально для ИИ. Он фотографирует экран самой сессии на сервере, двигает мышь и кладёт текст в буфер обмена через канал RDP. Майнкрафт в майнкрафте исчезает: где модель увидела кнопку, туда и приходит клик.

Страница agent-rdp у автора: «дать ИИ-агентам видеть удалённый рабочий стол Windows и управлять им через RDP»

Страница agent-rdp у автора: «дать ИИ-агентам видеть удалённый рабочий стол Windows и управлять им через RDP»

Страница agent-rdp у автора: «дать ИИ-агентам видеть удалённый рабочий стол Windows и управлять им через RDP»

Важно понимать, что agent-rdp — это инструмент. Готовых функций в духе «сделай мне в 1С» там нет, всё пишешь сам. Скелет есть, мясо надо накинуть. Зато из всего, что я перепробовал, он оказался самым качественным и понятным. Забавно, что у него на момент написания всего 20 звёзд на GitHub против тысяч у Open Cowork и Agent S.

agent-rdp на GitHub: 20 звёзд, 8 форков. Самый полезный инструмент в этой истории

agent-rdp на GitHub: 20 звёзд, 8 форков. Самый полезный инструмент в этой истории

agent-rdp на GitHub: 20 звёзд, 8 форков. Самый полезный инструмент в этой истории

Ставится одной командой, подключение — тоже одной. Пароль вводит человек, в файлы он не пишется:

npm.cmd install -g agent-rdp
agent-rdp connect --host <сервер> --username <логин> --password-stdin ^
  --enable-win-automation --stream-port 9224 --width 1920 --height 1080

На localhost:9224 в браузере видно ровно то, что видит агент.

Так выглядит agent-rdp: в браузере на localhost:9224 открыта та же сессия с Конфигуратором, что видит агент

Так выглядит agent-rdp: в браузере на localhost:9224 открыта та же сессия с Конфигуратором, что видит агент

Так выглядит agent-rdp: в браузере на localhost:9224 открыта та же сессия с Конфигуратором, что видит агент

Мясо — это наша обвязка qwen_rdp.py на 177 строк. Скрипты для неё, чтобы грамотно вставлять текст и кликать, мне писал Claude. А все решения внутри принимает одна облачная qwen3-vl-plus: смотрит на экран, выбирает одно действие, показывает, куда кликнуть, и после клика по свежему снимку проверяет, получилось ли.

Как всё устроено: с сервера приходит только картинка экрана, туда уходят только клики и текст, решения принимает Qwen через LiteLLM

Как всё устроено: с сервера приходит только картинка экрана, туда уходят только клики и текст, решения принимает Qwen через LiteLLM

Как всё устроено: с сервера приходит только картинка экрана, туда уходят только клики и текст, решения принимает Qwen через LiteLLM

С agent-rdp обвязка общается обычными командами командной строки. По сути весь «контакт с 1С» — это три вызова:

rdp("screenshot", "--output", p)          # снимок экрана самой RDP-сессии
rdp("mouse", "click", str(x), str(y))     # клик туда, куда показала модель
rdp("clipboard", "set", "api_test3p")     # текст в буфер обмена через канал RDP
Как агент делает каждый шаг

Как агент делает каждый шаг

Как агент делает каждый шаг

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

{
  "goal": "Open the main menu 'Конфигурация' and click 'Обновить конфигурацию базы данных'. If 1C asks whether to save changes, answer 'Да'.",
  "check": "The bottom tab reads 'Api' WITHOUT an asterisk, and no dialog is open.",
  "ground_crop": [0, 30, 900, 700],
  "max_steps": 8
}

Начинали с разминки, которая ничего не меняет: раскрыть шаблон в дереве и открыть свойства метода.

Разминка, прогон r1: Qwen сама раскрыла шаблон в дереве и открыла свойства метода GET, 32 секунды на всё

Разминка, прогон r1: Qwen сама раскрыла шаблон в дереве и открыла свойства метода GET, 32 секунды на всё

Разминка, прогон r1: Qwen сама раскрыла шаблон в дереве и открыла свойства метода GET, 32 секунды на всё

Агент, который не знает ни одной горячей клавиши

Сюрприз среды: клавиатура от agent-rdp до Конфигуратора не доходит вообще. Ни F7, ни Insert, даже Backspace. До Проводника доходит, до 1С нет.

Backspace от agent-rdp отправлен, а в поле «Имя» по-прежнему ШаблонURL1

Backspace от agent-rdp отправлен, а в поле «Имя» по-прежнему ШаблонURL1

Backspace от agent-rdp отправлен, а в поле «Имя» по-прежнему ШаблонURL1

И это оказалось не проблемой. Агент работал как человек, который не знает ни одной горячей клавиши: только мышь, меню и правый клик. Вместо Insert — правый клик по ветке и «Добавить», вместо Ctrl+S — пункт в главном меню, вместо F7 — «Конфигурация → Обновить конфигурацию базы данных». Пункты меню подписаны словами, и модель их спокойно читает, а горячих клавиш на экране не нарисовано.

Остаётся вопрос: как без клавиатуры вписать имя в поле? Через буфер обмена. Модель говорит «впиши api_test3p в поле „Имя“», а дальше обвязка делает то, что сделал бы любой офисный работник мышкой.

Как вписать текст, когда клавиатура не работает

Как вписать текст, когда клавиатура не работает

Как вписать текст, когда клавиатура не работает

Прогон r3e: имя и шаблон вставлены через буфер и правый клик, 34 секунды на всё

Прогон r3e: имя и шаблон вставлены через буфер и правый клик, 34 секунды на всё

Прогон r3e: имя и шаблон вставлены через буфер и правый клик, 34 секунды на всё

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

Всего до результата было 18 прогонов, около 25 минут машинного времени.

Все прогоны 25.09: зелёное Qwen сделала сама, оранжевое с подсказкой, красное не вышло

Все прогоны 25.09: зелёное Qwen сделала сама, оранжевое с подсказкой, красное не вышло

Все прогоны 25.09: зелёное Qwen сделала сама, оранжевое с подсказкой, красное не вышло

Красные полосы в нижней половине — попытки попасть в пункт меню «Расширения». Модель раз за разом попадала в соседний пункт «Текст». Вылечили просто: стали показывать модели не весь экран, а только вырезку с меню.

Результат

В тестовой базе появились шаблон api_test3p с адресом /test3p, метод GET и обработчик. Сам обработчик сгенерировала 1С по кнопке с лупой:

Метод GET создан, поле «Обработчик» пустое. Клик по лупе, и 1С сама пишет функцию api_test3pGET

Метод GET создан, поле «Обработчик» пустое. Клик по лупе, и 1С сама пишет функцию api_test3pGET

Метод GET создан, поле «Обработчик» пустое. Клик по лупе, и 1С сама пишет функцию api_test3pGET

Функция api_test3pGET(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    Возврат Ответ;
КонецФункции

Перед сохранением агент выгрузил расширение в .cfe, это наша точка отката. Сохранять и обновлять базу разрешил я, после бэкапа, а дальше Qwen сама прошла через главное меню. Признак успеха: вкладка Api без звёздочки, а пункты «Сохранить» и «Обновить» стали неактивны.

Бэкап расширения в .cfe сохранён, это точка отката перед сохранением

Бэкап расширения в .cfe сохранён, это точка отката перед сохранением

Бэкап расширения в .cfe сохранён, это точка отката перед сохранением

После сохранения: «Сохранить» и «Обновить» неактивны, вкладка Api без звёздочки

После сохранения: «Сохранить» и «Обновить» неактивны, вкладка Api без звёздочки

После сохранения: «Сохранить» и «Обновить» неактивны, вкладка Api без звёздочки

Метод живой. Учётку для проверки вводил я сам, агенту пароли не даём:

Проверка метода: 200 и пустой ответ. Адрес, публикация и логин заменены

Проверка метода: 200 и пустой ответ. Адрес, публикация и логин заменены

Проверка метода: 200 и пустой ответ. Адрес, публикация и логин заменены

Пустой ответ с кодом 200 — ровно то, что делает заглушка: 1С приняла запрос, нашла шаблон и вызвала обработчик.

Руками Qwen поправляли четыре раза. В списке из шестидесяти расширений она прокрутила всё и не увидела строку api, её нашли через распознавание текста в agent-rdp. После неудачных переименований закрыли окно ошибки «Имя не должно быть пустым». Вписали имя файла бэкапа. И отменили выгрузку чужого расширения.

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

Тот самый момент: проверяющий сказал «api», а в имени файла по умолчанию чужое расширение (имя заменено)

Тот самый момент: проверяющий сказал «api», а в имени файла по умолчанию чужое расширение (имя заменено)

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

Так А или Б? Задача сделана через интерфейс, от создания до обновления базы, с четырьмя подсказками. Методов нужно два-три, они реализованы, хотя для статьи я показал метод-заглушку. Для меня это ближе к А: работу, которую мне насчитали втрое дороже, чайник с открытой моделью сделать может.

А что потом с этим кодом

В прод агента я пускать не собираюсь. А зачем? Самое главное, что мы уже можем дёргать HTTP-методы и примерно закладывать бизнес-логику, безболезненно меняя код внутри Конфигуратора.

Код с копии базы я отдаю нашему 1С-специалисту, который поддерживает ERP. Когда мы всё изучили, адаптировали и готовы вставлять в рабочую базу, он переносит это сам, после нагрузочных тестов и всего, что положено. Ему не надо тратить время на эксперименты, а нам не надо стоять в очереди.

Путь кода до рабочей 1С

Путь кода до рабочей 1С

Путь кода до рабочей 1С

Следующий шаг — нормальный чат с агентом. Первый живой вопрос, который я задал Qwen, был «что ты видишь на экране?». Вместо ответа словами она превратила вопрос в план действий, полезла что-то закрывать и четыре раза промахнулась по крестику размером 16 пикселей. Вывод понятный: нужны два отдельных режима, «Спросить» и «Сделать», и для мелких кнопок — наведение в два захода, с увеличением.

Первый набросок чата: «Спросить» и «Сделать» уже разведены по кнопкам, но на вопрос «что на экране?» модель пока просит уточнить

Первый набросок чата: «Спросить» и «Сделать» уже разведены по кнопкам, но на вопрос «что на экране?» модель пока просит уточнить

Первый набросок чата: «Спросить» и «Сделать» уже разведены по кнопкам, но на вопрос «что на экране?» модель пока просит уточнить

Как собрать у себя

Обвязку и примеры заданий я выложил в открытый репозиторий qwen-1c-rdp, там пошаговый README. Коротко путь такой.

Всё из «рецепта идеальной работы» выше уже должно быть: изолированный рабочий стол, реплика базы, администратор, расширение и его бэкап в .cfe. Дальше только установка. Поставьте agent-rdp командой npm.cmd install -g agent-rdp: обычный npm в PowerShell блокируется политикой скриптов, поэтому именно .cmd. Поднимите LiteLLM на 127.0.0.1:4000 и подключите к нему облачную qwen3-vl-plus через DashScope или локальную модель через Ollama. Конфиг шлюза у нас такой, ключи берутся из переменных окружения:

model_list:
  - model_name: cloud-qwen3-vl-plus          # так получен результат
    litellm_params:
      model: dashscope/qwen3-vl-plus
      api_base: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
      api_key: os.environ/DASHSCOPE_API_KEY
  - model_name: local-qwen3-vl-30b           # локально, нужно больше 16 ГБ видеопамяти
    litellm_params:
      model: ollama_chat/qwen3-vl:30b
      api_base: http://127.0.0.1:11434
general_settings:
  master_key: os.environ/GATEWAY_KEY

Запуск шлюза и прогона. chcp 65001 и PYTHONUTF8 обязательны, иначе русские строки роняют шлюз в консоли cp1251:

chcp 65001
set PYTHONUTF8=1
set DASHSCOPE_API_KEY=ваш_ключ
set GATEWAY_KEY=придумайте_ключ_шлюза
litellm --config gateway\config.yaml --host 127.0.0.1 --port 4000

:: в соседнем окне
py qwen_rdp.py tasks\examples\01_open_method.json
LiteLLM: шлюз, через который обвязка ходит к любой модели одним и тем же способом

LiteLLM: шлюз, через который обвязка ходит к любой модели одним и тем же способом

LiteLLM: шлюз, через который обвязка ходит к любой модели одним и тем же способом

Qwen3-VL в библиотеке Ollama: локальные версии от 2B до 235B

Qwen3-VL в библиотеке Ollama: локальные версии от 2B до 235B

Qwen3-VL в библиотеке Ollama: локальные версии от 2B до 235B

Дальше подключение. Пароль вводите сами, после ввода нажмите Ctrl+Z и Enter. Если agent-rdp открыл пустую сессию, закройте своё окно RDP крестиком (именно отключиться, без «Выйти»), и agent-rdp подцепит сессию с открытым Конфигуратором. Возьмите пример задания из репозитория, поменяйте подцели под себя и запускайте. Готовность смотрите на экране: статус в логе врёт в обе стороны. Что-то пошло не так — загружаете .cfe обратно.

Про локальную модель скажу прямо. qwen3-vl:30b занимает 19 ГБ и не влезла в мои 16 ГБ видеопамяти: 218 секунд на один вопрос по картинке. Через agent-rdp я её прогнать не успел, хотя думаю, что с мелкими подцелями она бы справилась.

Тише едешь

Если из статьи запомнить одну мысль, пусть будет эта:

Медленнее не значит хуже.

Есть в интернете ролик. Мужик в Германии делает ремонт в двухэтажной квартире. На лестнице у него стоит кресло-подъёмник, которое в Германии встречается повсюду: садишься, и оно возит тебя с этажа на этаж. В Европе много пожилых людей, у которых уже нет мобильности молодых, вот им и приходится так перемещаться между этажами. Так вот, он, рабочий, возит на нём мешки с бетонной смесью. Руками он бы таскал их заметно быстрее. Зато спину сохранил, а пока кресло ехало, готовил почву для следующих задач.

Вот и тут так же. Я уверен, что есть способы элегантнее и понятнее. Я лишь показываю, как сделать это в лоб, безопасно и всё-таки эффективно: мышью по экрану, на копии базы, с бэкапом и человеком, который принимает решения.

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

Ссылки

  • Telegram-канал — https://t.me/notes_from_cto. Регулярные технические заметки про инфру, локальный ИИ и железо. Буду рад, если зайдёте и останетесь.

Если есть что сказать по теме — как вы сами пускаете ИИ в 1С, чем бы заменили RDP или где мы перемудрили, — пишите на cdv.inbox@gmail.com, Чащин Дмитрий. Буду рад обратной связи.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.