1C Code Bench — бенчмарк для оценки способности LLM писать код на 1С
Бенчмарк разработан в Управлении экспериментальных систем машинного обучения Sber Al. Мы учим собственные модели, активно продвигаем науку в области, ставим уникальные эксперименты, пишем статьи уровня А* и создаем собственные бенчмарки. 1C CodeBench создан командой GigaCode R&D и командой разметки УЭСМО.

В эпоху бума больших языковых моделей (LLM) возникает вопрос: насколько хорошо современные LLM пишут код на платформе 1С:Предприятие? Для объективной оценки этих возможностей мы разработали 1C Code Bench — специализированный бенчмарк, позволяющий систематически тестировать и сравнивать способности различных LLM решать типовые задачи программирования на 1С.
Кодовые бенчмарки
Кодовые бенчмарки — это наборы задач для оценки способности LLM генерировать работающий код. Принцип их работы прост: модели предлагают задачу с описанием требуемой функции, она генерирует код, который затем проверяют набором тестов. Основная метрика pass@k показывает долю задач, для которых хотя бы одно из k сгенерированных решений проходит все тесты (при k = 1 это просто доля успешных решений).
Бенчмарки делятся на два типа:
Простые бенчмарки (HumanEval, MBPP, HumanEval+) содержат изолированные алгоритмические задачи: написать одну функцию по описанию и проверить её модульными тестами.
Мультиагентные бенчмарки (SWE-Bench, SWE-Bench Verified) моделируют реальную разработку: модель получает issue из GitHub-репозитория и должна самостоятельно найти нужные файлы, понять контекст и внести корректные изменения в кодовую базу. Такие бенчмарки значительно сложнее, так как требуют от модели навыков навигации по коду, понимания архитектуры и работы с несколькими файлами одновременно.
Зачем нужен бенчмарк для 1С?
Существующие бенчмарки для оценки кодогенерации (HumanEval, MBPP, CodeForces и др.) ориентированы на популярные языки программирования: Python, JavaScript, Java и так далее. Платформа 1С:Предприятие с её встроенным языком остаётся не у дел.
При этом 1С — самая популярная платформа для автоматизации бизнеса в России и СНГ. Разработчики 1С ежедневно решают задачи, которые потенциально можно автоматизировать с помощью LLM:
-
написание запросов к базе данных;
-
обработка табличных частей документов;
-
формирование движений по регистрам;
-
работа с формами и элементами управления;
-
написание отчётов и обработок;
-
интеграция с внешними системами.
1C Code Bench призван ответить на вопросы:
-
Какие задачи уже решают LLM, а в какие придётся потратить больше времени на исправления глюков?
-
Какие модели лучше?
Структура бенчмарка и задачи
Мы взяли конфигурацию «Демонстрационное приложение», добавили в неё некоторые объекты в конфигурацию, добавили небольшое количество данных и получилась наша Демо-база.
Бенчмарк содержит 20 тестовых задач, разделённых на три уровня сложности:
-
базовый: основы языка, простые операции с данными;
-
средний: запросы, работа с документами и регистрами;
-
сложный: комплексные бизнес-сценарии.
Также задачи делятся на категории:
-
По типу контекста:
-
серверные задачи;
-
клиентские задачи;
-
-
По предметной области:
-
заполнение и изменение табличных частей;
-
работа со специфичными объектами 1С (ИнтернетПочтовоеСообщение, FTPСоединение и др.);
-
выборки с помощью языка запросов;
-
манипуляции с коллекциями (ТаблицаЗначений, Массив и др.);
-
работа с макетами и табличными документами;
-
операции с регистрами накопления и сведений.
-
Каждая задача представляет собой внешнюю обработку (.epf), содержащую:
-
макет «Задача» — текстовое описание того, что нужно реализовать;
-
функцию ЗапуститьРешение() — подготовку тестового окружения и вызов решения;
-
функцию ЗадачаРешена() — автоматическую проверку корректности результата;
-
эталонное решение — референсную реализацию, проходящую все тесты.
С точки зрения LLM задача сводится к написанию одной функции. На входе — промпт с условием задачи и (если требуется) контекстом конфигурации. На выходе LLM должна сгенерировать функцию с требуемым именем и решением задачи.
Примеры задач
Заполнение табличной части остатками
Условие задачи:
Создай функцию ЗаполнитьТабличнуюЧастьОстатками(ДокументОбъект), которая заполняет табличную часть документа «Заказ» «Товары» остатками из регистра «ТоварныеЗапасы» для склада и даты, заданных в документе. Отбирать только товары с видом = Товар.
Эталонное решение:
Функция ЗаполнитьТабличнуюЧастьОстатками(ДокументОбъект) Запрос = Новый Запрос(); Запрос.Текст = «ВЫБРАТЬ | Т.Товар КАК Товар, | Т.КоличествоОстаток КАК Количество |ИЗ | РегистрНакопления.ТоварныеЗапасы.Остатки(&Дата, Склад = &Склад) КАК Т |ГДЕ | Т.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)»; Запрос.УстановитьПараметр(«Дата», ДокументОбъект.Дата); Запрос.УстановитьПараметр(«Склад», ДокументОбъект.Склад); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл СтрокаТЧ = ДокументОбъект.Товары.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТЧ, Выборка); КонецЦикла; КонецФункции 
Замена номенклатуры в документах
Условие задачи:
Создай функцию ЗаменитьНоменклатуру(ТоварИсточник, ТоварЗамены, ДатаС, ДатаПо), которая находит все документы «Заказ» за указанный период и заменяет в них один товар на другой. Вернуть количество изменённых документов.
Эталонное решение:
Функция ЗаменитьНоменклатуру(ТоварИсточник, ТоварЗамены, ДатаС, ДатаПо) Экспорт КоличествоИзмененных = 0; Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | Заказ.Ссылка КАК Ссылка |ИЗ | Документ.Заказ КАК Заказ |ГДЕ | Заказ.Дата >= &ДатаС | И Заказ.Дата <= &ДатаПо | И НЕ Заказ.ПометкаУдаления»; Запрос.УстановитьПараметр(«ДатаС», ДатаС); Запрос.УстановитьПараметр(«ДатаПо», ДатаПо); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект(); БылаЗамена = Ложь; БылПроведен = ДокументОбъект.Проведен; Для Каждого СтрокаТовары Из ДокументОбъект.Товары Цикл Если СтрокаТовары.Товар = ТоварИсточник Тогда СтрокаТовары.Товар = ТоварЗамены; БылаЗамена = Истина; КонецЕсли; КонецЦикла; Если БылаЗамена Тогда Если БылПроведен Тогда ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); Иначе ДокументОбъект.Записать(РежимЗаписиДокумента.Запись); КонецЕсли; КоличествоИзмененных = КоличествоИзмененных + 1; КонецЕсли; КонецЦикла; Возврат КоличествоИзмененных; КонецФункции 
Расчёт комиссии менеджеров
Условие задачи:
Создай функцию РасчетКомиссииМенеджера(ТаблицаКомиссий, Процент, ДатаС, ДатаПо), которая находит документы «Заказ» в заданном интервале и вычисляет комиссию менеджера исходя из сумм в табличной части Товары
1) Смотрим только проведенные заказы
2) Сумма заказа — это сумма всех строк по реквизиту Сумма
3) Комиссия менеджера — сумма всех заказов менеджера (реквизит Автор) в периоде, умноженная на Процент.
Функция должна заполнить таблицу ТаблицаКомиссий, где должно быть три колонки: Менеджер (из реквизита Автор), СуммаЗаказов, Комиссия. Менеджер в таблице должен быть уникальным, один менеджер — одна строка.
Эталонное решение:
Функция РасчетКомиссииМенеджера(ТаблицаКомиссий, Процент, ДатаС, ДатаПо) Экспорт Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | Заказ.Автор КАК Менеджер, | СУММА(ЗаказТовары.Сумма) КАК СуммаЗаказов |ИЗ | Документ.Заказ КАК Заказ | ЛЕВОЕ СОЕДИНЕНИЕ Документ.Заказ.Товары КАК ЗаказТовары | ПО Заказ.Ссылка = ЗаказТовары.Ссылка |ГДЕ | Заказ.Проведен = ИСТИНА | И Заказ.Дата >= &ДатаС | И Заказ.Дата <= &ДатаПо |СГРУППИРОВАТЬ ПО | Заказ.Автор»; Запрос.УстановитьПараметр(«ДатаС», ДатаС); Запрос.УстановитьПараметр(«ДатаПо», ДатаПо); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл НоваяСтрока = ТаблицаКомиссий.Добавить(); НоваяСтрока.Менеджер = Выборка.Менеджер; НоваяСтрока.СуммаЗаказов = Выборка.СуммаЗаказов; НоваяСтрока.Комиссия = Выборка.СуммаЗаказов * Процент / 100; КонецЦикла; Возврат ТаблицаКомиссий; КонецФункции 
Методология оценки
Мы измеряем такие метрики:
-
Compile Rate: доля задач, в которых код компилируется и выполняется платформой;
-
Success Rate: доля задач, в которых решение прошло тесты.
Процесс тестирования:
-
Генерация решения: LLM получает описание задачи и контекст конфигурации, генерирует код.
-
Подстановка кода: сгенерированный код подставляется в обработку вместо эталонного решения.
-
Компиляция: платформа 1С пытается скомпилировать обработку.
-
Выполнение: при успешной компиляции запускается функция ЗапуститьРешение().
-
Проверка: функция ЗадачаРешена() верифицирует результат.
Весь процесс полностью автоматизирован: скрипт на Python выполняет все этапы — подстановку кода, выполнение и др. Скрипт генерации поддерживает LLM-провайдерыAnthropic (Claude) и OpenRouter (доступ к множеству моделей).
Весь код бенчмарка и инструкции по запуску доступны в репозитории.
Текущие метрики моделей:
|
Модель |
Compile Rate |
Success Rate |
|
Claude Sonnet 4.5 |
85% |
70% |
|
Gemini 3 Pro |
80% |
70% |
|
GPT-5 (high reasoning) |
40% |
30% |
Сильные стороны современных LLM:
-
хорошо понимают базовый синтаксис языка 1С;
-
делают простые запросы к данным (не более трёх JOIN-ов);
-
работают с коллекциями (массивами, структурами, ТаблицаЗначений) — знают все методы и свойства.
Типичные ошибки:
-
неправильно используют виртуальные таблицы регистров (путают, где какие параметры ставить);
-
ошибаются в синтаксисе языка запросов (GPT-5 забывает ставить | для разделения строк запроса);
-
используют неверные имена методов и свойств объектов метаданных;
-
путаются между серверным и клиентским контекстом.
Как вы можете помочь в развитии бенчмарка
Мы приглашаем разработчиков 1С к участию в расширении набора задач бенчмарка.
Процесс добавления:
-
Скачайте шаблон обработки из репозитория.
-
Создайте задачу по инструкции.
-
Проверьте решение локально.
-
Отправьте через форму или создайте Pull Request.
Требования к задачам:
-
задача должна быть решаемой, но не тривиальной (10–100 строк кода);
-
результат должен быть однозначно проверяемым;
-
задача должна отражать реальные сценарии разработки на 1С;
-
обработка не должна изменять данные демо-базы (или откатывать изменения).
Итоги
1C Code Bench — первый открытый бенчмарк для оценки способностей LLM генерировать код на 1С. Проект позволяет:
-
объективно сравнивать различные модели;
-
отслеживать прогресс ИИ-ассистентов для 1С;
-
выявлять области, требующие улучшения в обучении моделей.
Результаты показывают, что современные модели уже способны решать базовые задачи, но сложные сценарии с использованием специфичных возможностей платформы остаются вызовом.
Приходите к нам работать!
Ссылки
-
Сайт проекта
-
Репозиторий github
-
Репозиторий gitverse
-
ТГ проекта
-
Мой канал об LLM и 1С
Источник: habr.com

Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.