- BrainTools - https://www.braintools.ru -

В эпоху бума больших языковых моделей (LLM) возникает вопрос: насколько хорошо современные LLM пишут код на платформе 1С:Предприятие? Для объективной оценки этих возможностей мы разработали 1C Code Bench — специализированный бенчмарк, позволяющий систематически тестировать и сравнивать способности различных LLM решать типовые задачи программирования на 1С.
Кодовые бенчмарки — это наборы задач для оценки способности LLM генерировать работающий код. Принцип их работы прост: модели предлагают задачу с описанием требуемой функции, она генерирует код, который затем проверяют набором тестов. Основная метрика pass@k показывает долю задач, для которых хотя бы одно из k сгенерированных решений проходит все тесты (при k = 1 это просто доля успешных решений).
Бенчмарки делятся на два типа:
Простые бенчмарки (HumanEval [1], MBPP [2], HumanEval+ [3]) содержат изолированные алгоритмические задачи: написать одну функцию по описанию и проверить её модульными тестами.
Мультиагентные бенчмарки (SWE-Bench [4], SWE-Bench Verified [5]) моделируют реальную разработку: модель получает issue из GitHub-репозитория и должна самостоятельно найти нужные файлы, понять контекст и внести корректные изменения в кодовую базу. Такие бенчмарки значительно сложнее, так как требуют от модели навыков навигации по коду, понимания архитектуры и работы с несколькими файлами одновременно.
Существующие бенчмарки для оценки кодогенерации (HumanEval, MBPP, CodeForces и др.) ориентированы на популярные языки программирования: Python, JavaScript, Java и так далее. Платформа 1С:Предприятие с её встроенным языком остаётся не у дел.
При этом 1С — самая популярная платформа для автоматизации бизнеса в России и СНГ. Разработчики 1С ежедневно решают задачи, которые потенциально можно автоматизировать с помощью LLM:
написание запросов к базе данных;
обработка табличных частей документов;
формирование движений по регистрам;
работа с формами и элементами управления;
написание отчётов и обработок;
интеграция с внешними системами.
1C Code Bench призван ответить на вопросы:
Какие задачи уже решают LLM, а в какие придётся потратить больше времени на исправления глюков?
Какие модели лучше?
Мы взяли конфигурацию «Демонстрационное приложение [6]», добавили в неё некоторые объекты в конфигурацию, добавили небольшое количество данных и получилась наша Демо-база [7].
Бенчмарк содержит 20 тестовых задач, разделённых на три уровня сложности:
базовый: основы языка, простые операции с данными;
средний: запросы, работа с документами и регистрами;
сложный: комплексные бизнес-сценарии.
Также задачи делятся на категории:
По типу контекста:
серверные задачи;
клиентские задачи;
По предметной области:
заполнение и изменение табличных частей;
работа со специфичными объектами 1С (ИнтернетПочтовоеСообщение, FTPСоединение и др.);
выборки с помощью языка запросов;
манипуляции с коллекциями (ТаблицаЗначений, Массив и др.);
работа с макетами и табличными документами;
операции с регистрами накопления и сведений.
Каждая задача представляет собой внешнюю обработку (.epf), содержащую:
макет «Задача» — текстовое описание того, что нужно реализовать;
функцию ЗапуститьРешение() — подготовку тестового окружения и вызов решения;
функцию ЗадачаРешена() — автоматическую проверку корректности результата;
эталонное решение — референсную реализацию, проходящую все тесты.
С точки зрения [8] LLM задача сводится к написанию одной функции. На входе — промпт с условием задачи и (если требуется) контекстом конфигурации. На выходе LLM должна сгенерировать функцию с требуемым именем и решением задачи.
Условие задачи:
Создай функцию
ЗаполнитьТабличнуюЧастьОстатками(ДокументОбъект), которая заполняет табличную часть документа «Заказ» «Товары» остатками из регистра «ТоварныеЗапасы» для склада и даты, заданных в документе. Отбирать только товары с видом = Товар.
Эталонное решение:
Функция ЗаполнитьТабличнуюЧастьОстатками(ДокументОбъект)
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| Т.Товар КАК Товар,
| Т.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварныеЗапасы.Остатки(&Дата, Склад = &Склад) КАК Т
|ГДЕ
| Т.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)";
Запрос.УстановитьПараметр("Дата", ДокументОбъект.Дата);
Запрос.УстановитьПараметр("Склад", ДокументОбъект.Склад);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаТЧ = ДокументОбъект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТЧ, Выборка);
КонецЦикла;
КонецФункции
Условие задачи:
Создай функцию
ЗаменитьНоменклатуру(ТоварИсточник, ТоварЗамены, ДатаС, ДатаПо), которая находит все документы «Заказ» за указанный период и заменяет в них один товар на другой. Вернуть количество изменённых документов.
Эталонное решение:
Функция ЗаменитьНоменклатуру(ТоварИсточник, ТоварЗамены, ДатаС, ДатаПо) Экспорт
КоличествоИзмененных = 0;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заказ.Ссылка КАК Ссылка
|ИЗ
| Документ.Заказ КАК Заказ
|ГДЕ
| Заказ.Дата >= &ДатаС
| И Заказ.Дата <= &ДатаПо
| И НЕ Заказ.ПометкаУдаления";
Запрос.УстановитьПараметр("ДатаС", ДатаС);
Запрос.УстановитьПараметр("ДатаПо", ДатаПо);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
БылаЗамена = Ложь;
БылПроведен = ДокументОбъект.Проведен;
Для Каждого СтрокаТовары Из ДокументОбъект.Товары Цикл
Если СтрокаТовары.Товар = ТоварИсточник Тогда
СтрокаТовары.Товар = ТоварЗамены;
БылаЗамена = Истина;
КонецЕсли;
КонецЦикла;
Если БылаЗамена Тогда
Если БылПроведен Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Иначе
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КоличествоИзмененных = КоличествоИзмененных + 1;
КонецЕсли;
КонецЦикла;
Возврат КоличествоИзмененных;
КонецФункции
Условие задачи:
Создай функцию
РасчетКомиссииМенеджера(ТаблицаКомиссий, Процент, ДатаС, ДатаПо), которая находит документы «Заказ» в заданном интервале и вычисляет комиссию менеджера исходя из сумм в табличной частиТовары
1) Смотрим только проведенные заказы
2) Сумма заказа — это сумма всех строк по реквизитуСумма
3) Комиссия менеджера — сумма всех заказов менеджера (реквизитАвтор) в периоде, умноженная наПроцент.
Функция должна заполнить таблицуТаблицаКомиссий, где должно быть три колонки: Менеджер (из реквизитаАвтор),СуммаЗаказов,Комиссия. Менеджер в таблице должен быть уникальным, один менеджер — одна строка.
Эталонное решение:
Функция РасчетКомиссииМенеджера(ТаблицаКомиссий, Процент, ДатаС, ДатаПо) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заказ.Автор КАК Менеджер,
| СУММА(ЗаказТовары.Сумма) КАК СуммаЗаказов
|ИЗ
| Документ.Заказ КАК Заказ
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.Заказ.Товары КАК ЗаказТовары
| ПО Заказ.Ссылка = ЗаказТовары.Ссылка
|ГДЕ
| Заказ.Проведен = ИСТИНА
| И Заказ.Дата >= &ДатаС
| И Заказ.Дата <= &ДатаПо
|СГРУППИРОВАТЬ ПО
| Заказ.Автор";
Запрос.УстановитьПараметр("ДатаС", ДатаС);
Запрос.УстановитьПараметр("ДатаПо", ДатаПо);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТаблицаКомиссий.Добавить();
НоваяСтрока.Менеджер = Выборка.Менеджер;
НоваяСтрока.СуммаЗаказов = Выборка.СуммаЗаказов;
НоваяСтрока.Комиссия = Выборка.СуммаЗаказов * Процент / 100;
КонецЦикла;
Возврат ТаблицаКомиссий;
КонецФункции
Compile Rate: доля задач, в которых код компилируется и выполняется платформой;
Success Rate: доля задач, в которых решение прошло тесты.
Процесс тестирования:
Генерация решения: LLM получает описание задачи и контекст конфигурации, генерирует код.
Подстановка кода: сгенерированный код подставляется в обработку вместо эталонного решения.
Компиляция: платформа 1С пытается скомпилировать обработку.
Выполнение: при успешной компиляции запускается функция ЗапуститьРешение().
Проверка: функция ЗадачаРешена() верифицирует результат.
Весь процесс полностью автоматизирован: скрипт на Python выполняет все этапы — подстановку кода, выполнение и др. Скрипт генерации поддерживает LLM-провайдерыAnthropic (Claude) и OpenRouter (доступ к множеству моделей).
Весь код бенчмарка и инструкции по запуску доступны в репозитории [9].
|
Модель |
Compile Rate |
Success Rate |
|
Claude Sonnet 4.5 |
85% |
70% |
|
Gemini 3 Pro |
80% |
70% |
|
GPT-5 (high reasoning) |
40% |
30% |
Сильные стороны современных LLM:
хорошо понимают базовый синтаксис языка 1С;
делают простые запросы к данным (не более трёх JOIN-ов);
работают с коллекциями (массивами, структурами, ТаблицаЗначений) — знают все методы и свойства.
Типичные ошибки [10]:
неправильно используют виртуальные таблицы регистров (путают, где какие параметры ставить);
ошибаются в синтаксисе языка запросов (GPT-5 забывает [11] ставить | для разделения строк запроса);
используют неверные имена методов и свойств объектов метаданных;
путаются между серверным и клиентским контекстом.
Мы приглашаем разработчиков 1С к участию в расширении набора задач бенчмарка.
Процесс добавления:
Скачайте шаблон обработки из репозитория.
Создайте задачу по инструкции [12].
Проверьте решение локально.
Отправьте через форму [13] или создайте Pull Request.
задача должна быть решаемой, но не тривиальной (10–100 строк кода);
результат должен быть однозначно проверяемым;
задача должна отражать реальные сценарии разработки на 1С;
обработка не должна изменять данные демо-базы (или откатывать изменения).
1C Code Bench — первый открытый бенчмарк для оценки способностей LLM генерировать код на 1С. Проект позволяет:
объективно сравнивать различные модели;
отслеживать прогресс ИИ-ассистентов для 1С;
выявлять области, требующие улучшения в обучении [14] моделей.
Результаты показывают, что современные модели уже способны решать базовые задачи, но сложные сценарии с использованием специфичных возможностей платформы остаются вызовом.
Репозиторий gitverse [15]
ТГ проекта [16]
Автор: BelowZero
Источник [18]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/30881
URLs in this post:
[1] HumanEval: https://github.com/openai/human-eval
[2] MBPP: https://github.com/google-research/google-research/tree/master/mbpp
[3] HumanEval+: https://github.com/evalplus/evalplus
[4] SWE-Bench: https://www.swebench.com/
[5] SWE-Bench Verified: https://openai.com/index/introducing-swe-bench-verified/
[6] Демонстрационное приложение: https://its.1c.ru/db/metod8dev/content/5028/hdoc
[7] Демо-база: https://drive.google.com/file/d/1AI_cm0HUhB-o2BpK-TeVzXfFp0kWds0b/view
[8] зрения: http://www.braintools.ru/article/6238
[9] репозитории: https://github.com/1cbench/bench
[10] ошибки: http://www.braintools.ru/article/4192
[11] забывает: http://www.braintools.ru/article/333
[12] инструкции: https://1cbench.github.io/crowdsourcing.html
[13] форму: https://docs.google.com/forms/d/e/1FAIpQLScCBd7wKty4iYDh-88Ri5-awD_yh-iw47N12z7DT5e83SZJOg/viewform
[14] обучении: http://www.braintools.ru/article/5125
[15] Репозиторий gitverse: https://gitverse.ru/dmitrii_salikhov/1cbench
[16] ТГ проекта: https://t.me/onec_code_bench
[17] Мой канал об LLM и 1С: https://t.me/llm_1c
[18] Источник: https://habr.com/ru/companies/sberbank/articles/1040114/?utm_campaign=1040114&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.