Как в отчете СКД вывести расчетные статьи (маржу, процент наценки) отдельными строками?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При построении управленческих и финансовых отчетов в Системе компоновки данных (СКД) часто возникает задача: в регистре хранятся только базовые первичные данные (например, Реализация и Себестоимость), но в единой структуре строк отчета рядом с ними требуется вывести расчетные показатели — Маржу, Процент наценки или расчетные итоги по произвольным группам статей с помесячной разбивкой в колонках.

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

Способ 1. Расчет и разворот показателей на уровне запроса набора данных

Проанализируем наиболее производительный и универсальный способ. Если расчетные статьи должны отображаться в той же группировке строк Статья, мы можем рассчитать их прямо в тексте запроса СКД с помощью конструкции ВЫБОР КОГДА и последующего объединения (ОБЪЕДИНИТЬ ВСЕ).

Разберем этот процесс по шагам:

  1. Свертка базовых данных: во временной таблице или первом подзапросе агрегируем данные регистра по периодам и номенклатурным группам, разворачивая статьи в отдельные колонки.
  2. Расчет формул: вычисляем разность для маржи и проверяем деление на ноль для процента наценки.
  3. Объединение строк: разворачиваем колонки обратно в единое поле статьи с добавлением порядка сортировки.

Посмотрим на пример текста запроса для набора данных:


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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Период КАК Период,
    ВТ.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
    &СтатьяРеализация КАК Статья,
    ВТ.Реализация КАК Сумма,
    1 КАК Порядок
ИЗ
    ВТ_СвернутыеДанные КАК ВТ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВТ.Период,
    ВТ.НоменклатурнаяГруппа,
    &СтатьяСебестоимость,
    ВТ.Себестоимость,
    2
ИЗ
    ВТ_СвернутыеДанные КАК ВТ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВТ.Период,
    ВТ.НоменклатурнаяГруппа,
    &СтатьяМаржа,
    ВТ.Реализация - ВТ.Себестоимость,
    3
ИЗ
    ВТ_СвернутыеДанные КАК ВТ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВТ.Период,
    ВТ.НоменклатурнаяГруппа,
    &СтатьяПроцент,
    ВЫБОР 
        КОГДА ВТ.Себестоимость = 0 ТОГДА 0 
        ИНАЧЕ (ВТ.Реализация - ВТ.Себестоимость) / ВТ.Себестоимость * 100 
    КОНЕЦ,
    4
ИЗ
    ВТ_СвернутыеДанные КАК ВТ

Важный момент: поле Порядок обязательно выводится в настройках компоновки в раздел «Сортировка», чтобы строки статей не пересортировались по алфавиту.

Способ 2. Вычисление выражений на вкладке «Ресурсы» в СКД

Рассмотрим альтернативный вариант, когда расчетные строки не формируются в запросе, а вычисляются механизмом выражений СКД.

На вкладке Ресурсы для поля Сумма можно задать выражение с условием по конкретной статье. Это позволяет на лету подменять стандартную агрегацию:


ВЫБОР 
    КОГДА Статья = &СтатьяМаржа 
        ТОГДА Сумма(ВЫБОР КОГДА Статья = &СтатьяРеализация ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ) 
            - Сумма(ВЫБОР КОГДА Статья = &СтатьяСебестоимость ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ)
    КОГДА Статья = &СтатьяПроцент 
        ТОГДА ВЫБОР 
            КОГДА Сумма(ВЫБОР КОГДА Статья = &СтатьяСебестоимость ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ) = 0 ТОГДА 0
            ИНАЧЕ (Сумма(ВЫБОР КОГДА Статья = &СтатьяРеализация ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ) 
                 - Сумма(ВЫБОР КОГДА Статья = &СтатьяСебестоимость ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ)) 
                 / Сумма(ВЫБОР КОГДА Статья = &СтатьяСебестоимость ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ) * 100
        КОНЕЦ
    ИНАЧЕ Сумма(Сумма)
КОНЕЦ

Также для вычисления значений по иерархии или соседним группировкам можно использовать функции СКД ВычислитьВыражение и ВычислитьВыражениеСГруппировкойМассив, которые позволяют обращаться к итогам вышестоящих уровней.

Программная установка параметров СКД

При использовании расчетных формул в параметрах схемы компоновки данных часто требуется жестко или динамически задавать ссылки на предопределенные или выбранные статьи. Разберем, как передать параметры в СКД программно.

Создадим универсальную процедуру для изменения значения параметра в компоновщике настроек:


Процедура УстановитьПараметрСКД(Настройка, Имя, Значение) Экспорт

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

КонецПроцедуры

В платформе 1С:Предприятие 8.3 на управляемых формах оптимальным местом для установки таких параметров является событие ПриКомпоновкеРезультата в модуле объекта отчета:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    УстановитьПараметрСКД(Настройки, "СтатьяРеализация", Справочники.СтатьиЗатрат.НайтиПоНаименованию("Реализация"));
    УстановитьПараметрСКД(Настройки, "СтатьяСебестоимость", Справочники.СтатьиЗатрат.НайтиПоНаименованию("Себестоимость"));
    
    КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

КонецПроцедуры

Если же требуется полностью управлять процессом формирования отчета вручную через процессор компоновки, код выглядит следующим образом:


Процедура СформироватьОтчетВручную(РезультатТабличныйДокумент)

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

    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(РезультатТабличныйДокумент);
    
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

КонецПроцедуры

Особенности настройки структуры и форматирования

  1. Таблица в СКД: в строках таблицы создается группировка по полю НоменклатурнаяГруппа, внутри нее — подчиненная группировка по полю Статья. В колонки выводится поле Период с типом дополнения Месяц.
  2. Условное оформление: поскольку в одной колонке выводятся и рубли, и проценты, перейдем на вкладку Условное оформление и добавим правило для строки с условием Статья Равно &СтатьяПроцент, установив формат ЧДЦ=2; ЧС=0; ЧО=0; ЧФ=Ч%.
← На главную