Отчет на СКД в 1С 8.3 почти целиком собирается настройками схемы в конфигураторе. Разберем, как сделать отчет в 1С на СКД на одном сквозном примере — «Продажи по менеджерам и клиентам» на регистре ВыручкаИСебестоимостьПродаж из УТ 11: от пустого объекта до таблицы с итогами, периодом, быстрыми отборами и подсветкой. Затем сформируем тот же отчет из кода и добавим обработчик ПриКомпоновкеРезультата. Устройство схемы описано в статье о СКД, другие способы получить отчет — в обзоре как сделать отчет в 1С.
| Уровень | Что выводится |
|---|---|
| Менеджер | итоги по всем его клиентам |
| Клиент | итоги клиента, крупные клиенты сверху |
| Номенклатура | количество, выручка и средняя цена |
| Общий итог | сумма по всем менеджерам |
Над таблицей — период и отборы по менеджеру и клиенту, строки с отрицательной выручкой красные. Запрос шага 2 написан для УТ 11 и КА 2.5, в других конфигурациях меняется только он.
В дереве конфигурации щелкните правой кнопкой по ветке «Отчеты» → «Добавить». Имя — ПродажиПоМенеджерамИКлиентам, синоним — «Продажи по менеджерам и клиентам», он станет заголовком окна. На вкладке «Основные» нажмите кнопку открытия у свойства «Основная схема компоновки данных»: конструктор макета предложит тип «Схема компоновки данных» и имя ОсновнаяСхемаКомпоновкиДанных. Нажмите «Готово» — откроется пустой редактор схемы.
Если типовую конфигурацию менять нельзя, создайте отчет в расширении — шаги те же, права выдаются ролью расширения; для разовой задачи хватит внешнего отчета.
На вкладке «Наборы данных» нажмите «Добавить» → «Добавить набор данных - запрос» и вставьте текст ниже. Проверить выборку заранее удобно в консоли запросов.
// Набор данных «НаборДанных1». УТ 11, КА 2.5: регистр «Выручка и себестоимость продаж»
ВЫБРАТЬ
Продажи.Менеджер КАК Менеджер,
Продажи.АналитикаУчетаПоПартнерам.Партнер КАК Клиент,
Продажи.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
Продажи.КоличествоОборот КАК Количество,
Продажи.СуммаВыручкиОборот КАК Выручка
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
Флажок «Автозаполнение» оставьте включенным: поля набора и параметры виртуальной таблицы схема создаст сама. Группировать и суммировать в запросе не нужно — это работа компоновки. Клиент и номенклатура берутся через ключи аналитики — измерения АналитикаУчетаПоПартнерам и АналитикаУчетаНоменклатуры. Возвраты регистр хранит с минусом, так что выручка сразу за их вычетом. Заголовки и формат полей задаются в верхней таблице набора, подробнее — в статье о полях СКД.
На вкладке «Ресурсы» выделите слева Количество и Выручка и перенесите их кнопкой «>». Выражения Сумма(Количество) и Сумма(Выручка) подставятся сами. Колонку «Рассчитывать по...» оставьте пустой — итоги посчитаются во всех группировках и в общем итоге. Поле, не добавленное в ресурсы, в строках группировок остается пустым.
На вкладке «Параметры» уже есть НачалоПериода и КонецПериода. Добавьте параметр Период и выразите через него обе даты:
| Параметр | Тип | Значение или выражение | Ограничение доступности |
|---|---|---|---|
| Период | Стандартный период | значение «Этот месяц» | нет |
| НачалоПериода | Дата, состав «Дата и время» | выражение &Период.ДатаНачала | да |
| КонецПериода | Дата, состав «Дата и время» | выражение &Период.ДатаОкончания | да |
«Ограничение доступности» прячет служебные даты, и пользователь выбирает только период. Остальные свойства параметров — в статье о параметрах СКД.
На вкладке «Вычисляемые поля» нажмите «Добавить»: путь к данным СредняяЦена, заголовок «Средняя цена», в колонке «Оформление» — два знака после запятой. Выражение поля считается в детальных строках, а в группировках цену дает ресурс, поэтому добавьте СредняяЦена и на вкладку «Ресурсы»:
| Где | Выражение |
|---|---|
| Вычисляемое поле | ВЫБОР КОГДА Количество = 0 ТОГДА 0 ИНАЧЕ Выручка / Количество КОНЕЦ |
| Ресурс, «Рассчитывать по...»: Номенклатура | ВЫБОР КОГДА Сумма(Количество) = 0 ТОГДА 0 ИНАЧЕ Сумма(Выручка) / Сумма(Количество) КОНЕЦ |
«Рассчитывать по» здесь по делу: средняя цена по менеджеру, у которого сложены штуки и килограммы разных товаров, бессмысленна, и в строках менеджера и клиента ячейка останется пустой.
На вкладке «Настройки» щелкните правой кнопкой по корню «Отчет» → «Новая группировка», поле Менеджер. Внутри нее добавьте группировку Клиент, в нее — Номенклатура. У корня на нижней вкладке «Выбранные поля» отметьте Количество, Выручка и СредняяЦена, иначе колонок ресурсов не будет. У группировки «Клиент» на вкладке «Порядок» задайте Выручка по убыванию.
Детальные записи (группировка без полей) выводят строки запроса как есть и здесь дали бы дубли: у пары «клиент — товар» бывает несколько ключей аналитики — другой договор, склад или серия. Группировка по полю Номенклатура сворачивает их в одну строку. Про типы группировок — в статье о группировках СКД.
Выделите корень «Отчет», нижняя вкладка «Условное оформление» → «Добавить». В колонке «Условие» задайте Выручка «Меньше» 0, в колонке «Оформление» — красный цвет текста. Если «Оформляемые поля» оставить пустыми, покрасится вся строка, если указать Выручка — одна ячейка. Красная строка значит, что за период вернули больше, чем продали.
На нижней вкладке «Отбор» добавьте Менеджер и Клиент с видом сравнения «В списке» и снимите флажки: пока значения не выбраны, отбор не действует. Для каждой строки нажмите «Свойства элемента пользовательских настроек», включите «Включать в пользовательские настройки» и режим «Быстрый доступ». То же — для параметра Период на вкладке «Параметры»; отметьте у него флажок, иначе даты останутся пустыми. Три поля появятся над результатом отчета, подробнее — в статье о настройке отчета.
Все, что задано на вкладке «Настройки», хранится в варианте «Основной», созданном вместе со схемой. Задайте ему представление «Продажи по менеджерам» — это название увидит пользователь. Если добавить второй вариант, при первом открытии отчет возьмет первый в списке; его же код получает как НастройкиПоУмолчанию схемы. Сохранение и сброс вариантов — в статье о вариантах отчета.
Нажмите F5 и согласитесь обновить конфигурацию базы данных. Откройте «Все функции → Отчеты → Продажи по менеджерам и клиентам» (команда «Все функции» включается в «Главное меню → Сервис → Параметры») и нажмите «Сформировать». Проверьте:
Для пользователей включите отчет в подсистему раздела и дайте права «Использование» и «Просмотр» в роли.
Без формы отчет нужен в рассылке, регламентном задании или по кнопке в документе. Функция модуля менеджера берет схему и вариант по умолчанию, подставляет период и менеджера и проводит данные по цепочке «компоновщик макета → процессор компоновки → процессор вывода». Общие приемы — в статье СКД программно.
// Модуль менеджера отчета ПродажиПоМенеджерамИКлиентам
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
// Формирует отчет без открытия формы: для рассылки, регламентного задания
// или кнопки в другом объекте.
//
// Параметры:
// НачалоПериода - Дата - первый день периода.
// КонецПериода - Дата - последний день периода, время можно не указывать.
// Менеджер - СправочникСсылка.Пользователи, Неопределено - отбор по менеджеру.
//
// Возвращаемое значение:
// ТабличныйДокумент - готовый отчет с группировками и итогами.
//
Функция СформироватьТабличныйДокумент(НачалоПериода, КонецПериода, Менеджер = Неопределено) Экспорт
Если Не ЗначениеЗаполнено(НачалоПериода) Или Не ЗначениеЗаполнено(КонецПериода) Тогда
ВызватьИсключение НСтр("ru = 'Не задан период отчета'");
КонецЕсли;
СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Вариант по умолчанию: группировки, порядок и оформление из шагов 6-9.
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки));
Компоновщик.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию);
Настройки = Компоновщик.ПолучитьНастройки();
// Даты для запроса схема вычислит из параметра Период сама.
Период = Новый СтандартныйПериод;
Период.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод;
Период.ДатаНачала = НачалоДня(НачалоПериода);
Период.ДатаОкончания = КонецДня(КонецПериода);
ЗначениеПериода = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("Период"));
Если ЗначениеПериода = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'В схеме отчета нет доступного параметра Период'");
КонецЕсли;
ЗначениеПериода.Значение = Период;
ЗначениеПериода.Использование = Истина;
Если ЗначениеЗаполнено(Менеджер) Тогда
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Менеджер");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Менеджер;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
Результат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецЕсли
Вызов из формы заказа клиента: продажи менеджера заказа за текущий месяц в отдельном окне. Команду в типовую форму добавляют расширением.
// Модуль формы заказа клиента. Команда ПродажиМенеджераЗаМесяц
// добавлена в форму через расширение.
&НаКлиенте
Процедура ПродажиМенеджераЗаМесяц(Команда)
Если Не ЗначениеЗаполнено(Объект.Менеджер) Тогда
ПоказатьПредупреждение(, НСтр("ru = 'В заказе не указан менеджер'"));
Возврат;
КонецЕсли;
Результат = ПродажиМенеджераНаСервере(Объект.Менеджер);
Результат.Показать(НСтр("ru = 'Продажи менеджера за текущий месяц'"));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПродажиМенеджераНаСервере(Менеджер)
ДатаОтчета = ТекущаяДатаСеанса();
Возврат Отчеты.ПродажиПоМенеджерамИКлиентам.СформироватьТабличныйДокумент(
НачалоМесяца(ДатаОтчета), КонецМесяца(ДатаОтчета), Менеджер);
КонецФункции
По кнопке «Сформировать» платформа вызывает ПриКомпоновкеРезультата модуля объекта отчета — здесь удобно поправить настройки перед компоновкой. Наш обработчик подставляет текущий месяц, если период выключен или не заполнен, чтобы отчет не читал регистр за все годы, и выводит над таблицей заголовок с периодом вместо стандартной строки «Параметры».
// Модуль объекта отчета ПродажиПоМенеджерамИКлиентам
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ОбработчикиСобытий
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Вариант вместе со значениями, которые пользователь выбрал над отчетом.
Настройки = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
Период = ПериодОтчета(Настройки);
ЗаголовокОтчета = СтрШаблон(НСтр("ru = 'Продажи по менеджерам и клиентам: %1'"),
ПредставлениеПериода(Период.ДатаНачала, Период.ДатаОкончания));
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьЗаголовок",
ТипВыводаТекстаКомпоновкиДанных.Выводить);
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", ЗаголовокОтчета);
// Период уже в заголовке, отдельная строка «Параметры: Период ...» не нужна.
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьПараметрыДанных",
ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Возвращает период из настроек. Если флажок периода снят или нет одной
// из дат, подставляет текущий месяц, чтобы отчет не читал регистр за все годы.
//
// Параметры:
// Настройки - НастройкиКомпоновкиДанных - настройки, которые пойдут в компоновку.
//
// Возвращаемое значение:
// СтандартныйПериод
//
Функция ПериодОтчета(Настройки)
ЗначениеПериода = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("Период"));
Если ЗначениеПериода = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'В схеме отчета нет доступного параметра Период'");
КонецЕсли;
Период = ЗначениеПериода.Значение;
ПериодЗадан = ЗначениеПериода.Использование
И ТипЗнч(Период) = Тип("СтандартныйПериод")
И ЗначениеЗаполнено(Период.ДатаНачала)
И ЗначениеЗаполнено(Период.ДатаОкончания);
Если Не ПериодЗадан Тогда
Период = Новый СтандартныйПериод;
Период.Вариант = ВариантСтандартногоПериода.ЭтотМесяц;
ЗначениеПериода.Значение = Период;
ЗначениеПериода.Использование = Истина;
КонецЕсли;
Возврат Период;
КонецФункции
#КонецОбласти
#КонецЕсли
ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных") каждый раз возвращает новую копию схемы — ее можно менять.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию) приносит в код все, что настроено на шагах 6–9; код добавляет только период и менеджера.Период — НачалоПериода и КонецПериода схема вычисляет из него. Без Использование = Истина обе даты будут пустыми.КонецДня(КонецПериода) — иначе граница придется на полночь и последний день выпадет.КомпоновщикНастроек.ПолучитьНастройки() отдает вариант вместе со значениями с формы. В КомпоновщикНастроек.Настройки их нет, и быстрые отборы не сработали бы.ДанныеРасшифровки передаются и в Выполнить, и в Инициализировать — без этого пропадет расшифровка. Функции менеджера она не нужна.СтандартнаяОбработка = Ложь — иначе после вашего кода платформа скомпонует отчет еще раз.ВЫБОР КОГДА ... = 0.Сумма(СредняяЦена) вместо «сумма выручки / сумма количества».Номенклатура добавлены детальные записи.КонецПериода состав «Дата» или из кода передана дата без КонецДня().НачалоПериода и КонецПериода не стоит «Ограничение доступности».НайтиЗначениеПараметра вернул Неопределено, поэтому в листингах результат поиска проверяется.Да: те же шаги выполняются во внешнем отчете (.erf) или в расширении. Внешний подходит для разовой задачи, расширение — когда отчет нужен в интерфейсе постоянно. Без программиста начните с универсального отчета.
Нет, форму с результатом и быстрыми настройками платформа строит по схеме сама, своя нужна только для нестандартных элементов. В УТ 11 новый отчет, как и типовые отчеты на СКД, открывается в общей форме отчетов.
Создайте вычисляемое поле ДоляВыручки с выражением 0 (детальных строк в отчете нет) и форматом в один знак после запятой, а в ресурсах задайте для него ВЫБОР КОГДА ВычислитьВыражение("Сумма(Выручка)", "ОбщийИтог") = 0 ТОГДА 0 ИНАЧЕ 100 * Сумма(Выручка) / ВычислитьВыражение("Сумма(Выручка)", "ОбщийИтог") КОНЕЦ. Функция берет выручку в контексте общего итога, и в строке получается процент от нее.
Чаще всего виноват период: без него регистр читается за все годы, поэтому обработчик выше подставляет текущий месяц. Отборы по полям набора компоновка переносит в запрос, а по вычисляемым полям фильтрует уже выбранные строки. Если тормозит вся база, это отдельная задача: «1С тормозит».
Если данные нужно собрать из нескольких регистров, вывести в свой макет или отправлять отчет рассылкой, сделать отчет на СКД быстрее поручить разработчику: разработка отчетов и обработок 1С. Опишите колонки, группировки и отборы в форме задания — оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.