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

1C Code Bench — бенчмарк для оценки способности LLM писать код на 1С

1C Code Bench — бенчмарк для оценки способности LLM писать код на 1С - 1

В эпоху бума больших языковых моделей (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-репозитория и должна самостоятельно найти нужные файлы, понять контекст и внести корректные изменения в кодовую базу. Такие бенчмарки значительно сложнее, так как требуют от модели навыков навигации по коду, понимания архитектуры и работы с несколькими файлами одновременно.

Зачем нужен бенчмарк для 1С?

Существующие бенчмарки для оценки кодогенерации (HumanEval, MBPP, CodeForces и др.) ориентированы на популярные языки программирования: Python, JavaScript, Java и так далее. Платформа 1С:Предприятие с её встроенным языком остаётся не у дел.

При этом 1С — самая популярная платформа для автоматизации бизнеса в России и СНГ. Разработчики 1С ежедневно решают задачи, которые потенциально можно автоматизировать с помощью LLM:

  • написание запросов к базе данных;

  • обработка табличных частей документов;

  • формирование движений по регистрам;

  • работа с формами и элементами управления;

  • написание отчётов и обработок;

  • интеграция с внешними системами.

1C Code Bench призван ответить на вопросы:

  • Какие задачи уже решают LLM, а в какие придётся потратить больше времени на исправления глюков?

  • Какие модели лучше?

Структура бенчмарка и задачи

Мы взяли конфигурацию «Демонстрационное приложение [6]», добавили в неё некоторые объекты в конфигурацию, добавили небольшое количество данных и получилась наша Демо-база [7].

Бенчмарк содержит 20 тестовых задач, разделённых на три уровня сложности:

  • базовый: основы языка, простые операции с данными;

  • средний: запросы, работа с документами и регистрами;

  • сложный: комплексные бизнес-сценарии.

Также задачи делятся на категории:

  • По типу контекста:

    • серверные задачи;

    • клиентские задачи;

  • По предметной области:

    • заполнение и изменение табличных частей;

    • работа со специфичными объектами 1С (ИнтернетПочтовоеСообщение, FTPСоединение и др.);

    • выборки с помощью языка запросов;

    • манипуляции с коллекциями (ТаблицаЗначений, Массив и др.);

    • работа с макетами и табличными документами;

    • операции с регистрами накопления и сведений.

Каждая задача представляет собой внешнюю обработку (.epf), содержащую:

  1. макет «Задача» — текстовое описание того, что нужно реализовать;

  2. функцию ЗапуститьРешение() — подготовку тестового окружения и вызов решения;

  3. функцию ЗадачаРешена() — автоматическую проверку корректности результата;

  4. эталонное решение — референсную реализацию, проходящую все тесты.

С точки зрения [8] LLM задача сводится к написанию одной функции. На входе — промпт с условием задачи и (если требуется) контекстом конфигурации. На выходе LLM должна сгенерировать функцию с требуемым именем и решением задачи.

Примеры задач

Заполнение табличной части остатками

Условие задачи:

Создай функцию ЗаполнитьТабличнуюЧастьОстатками(ДокументОбъект), которая заполняет табличную часть документа «Заказ» «Товары» остатками из регистра «ТоварныеЗапасы» для склада и даты, заданных в документе. Отбирать только товары с видом = Товар.

Эталонное решение:

    Функция ЗаполнитьТабличнуюЧастьОстатками(ДокументОбъект)      
        Запрос = Новый Запрос();      
        Запрос.Текст =      
        "ВЫБРАТЬ      
        |    Т.Товар КАК Товар,      
        |    Т.КоличествоОстаток КАК Количество      
        |ИЗ      
        |    РегистрНакопления.ТоварныеЗапасы.Остатки(&Дата, Склад = &Склад) КАК Т      
        |ГДЕ      
        |    Т.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)";      
          
        Запрос.УстановитьПараметр("Дата",  ДокументОбъект.Дата);      
        Запрос.УстановитьПараметр("Склад", ДокументОбъект.Склад);      
          
        Выборка = Запрос.Выполнить().Выбрать();      
        Пока Выборка.Следующий() Цикл      
            СтрокаТЧ = ДокументОбъект.Товары.Добавить();      
            ЗаполнитьЗначенияСвойств(СтрокаТЧ, Выборка);      
        КонецЦикла;      
    КонецФункции    

Замена номенклатуры в документах

Условие задачи:

Создай функцию ЗаменитьНоменклатуру(ТоварИсточник, ТоварЗамены, ДатаС, ДатаПо), которая находит все документы «Заказ» за указанный период и заменяет в них один товар на другой. Вернуть количество изменённых документов.

Эталонное решение:

 Функция ЗаменитьНоменклатуру(ТоварИсточник, ТоварЗамены, ДатаС, ДатаПо) Экспорт      
        КоличествоИзмененных = 0;      
          
        Запрос = Новый Запрос;      
        Запрос.Текст =      
            "ВЫБРАТЬ      
            |    Заказ.Ссылка КАК Ссылка      
            |ИЗ      
            |    Документ.Заказ КАК Заказ      
            |ГДЕ      
            |    Заказ.Дата >= &ДатаС      
            |    И Заказ.Дата <= &ДатаПо      
            |    И НЕ Заказ.ПометкаУдаления";      
          
        Запрос.УстановитьПараметр("ДатаС", ДатаС);      
        Запрос.УстановитьПараметр("ДатаПо", ДатаПо);      
          
        Выборка = Запрос.Выполнить().Выбрать();      
          
        Пока Выборка.Следующий() Цикл      
            ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();      
            БылаЗамена = Ложь;      
            БылПроведен = ДокументОбъект.Проведен;      
          
            Для Каждого СтрокаТовары Из ДокументОбъект.Товары Цикл      
                Если СтрокаТовары.Товар = ТоварИсточник Тогда      
                    СтрокаТовары.Товар = ТоварЗамены;      
                    БылаЗамена = Истина;      
                КонецЕсли;      
            КонецЦикла;      
          
            Если БылаЗамена Тогда      
                Если БылПроведен Тогда      
                    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);      
                Иначе      
                    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);      
                КонецЕсли;      
                КоличествоИзмененных = КоличествоИзмененных + 1;      
            КонецЕсли;      
        КонецЦикла;      
          
        Возврат КоличествоИзмененных;      
    КонецФункции 

Расчёт комиссии менеджеров

Условие задачи: 

Создай функцию РасчетКомиссииМенеджера(ТаблицаКомиссий, Процент, ДатаС, ДатаПо), которая находит документы «Заказ» в заданном интервале и вычисляет комиссию менеджера исходя из сумм в табличной части Товары
1) Смотрим только проведенные заказы
2) Сумма заказа — это сумма всех строк по реквизиту Сумма
3) Комиссия менеджера — сумма всех заказов менеджера (реквизит Автор) в периоде, умноженная на Процент.
Функция должна заполнить таблицу ТаблицаКомиссий, где должно быть три колонки: Менеджер (из реквизита Автор), СуммаЗаказов, Комиссия. Менеджер в таблице должен быть уникальным, один менеджер — одна строка.

Эталонное решение: 

    Функция РасчетКомиссииМенеджера(ТаблицаКомиссий, Процент, ДатаС, ДатаПо) Экспорт      
        Запрос = Новый Запрос;      
        Запрос.Текст =      
        "ВЫБРАТЬ      
        |    Заказ.Автор КАК Менеджер,      
        |    СУММА(ЗаказТовары.Сумма) КАК СуммаЗаказов      
        |ИЗ      
        |    Документ.Заказ КАК Заказ      
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Заказ.Товары КАК ЗаказТовары      
        |        ПО Заказ.Ссылка = ЗаказТовары.Ссылка      
        |ГДЕ      
        |    Заказ.Проведен = ИСТИНА      
        |    И Заказ.Дата >= &ДатаС      
        |    И Заказ.Дата <= &ДатаПо      
        |СГРУППИРОВАТЬ ПО      
        |    Заказ.Автор";      
          
        Запрос.УстановитьПараметр("ДатаС", ДатаС);      
        Запрос.УстановитьПараметр("ДатаПо", ДатаПо);      
          
        Выборка = Запрос.Выполнить().Выбрать();      
          
        Пока Выборка.Следующий() Цикл      
            НоваяСтрока = ТаблицаКомиссий.Добавить();      
            НоваяСтрока.Менеджер = Выборка.Менеджер;      
            НоваяСтрока.СуммаЗаказов = Выборка.СуммаЗаказов;      
            НоваяСтрока.Комиссия = Выборка.СуммаЗаказов * Процент / 100;      
        КонецЦикла;      
          
        Возврат ТаблицаКомиссий;      
    КонецФункции    

Методология оценки

Мы измеряем такие метрики:

  • Compile Rate: доля задач, в которых код компилируется и выполняется платформой;

  • Success Rate: доля задач, в которых решение прошло тесты.

Процесс тестирования:

  1. Генерация решения: LLM получает описание задачи и контекст конфигурации, генерирует код.

  2. Подстановка кода: сгенерированный код подставляется в обработку вместо эталонного решения.

  3. Компиляция: платформа 1С пытается скомпилировать обработку.

  4. Выполнение: при успешной компиляции запускается функция ЗапуститьРешение().

  5. Проверка: функция ЗадачаРешена() верифицирует результат.

Весь процесс полностью автоматизирован: скрипт на 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С к участию в расширении набора задач бенчмарка.

Процесс добавления:

  1. Скачайте шаблон обработки из репозитория.

  2. Создайте задачу по инструкции [12].

  3. Проверьте решение локально.

  4. Отправьте через форму [13] или создайте Pull Request.

Требования к задачам:

  • задача должна быть решаемой, но не тривиальной (10–100 строк кода);

  • результат должен быть однозначно проверяемым;

  • задача должна отражать реальные сценарии разработки на 1С;

  • обработка не должна изменять данные демо-базы (или откатывать изменения).

Итоги

1C Code Bench — первый открытый бенчмарк для оценки способностей LLM генерировать код на 1С. Проект позволяет:

  • объективно сравнивать различные модели;

  • отслеживать прогресс ИИ-ассистентов для 1С;

  • выявлять области, требующие улучшения в обучении [14] моделей.

Результаты показывают, что современные модели уже способны решать базовые задачи, но сложные сценарии с использованием специфичных возможностей платформы остаются вызовом.

Ссылки

Автор: 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

www.BrainTools.ru

Rambler's Top100