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