ПовелительОтчетов: упрощаем программное создание СКД

05.10.26

Разработка - Инструментарий разработчика

В этой статье представлен ПовелительОтчетов — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

Бесплатные

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО

Наименование Скачано Бесплатно
СКДБилдер: упрощаем программное создание СКД
.bsl 60,16Kb
456 Скачать бесплатно

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Введение

Схема компоновки данных (СКД) — мощный инструмент для создания отчетов в 1С, но её программное формирование требует значительных усилий. Чтобы создать простейший отчет с группировкой и парой полей, приходится писать десятки строк кода, помнить иерархию объектов и порядок инициализации.

 

Проблема

Стандартный подход к созданию СКД

 
Типичный код для программного создания СКД выглядит так:
Схема = Новый СхемаКомпоновкиДанных;

// Источник данных
ИсточникДанных = Схема.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных1";
ИсточникДанных.ТипИсточникаДанных = "Local";

// Набор данных
НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных1";
НаборДанных.Запрос = ТекстЗапроса;
НаборДанных.ИсточникДанных = "ИсточникДанных1";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;

// Ресурс
ПолеИтога = Схема.ПоляИтога.Добавить();
ПолеИтога.ПутьКДанным = "Сумма";
ПолеИтога.Выражение = "СУММА(Сумма)";

// Настройки по умолчанию
Если Схема.НастройкиПоУмолчанию = Неопределено Тогда
    Схема.НастройкиПоУмолчанию = Новый НастройкиКомпоновкиДанных;
КонецЕсли;

Настройки = Схема.НастройкиПоУмолчанию;

// Группировка
Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Контрагент");
ПолеГруппировки.Использование = Истина;

// Выбранные поля
ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Контрагент");
// ... и так далее

 

 

Проблемы такого подхода:

  • Много шаблонного кода

  • Легко ошибиться в иерархии объектов

  • Сложно читать и поддерживать

  • Нужно каждый раз вспоминать синтаксис


Решение: ПовелительОтчетов

ПовелительОтчетов — это общий модуль с набором процедур-обёрток, которые инкапсулируют рутинные операции. Схема передаётся первым параметром в каждый метод.

 
Тот же код с ПовелителемОтчетов:

Результат: 6 строк вместо 30+.


Реализация

Структура общего модуля

Общий модуль ПовелительОтчетов (Сервер, Вызов сервера) содержит следующие группы методов:

  1. Инициализация: НоваяСхема(), ПолучитьНастройки()

  2. Наборы данных: УстановитьЗапрос(), ДобавитьПолеНабора()

  3. Ресурсы: ДобавитьРесурс(), ДобавитьРесурсы()

  4. Параметры: ДобавитьПараметр(), ДобавитьПараметрыПериода()

  5. Структура: ДобавитьГруппировку(), ДобавитьДетальныеЗаписи()

  6. Поля и отборы: ДобавитьПоле(), ДобавитьОтбор(), ДобавитьСортировку()

  7. Вывод: СформироватьТабличныйДокумент(), СформироватьТаблицуЗначений()

 
Пример кода модуля (фрагмент):

 

// Создаёт новую схему с базовыми настройками
Функция НоваяСхема() Экспорт
    
    Схема = Новый СхемаКомпоновкиДанных;
    
    ИсточникДанных = Схема.ИсточникиДанных.Добавить();
    ИсточникДанных.Имя = "ИсточникДанных1";
    ИсточникДанных.ТипИсточникаДанных = "Local";
    
    Возврат Схема;
    
КонецФункции

// Устанавливает текст запроса для набора данных
Процедура УстановитьЗапрос(Схема, ИмяНабора, ТекстЗапроса, АвтоПоля = Истина) Экспорт
    
    НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НаборДанных.Имя = ИмяНабора;
    НаборДанных.Запрос = ТекстЗапроса;
    НаборДанных.ИсточникДанных = "ИсточникДанных1";
    НаборДанных.АвтоЗаполнениеДоступныхПолей = АвтоПоля;
    
КонецПроцедуры

// Добавляет ресурс
Процедура ДобавитьРесурс(Схема, ИмяПоля, Выражение = Неопределено) Экспорт
    
    ПолеИтога = Схема.ПоляИтога.Добавить();
    ПолеИтога.ПутьКДанным = ИмяПоля;
    ПолеИтога.Выражение = ?(Выражение = Неопределено, 
        "СУММА(" + ИмяПоля + ")", Выражение);
    
КонецПроцедуры

// Добавляет группировку по полю
Функция ДобавитьГруппировку(Схема, ИмяПоля = "") Экспорт
    
    Настройки = ПолучитьНастройки(Схема);
    
    Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    
    Если ЗначениеЗаполнено(ИмяПоля) Тогда
        ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(
            Тип("ПолеГруппировкиКомпоновкиДанных"));
        ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
        ПолеГруппировки.Использование = Истина;
    КонецЕсли;
    
    Возврат Группировка;
    
КонецФункции

// Добавляет выбранное поле в группировку
Процедура ДобавитьПолеВГруппировку(Схема, ИмяГруппировки, ИмяПоля, Заголовок = "") Экспорт
    
    Настройки = ПолучитьНастройки(Схема);
    Группировка = НайтиГруппировку(Настройки, ИмяГруппировки);
    
    Если Группировка = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(
        Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ВыбранноеПоле.Использование = Истина;
    
    Если ЗначениеЗаполнено(Заголовок) Тогда
        ВыбранноеПоле.Заголовок = Заголовок;
    КонецЕсли;
    
КонецПроцедуры

 

 

Примеры использования

 

 
Пример 1: Простой отчёт по продажам 

 

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

 

 
Пример 2: Отчёт с вложенными группировками

 

Схема = ПовелительОтчетов.НоваяСхема();
ПовелительОтчетов.УстановитьЗапрос(Схема, "Данные", ТекстЗапроса);
ПовелительОтчетов.ДобавитьРесурс(Схема, "Сумма");

// Группировка по организации
ГруппировкаОрг = ПовелительОтчетов.ДобавитьГруппировку(Схема, "Организация");
ПовелительОтчетов.ДобавитьПолеВГруппировку(Схема, "Организация", "Организация");

// Вложенная группировка по контрагенту
ГруппировкаКонтр = ПовелительОтчетов.ДобавитьВложеннуюГруппировку(ГруппировкаОрг, "Контрагент");
ПовелительОтчетов.ДобавитьПолеВГруппировку(Схема, "Контрагент", "Контрагент");
ПовелительОтчетов.ДобавитьПолеВГруппировку(Схема, "Контрагент", "Сумма");

 

 
Пример 3: Быстрый вывод в консоль запросов

 

Схема = ПовелительОтчетов.НоваяСхема();
ПовелительОтчетов.УстановитьЗапрос(Схема, "Данные", ТекстЗапроса);
ПовелительОтчетов.ДобавитьДетальныеЗаписи(Схема);
ПовелительОтчетов.ДобавитьАвтоПоле(Схема);

ТаблицаРезультат = ПовелительОтчетов.СформироватьТаблицуЗначений(Схема);

 

 

Преимущества

  1. Сокращение кода — в 3-4 раза меньше строк

  2. Читаемость — структура отчёта видна сразу

  3. Простота поддержки — легко добавить поле или группировку

  4. Снижение порога входа — не нужно помнить всю иерархию объектов СКД

  5. Универсальность — один общий модуль, работает в любой конфигурации


Ограничения

  • Не покрывает 100% возможностей СКД (сложные условия, вычисляемые поля)

  • Для специфических сценариев всё равно придётся обращаться к объектной модели напрямую

  • Требует понимания базовых принципов СКД


Заключение

ПовелительОтчетов— это не замена объектной модели СКД, а удобная обёртка для типовых задач. Он особенно полезен при:

  • Создании динамических отчётов

  • Разработке печатных форм с группировками

  • Быстром прототипировании в консоли запросов

  • Обучении джунов работе с СКД

Модуль можно легко расширить под свои нужды, добавив методы для таблиц, диаграмм или условного оформления.

Вступайте в нашу телеграмм-группу Инфостарт

общий модуль

См. также

Разработка Инструментарий разработчика Групповая разработка (Git, хранилище) Разработчик Платные (руб)

Практический курс по работе с AI-агентами для разработчиков 1С уровня middle и senior, а также тимлидов команд: от постановки задач и передачи контекста до создания расширений, интеграций, MCP-инструментов, тестов и проверки готового решения.

50000 руб.

10.09.2026    13224    104    0    

78

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Разработчик Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы, интерфейс 8.5. Может выполнять свертку одновременно в несколько потоков, а также без непосредственного участия пользователя. Решение в Реестре отечественного ПО.

24900 руб.

20.08.2024    83157    431    171    

361

Инструментарий разработчика Роли и права Запросы СКД Разработчик Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3 и 8.5: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    285464    1606    423    

1219

Инструментарий разработчика Разработка Администрирование веб-серверов Системный администратор Разработчик Аналитик Руководитель проекта 1С 8.3 Платные (руб)

Analyzer 1C сводит выгрузку 1С — основную конфигурацию и все расширения — в единый граф знаний. Любой запрос по связям за доли секунды, с пометками «Доб.» / «Заимств.» / «Переопределено». Новое в 2.0 — обновление поставки: сравнение и объединение версий деревом «как в Конфигураторе» с выгрузкой плана решений; поиск конфликтов из-за перехватов расширений и висячих ссылок; загрузка из бинарных .cf/.cfe; циклические зависимости. Плюс анализ влияния, запросы BSL, роли и RLS, граф вызовов. Минута на развёртывание через Docker без необходимости подключения к Интернет. Любая 1С:Предприятие 8.3+.

14000 руб.

17.04.2026    16667    63    62    

73

Пакетная печать Печатные формы Инструментарий разработчика Разработчик 1С:Предприятие 8 Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм. Обновление версии от 21.04.26

22570 руб.

06.10.2023    44110    122    54    

135

Инструментарий разработчика Нейросети Платные (руб)

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

15250 руб.

25.08.2025    76706    147    41    

154

Разработка Инструментарий разработчика Разработчик Руководитель проекта 1С 8.3 Платные (руб)

Pilot 1C превращает задачу, поставленную обычными словами, в техническое задание, код на встроенном языке и сценарии проверки. Прежде чем что-то предложить, он сверяется с устройством вашей конфигурации через граф Analyzer 1C: существует ли объект, из чего он состоит, кто его вызывает, какие роли дают права. Чего найти не удалось – спрашивает, а не выдумывает. Готовый код проходит более полутора сотен проверок по справочнику языка и стандартам разработки, который приезжает вместе с продуктом. Модель – ваша: любой сервер, совместимый с программным интерфейсом OpenAI, в том числе локальный. Правки в конфигурацию Pilot не вносит – их применяет разработчик.

18300 руб.

11.09.2026    3656    5    0    

10

Инструменты администратора БД Инструментарий разработчика Роли и права Разработчик 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

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

17000 руб.

10.11.2023    28689    103    46    

107
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. GarriSoft 801 29.01.26 10:20 Сейчас в теме
Коллега, выглядит реально круто!
Скачал, обязательно попробую.
Спасибо!
shapa_pro; +1 – Ответить
2. dsdred 4355 29.01.26 10:21 Сейчас в теме
Попробую на своих примерах. Отпишусь.
shapa_pro; +1 – Ответить
3. tormozit 7393 29.01.26 10:49 Сейчас в теме
Имя модуля лучше сменить на "ПостроительСхемы" или "ПостроительСКД".
o.nikolaev; obemgyorik; alexandr_yang; Dach; shapa_pro; +5 – Ответить
4. shapa_pro 85 29.01.26 10:56 Сейчас в теме
(3) Можно и поменять! Но есть ПостроительОтчета и думаю будет неудобно искать по контекстной подсказке, поэтому что-то рандомно-уникальное.
5. alexandr_yang 11 29.01.26 11:47 Сейчас в теме
Общий модуль можно заменить на обработку и сделать флюент-интерфейс. Это позволит не передавать в каждый метод схему.

Результат = Обработки.СКДБилдер.НоваяСхема()
    .УстановитьЗапрос("Данные", ТекстЗапроса)
    .ДобавитьДетальныеЗаписи()
    .ДобавитьАвтоПоле()
    .СформироватьТаблицуЗначений();
ardn; starik-2005; bestuzheff; shapa_pro; pavlov_dv; +5 – Ответить
6. shapa_pro 85 29.01.26 11:56 Сейчас в теме
(5) А ты абсолютно прав и наработки уже есть, это следующая итерация, если мне не станет лень))
пока накидываем примеры для тестов
Прикрепленные файлы:
starik-2005; bestuzheff; +2 – Ответить
19. evgeniti 3 29.01.26 19:17 Сейчас в теме
(5) да, ждем такое. очень лень свое доделывать
Прикрепленные файлы:
22. tormozit 7393 30.01.26 00:16 Сейчас в теме
(5) Без текучего интерфейса обработка тоже будет работать прекрасно и даже сохранит возможность возвращать из каждой функции созданный ею дочерний объект для редких случаев особой донастройки.
Построитель = Обработки.ПостроительСхемы.Создать();
Запрос = Построитель.Добавить(Запрос);
Ресурс = Построитель.ДобавитьРесурс("Сумма");
Схема = Построитель.Схема;
mvxyz; unichkin; +2 – Ответить
7. Dach 440 29.01.26 11:57 Сейчас в теме
(0) Модуль полезный, за выкладку на гитхаб - отдельный плюс. Название тоже предлагаю сменить, например "МастерКомпоновки" или "МастерСКД" или "МастерНадСКД" (в духе Игры Престолов)
shapa_pro; +1 – Ответить
9. ixijixi 2177 29.01.26 12:07 Сейчас в теме
(7) Предлагаю ПовелительОтчетов!
Arte_; SergMuravev; ubnkfl; dsdred; bulpi; SerVer1C; 0x00; shapa_pro; top_1c; +9 – Ответить
20. RustIG 1990 29.01.26 20:59 Сейчас в теме
31. shapa_pro 85 05.10.26 11:58 Сейчас в теме
(9) Самый заплюсованный вариант, поправил в статье :)
8. SerVer1C 1146 29.01.26 12:01 Сейчас в теме
Отлично!
Побольше бы подобных публикаций на портале!
sashapere; shapa_pro; starik-2005; +3 – Ответить
10. bestuzheff 685 29.01.26 15:01 Сейчас в теме
Для форм есть "Накидка", а это надо переименовать в "Шапка"!
11. JohnyDeath 302 29.01.26 15:19 Сейчас в теме
Выглядит красиво.
Предложение: методы добавления типа "ДобавитьПолеВГруппировку", "ДобавитьРесурс" лучше все-таки делать функциями, которые возвращают то, что они добавляют. Вдруг, например, мне будет нужна другая формула в Ресурсе
shapa_pro; ubnkfl; tormozit; ixijixi; +4 – Ответить
14. shapa_pro 85 29.01.26 15:57 Сейчас в теме
(11) Можно много что сделать, форкайте, переписывайте или шлите предложения на гх :) Я как основатель вайб-кодинда и вайб-врайтинга на этом сайте, возможно когда-то подгружу все ваши пожелания в ИИ и выпущу новую версию :)
16. JohnyDeath 302 29.01.26 16:24 Сейчас в теме
(14) Если речь про этот модуль на гитхабе: https://github.com/ShapaPro/DCSBuilder/blob/main/СКДБилдер.bsl
то там совсем не то, что описано в статье. Программный интерфейс точно не такой.
Где-то вы перевайбили )
shapa_pro; +1 – Ответить
17. shapa_pro 85 29.01.26 16:48 Сейчас в теме
(16) Возможно пока писалась статья и согласовывалась код уже изменился, проект в альфе и меняется динамически.
18. shapa_pro 85 29.01.26 16:49 Сейчас в теме
(16) Плюс изначально разрабатывалась две ветки флюент и обычная. Флюент не доросла до альфы, поэтому пока запостил обычную, но есть вероятность, что взял имена функций из флюент.
12. starik-2005 3309 29.01.26 15:44 Сейчас в теме
Нехватает флюент-стайл.
13. shapa_pro 85 29.01.26 15:54 Сейчас в теме
(12) ну это первая альфа, посмотрим, что будет дальше
15. starik-2005 3309 29.01.26 16:02 Сейчас в теме
(13) У нас на каком-то проекте юзается типа такой штуки: https://infostart.ru/1c/tools/2303678/
21. RustIG 1990 29.01.26 21:25 Сейчас в теме
великолепно! тренд будущего десятилетия - упрощать все, что усложнили в текущем десятилетии...
shapa_pro; t278; +2 – Ответить
23. Viktor_Ermakov 419 30.01.26 13:01 Сейчас в теме
оказывается в 23 году уже выкладывали что то подобное https://infostart.ru/1c/tools/1973473/ и у меня коллега говорит активно использует, все работает без ошибок.
shapa_pro; +1 – Ответить
24. shapa_pro 85 30.01.26 13:06 Сейчас в теме
(23) о. еще и на флюенте, круто, а я не нашел, поэтому напряг искуственный мозг на создание))
25. korvintorson 88 20.02.26 21:12 Сейчас в теме
Тут для запросов решение подъехало: https://infostart.ru/1c/tools/2598405/
26. alexsergeevatinfostart 27.04.26 10:59 Сейчас в теме
Подскажите, а какими инструментами вы вайбкодите на 1С?
27. shapa_pro 85 28.04.26 08:47 Сейчас в теме
(26) конкретно этот инструмент просто в чате perplexity с моделью Claude sonnet.

А в целом агенты таких моделей как Claude, gemini, chatGpt хорошо пишут на 1С
28. DVS67 02.10.26 14:48 Сейчас в теме
Добрый день.

Формат файла СКДБилдера - "Bsl".

Как подразумевается с ним работать? В нотпаде открывается, конечно, как код. Логика в том, чтоб к себе в конфу этот код скопировать и использовать?
29. shapa_pro 85 05.10.26 11:51 Сейчас в теме
(28)
Добрый день.

Формат файла СКДБилдера - "Bsl".

Как подразумевается с ним работать? В нотпаде открывается, конечно, как код. Логика в том, чтоб к себе в конфу этот код скопировать и использовать?


Да копируете код в общий модуль и вызываете.
30. DVS67 05.10.26 11:55 Сейчас в теме
(29) Благодарю за ответ.
Для отправки сообщения требуется регистрация/авторизация