ПовелительОтчетов: упрощаем программное создание СКД
Разработка - Инструментарий разработчика
Бесплатные
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО
Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Введение
Схема компоновки данных (СКД) — мощный инструмент для создания отчетов в 1С, но её программное формирование требует значительных усилий. Чтобы создать простейший отчет с группировкой и парой полей, приходится писать десятки строк кода, помнить иерархию объектов и порядок инициализации.
Проблема
Стандартный подход к созданию СКД
Схема = Новый СхемаКомпоновкиДанных;
// Источник данных
ИсточникДанных = Схема.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных1";
ИсточникДанных.ТипИсточникаДанных = "Local";
// Набор данных
НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных1";
НаборДанных.Запрос = ТекстЗапроса;
НаборДанных.ИсточникДанных = "ИсточникДанных1";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
// Ресурс
ПолеИтога = Схема.ПоляИтога.Добавить();
ПолеИтога.ПутьКДанным = "Сумма";
ПолеИтога.Выражение = "СУММА(Сумма)";
// Настройки по умолчанию
Если Схема.НастройкиПоУмолчанию = Неопределено Тогда
Схема.НастройкиПоУмолчанию = Новый НастройкиКомпоновкиДанных;
КонецЕсли;
Настройки = Схема.НастройкиПоУмолчанию;
// Группировка
Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Контрагент");
ПолеГруппировки.Использование = Истина;
// Выбранные поля
ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Контрагент");
// ... и так далее
Проблемы такого подхода:
-
Много шаблонного кода
-
Легко ошибиться в иерархии объектов
-
Сложно читать и поддерживать
-
Нужно каждый раз вспоминать синтаксис
Решение: ПовелительОтчетов
ПовелительОтчетов — это общий модуль с набором процедур-обёрток, которые инкапсулируют рутинные операции. Схема передаётся первым параметром в каждый метод.
Результат: 6 строк вместо 30+.
Реализация
Структура общего модуля
Общий модуль ПовелительОтчетов (Сервер, Вызов сервера) содержит следующие группы методов:
-
Инициализация:
НоваяСхема(),ПолучитьНастройки() -
Наборы данных:
УстановитьЗапрос(),ДобавитьПолеНабора() -
Ресурсы:
ДобавитьРесурс(),ДобавитьРесурсы() -
Параметры:
ДобавитьПараметр(),ДобавитьПараметрыПериода() -
Структура:
ДобавитьГруппировку(),ДобавитьДетальныеЗаписи() -
Поля и отборы:
ДобавитьПоле(),ДобавитьОтбор(),ДобавитьСортировку() -
Вывод:
СформироватьТабличныйДокумент(),СформироватьТаблицуЗначений()
// Создаёт новую схему с базовыми настройками
Функция НоваяСхема() Экспорт
Схема = Новый СхемаКомпоновкиДанных;
ИсточникДанных = Схема.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных1";
ИсточникДанных.ТипИсточникаДанных = "Local";
Возврат Схема;
КонецФункции
// Устанавливает текст запроса для набора данных
Процедура УстановитьЗапрос(Схема, ИмяНабора, ТекстЗапроса, АвтоПоля = Истина) Экспорт
НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = ИмяНабора;
НаборДанных.Запрос = ТекстЗапроса;
НаборДанных.ИсточникДанных = "ИсточникДанных1";
НаборДанных.АвтоЗаполнениеДоступныхПолей = АвтоПоля;
КонецПроцедуры
// Добавляет ресурс
Процедура ДобавитьРесурс(Схема, ИмяПоля, Выражение = Неопределено) Экспорт
ПолеИтога = Схема.ПоляИтога.Добавить();
ПолеИтога.ПутьКДанным = ИмяПоля;
ПолеИтога.Выражение = ?(Выражение = Неопределено,
"СУММА(" + ИмяПоля + ")", Выражение);
КонецПроцедуры
// Добавляет группировку по полю
Функция ДобавитьГруппировку(Схема, ИмяПоля = "") Экспорт
Настройки = ПолучитьНастройки(Схема);
Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Если ЗначениеЗаполнено(ИмяПоля) Тогда
ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(
Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
ПолеГруппировки.Использование = Истина;
КонецЕсли;
Возврат Группировка;
КонецФункции
// Добавляет выбранное поле в группировку
Процедура ДобавитьПолеВГруппировку(Схема, ИмяГруппировки, ИмяПоля, Заголовок = "") Экспорт
Настройки = ПолучитьНастройки(Схема);
Группировка = НайтиГруппировку(Настройки, ИмяГруппировки);
Если Группировка = Неопределено Тогда
Возврат;
КонецЕсли;
ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(
Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
ВыбранноеПоле.Использование = Истина;
Если ЗначениеЗаполнено(Заголовок) Тогда
ВыбранноеПоле.Заголовок = Заголовок;
КонецЕсли;
КонецПроцедуры
Примеры использования
Функция ПолучитьСхемуОтчета()
ТекстЗапроса =
"ВЫБРАТЬ
| Продажи.Контрагент,
| Продажи.Номенклатура,
| СУММА(Продажи.Сумма) КАК Сумма,
| СУММА(Продажи.Количество) КАК Количество
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Продажи
|ГДЕ
| Продажи.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
|СГРУППИРОВАТЬ ПО
| Продажи.Контрагент,
| Продажи.Номенклатура";
Схема = СКДБилдер.НоваяСхема();
ПовелительОтчетов.УстановитьЗапрос(Схема, "Продажи", ТекстЗапроса);
ПовелительОтчетов.ДобавитьРесурс(Схема, "Сумма");
ПовелительОтчетов.ДобавитьРесурс(Схема, "Количество");
ПовелительОтчетов.ДобавитьПараметрыПериода(Схема);
ПовелительОтчетов.ДобавитьГруппировку(Схема, "Контрагент");
ПовелительОтчетов.ДобавитьПолеВГруппировку(Схема, "Контрагент", "Контрагент");
ПовелительОтчетов.ДобавитьПолеВГруппировку(Схема, "Контрагент", "Сумма");
Возврат Схема;
КонецФункции
Схема = ПовелительОтчетов.НоваяСхема();
ПовелительОтчетов.УстановитьЗапрос(Схема, "Данные", ТекстЗапроса);
ПовелительОтчетов.ДобавитьРесурс(Схема, "Сумма");
// Группировка по организации
ГруппировкаОрг = ПовелительОтчетов.ДобавитьГруппировку(Схема, "Организация");
ПовелительОтчетов.ДобавитьПолеВГруппировку(Схема, "Организация", "Организация");
// Вложенная группировка по контрагенту
ГруппировкаКонтр = ПовелительОтчетов.ДобавитьВложеннуюГруппировку(ГруппировкаОрг, "Контрагент");
ПовелительОтчетов.ДобавитьПолеВГруппировку(Схема, "Контрагент", "Контрагент");
ПовелительОтчетов.ДобавитьПолеВГруппировку(Схема, "Контрагент", "Сумма");
Схема = ПовелительОтчетов.НоваяСхема();
ПовелительОтчетов.УстановитьЗапрос(Схема, "Данные", ТекстЗапроса);
ПовелительОтчетов.ДобавитьДетальныеЗаписи(Схема);
ПовелительОтчетов.ДобавитьАвтоПоле(Схема);
ТаблицаРезультат = ПовелительОтчетов.СформироватьТаблицуЗначений(Схема);
Преимущества
-
Сокращение кода — в 3-4 раза меньше строк
-
Читаемость — структура отчёта видна сразу
-
Простота поддержки — легко добавить поле или группировку
-
Снижение порога входа — не нужно помнить всю иерархию объектов СКД
-
Универсальность — один общий модуль, работает в любой конфигурации
Ограничения
-
Не покрывает 100% возможностей СКД (сложные условия, вычисляемые поля)
-
Для специфических сценариев всё равно придётся обращаться к объектной модели напрямую
-
Требует понимания базовых принципов СКД
Заключение
ПовелительОтчетов— это не замена объектной модели СКД, а удобная обёртка для типовых задач. Он особенно полезен при:
-
Создании динамических отчётов
-
Разработке печатных форм с группировками
-
Быстром прототипировании в консоли запросов
-
Обучении джунов работе с СКД
Модуль можно легко расширить под свои нужды, добавив методы для таблиц, диаграмм или условного оформления.
Вступайте в нашу телеграмм-группу Инфостарт