Бенчмарк для оценки навыков программирования на 1С:Предприятие

Комплексная система тестирования способностей ИИ-моделей решать практические задачи разработки на платформе 1С:Предприятие

20 Тестовых задач
3 Категории сложности
2 Метрики оценки

О проекте

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

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

Среда выполнения задач: Демонстрационная конфигурация "Управляемое приложение"

🎯 Практичность

Задачи основаны на реальных кейсах разработки

📊 Многоуровневость

От базовых операций до сложной архитектуры

🔍 Автоматизация

Полностью автоматизированная проверка решений

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

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

Средний

Задача:

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

Функция ЗаполнитьТабличнуюЧастьОстатками(ДокументОбъект)
    // Ваш код здесь
КонецФункции

Решение:

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

    Запрос.УстановитьПараметр("Дата",  ДокументОбъект.Дата);
    Запрос.УстановитьПараметр("Склад", ДокументОбъект.Склад);

    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        СтрокаТЧ = ДокументОбъект.Товары.Добавить();
        ЗаполнитьЗначенияСвойств(СтрокаТЧ, Выборка);
    КонецЦикла;
КонецФункции

Работа с табличными документами

Сложный

Задача:

Создай функцию ЗаполнитьТабличныйДокумент(ТабДокумент, Макет, Дата) которая выводит в табличный документ задолженность по контрагентам из регистра Взаиморасчеты на дату. В макете есть секции Шапка и Строка, в секции строка есть параметры "Контрагент" и "Задолженность"

Функция ЗаполнитьТабличныйДокумент(ТабДокумент, Макет, Дата)
    // Ваш код здесь
КонецФункции

Решение:

Функция ЗаполнитьТабличныйДокумент(ТабДокумент, Макет, Дата) Экспорт
    ДатаКон = КонецДня(Дата);

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Остатки.Контрагент КАК Контрагент,
    |    СУММА(Остатки.СуммаОстаток) КАК Задолженность
    |ИЗ
    |    РегистрНакопления.Взаиморасчеты.Остатки(&ДатаКон, ) КАК Остатки
    |СГРУППИРОВАТЬ ПО
    |    Остатки.Контрагент
    |ИМЕЮЩИЕ
    |    СУММА(Остатки.СуммаОстаток) <> 0
    |УПОРЯДОЧИТЬ ПО
    |    Контрагент";

    Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();

    ТабДокумент.Очистить();

    Если Макет <> Неопределено Тогда
        ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
        Если ОбластьШапка <> Неопределено Тогда
            ТабДокумент.Вывести(ОбластьШапка);
        КонецЕсли;
    КонецЕсли;

    Пока Выборка.Следующий() Цикл
        ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
        ОбластьСтрока.Параметры.Контрагент = Выборка.Контрагент;
        ОбластьСтрока.Параметры.Задолженность = Выборка.Задолженность;
        ТабДокумент.Вывести(ОбластьСтрока);
    КонецЦикла;

    Возврат ТабДокумент;
КонецФункции

Работа с регистрами сведений

Средний

Задача:

Создай функцию УдалитьПоследнююЗапись(Валюта) которая удаляет последнюю по времени запись регистра сведений КурсыВалют с измерением Валюта = Валюта

Функция УдалитьПоследнююЗапись(Валюта)
    // Ваш код здесь
КонецФункции

Решение:

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

    Рез = Запрос.Выполнить();
    Выборка = Рез.Выбрать();

    Если Не Выборка.Следующий() Тогда
        Возврат Ложь; // записей по валюте нет
    КонецЕсли;

    // Удаляем именно эту запись по ключам (Валюта + Период)
    Менеджер = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
    Менеджер.Валюта = Валюта;
    Менеджер.Период = Выборка.Период;
    Менеджер.Прочитать();

    Если Менеджер.Выбран() Тогда
        Менеджер.Удалить();
    КонецЕсли;
КонецФункции

Лидерборд

Ранг Модель Компиляция Корректность
1 Claude Sonnet 4.5 85% 70%
2 Gemini 3 pro 80% 70%
3 GPT-5 reasoning_effort: high 40% 30%

Структура датасета

Категории задач

Основы языка

  • Типы данных и переменные
  • Циклы и условия
  • Функции и процедуры

Работа с данными

  • Справочники и документы
  • Регистры накопления
  • Запросы к данным

Бизнес-логика

  • Обработчики событий
  • Проведение документов
  • Расчеты и алгоритмы

Интерфейсы

  • Формы и элементы управления
  • Команды и обработчики
  • Табличные части

Метрики оценки

Компиляция

Код должен компилироваться и выполняться без ошибок. Считается как процент успешных кейсов к общему количеству.

Корректность

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