← Назад к вопросам

Отчёт по прибыли на СКД

1.7 Middle🔥 221 комментариев
#Запросы и оптимизация#СКД и отчёты

Условие

Создайте отчёт на СКД (Система компоновки данных), который показывает прибыль по товарам.

Структура отчёта:

  • Организация
  • Товар
  • Цена продажи
  • Цена закупки
  • Количество
  • Сумма продажи
  • Прибыль (разница между суммой продажи и суммой закупки)

Группировка по организации и товару с итогами.

Пример результата

ОрганизацияТоварЦенаСебестоимостьКол-воСуммаПрибыль
ООО Ромашка5000015000
Товар1100070030300009000
Товар250035040200006000

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Отчёт на СКД требует двух частей: источник данных (запрос) и компоновка (структура отчёта).

Часть 1: Создание СКД (компоновка данных)

// В метаданных:
// Отчёты
//   - ОтчётПрибыльПоТоварам
//     - Вид отчёта: Управляемый отчёт
//     - Источник данных: СКД с запросом ниже

Часть 2: Запрос источника данных

Это основной запрос для СКД:

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

ПОРЯДОКПО
    Продажи.Организация,
    Продажи.Товар

Часть 3: Модуль управляемого отчёта

// В модуле отчёта

Процедура ПриКомпоновкеРезультата(
    ДокументРезультат,
    ДанныеПараметров,
    СтандартнаяОбработка) Экспорт
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем макет СКД
    Макет = ПолучитьМакет("ОсновнаяСхемаКомпоновки");
    
    // Создаём композитор схемы компоновки
    СхемаКомпоновкиДанных = Новая СхемаКомпоновкиДанных();
    СхемаКомпоновкиДанных.ЗагрузитьИзМакета(Макет);
    
    // Создаём компоновщик
    Компоновщик = Новый КомпоновщикДанных();
    Компоновщик.ИсходнаяСхема = СхемаКомпоновкиДанных;
    
    // Устанавливаем параметры отчёта
    Компоновщик.УстановитьПараметр("ДатаНачала", ДанныеПараметров.ДатаНачала);
    Компоновщик.УстановитьПараметр("ДатаОкончания", ДанныеПараметров.ДатаОкончания);
    
    // Создаём макет компоновки
    МакетКомпоновки = Компоновщик.Выполнить();
    
    // Создаём процессор вывода результатов
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВДокумент();
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(МакетКомпоновки);
КонецПроцедуры

Часть 4: Настройка структуры в конструкторе СКД

В конструкторе СКД (визуальном редакторе) добавляем:

Поля данных:

  • Организация (группировка)
  • Товар (группировка)
  • ЦенаПродажи (отображение)
  • ЦенаЗакупки (отображение)
  • Количество (отображение)
  • СуммаПродажи (отображение)
  • Прибыль (отображение)

Группировки:

  1. По Организация (с итогом)
  2. По Товар (с итогом)

Итоги:

  • Сумма Продажи
  • Сумма Прибыли
  • Сумма Количество

Часть 5: Программная настройка макета (если нет конструктора)

Процедура НастроитьСКД()
    // Получаем макет
    Макет = ПолучитьМакет("ОсновнаяСхемаКомпоновки");
    СКД = Новая СхемаКомпоновкиДанных();
    СКД.ЗагрузитьИзМакета(Макет);
    
    // Очищаем существующие группировки
    СКД.Группировки.Удалить(СКД.Группировки[0]);
    
    // Добавляем группировку по организации
    ГруппировкаОрг = СКД.Группировки.Добавить();
    ГруппировкаОрг.Поля.Добавить(Новый ПолеКомпоновкиДанных("Организация"));
    
    // Добавляем итоги для организации
    ИтогОрг = ГруппировкаОрг.Итоги.Добавить();
    ИтогОрг.Поле = "СуммаПродажи";
    ИтогОрг.Выражение = "СУММА(СуммаПродажи)";
    ИтогОрг.ТипИтога = ТипИтогаКомпоновкиДанных.Сумма;
    
    // Добавляем группировку по товару
    ГруппировкаТовар = ГруппировкаОрг.Группировки.Добавить();
    ГруппировкаТовар.Поля.Добавить(Новый ПолеКомпоновкиДанных("Товар"));
    
    // Добавляем итоги для товара
    ИтогТовар = ГруппировкаТовар.Итоги.Добавить();
    ИтогТовар.Поле = "Прибыль";
    ИтогТовар.Выражение = "СУММА(Прибыль)";
    ИтогТовар.ТипИтога = ТипИтогаКомпоновкиДанных.Сумма;
КонецПроцедуры

Часть 6: Формирование таблицы результатов

Для вывода в результирующий документ:

Процедура ВывестиОтчёт()
    // Создаём документ результата
    ДокРез = Новый ДокументРезультат();
    ДокРез.ПолеДокумента.Колонки.Добавить("Организация", Новый ОписаниеТипов("Строка"));
    ДокРез.ПолеДокумента.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
    ДокРез.ПолеДокумента.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    ДокРез.ПолеДокумента.Колонки.Добавить("Себестоимость", Новый ОписаниеТипов("Число"));
    ДокРез.ПолеДокумента.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    ДокРез.ПолеДокумента.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
    ДокРез.ПолеДокумента.Колонки.Добавить("Прибыль", Новый ОписаниеТипов("Число"));
    
    // Получаем данные через запрос
    Запрос = ПолучитьЗапрос();
    Таблица = Запрос.Выполнить().Выгрузить();
    
    // Выводим в таблицу
    ТекущаяОрг = "";
    Для Каждого Строка Из Таблица Цикл
        // Если изменилась организация — добавляем заголовок и итоги
        Если Строка.Организация <> ТекущаяОрг Тогда
            Если ТекущаяОрг <> "" Тогда
                // Вывести итоги предыдущей организации
                ВывестиИтогиОрганизации(ДокРез, ТекущаяОрг);
            КонецЕсли;
            ТекущаяОрг = Строка.Организация;
            // Вывести заголовок организации
            ВывестиЗаголовокОрганизации(ДокРез, ТекущаяОрг);
        КонецЕсли;
        
        // Добавляем строку товара
        НоваяСтрока = ДокРез.ПолеДокумента.Добавить();
        НоваяСтрока.Организация = "";
        НоваяСтрока.Товар = Строка.Товар;
        НоваяСтрока.Цена = Строка.ЦенаПродажи;
        НоваяСтрока.Себестоимость = Строка.ЦенаЗакупки;
        НоваяСтрока.Количество = Строка.Количество;
        НоваяСтрока.Сумма = Строка.СуммаПродажи;
        НоваяСтрока.Прибыль = Строка.Прибыль;
    КонецЦикла;
КонецПроцедуры

Ключевые моменты СКД:

Система компоновки данных:

  • Универсальный механизм создания отчётов в 1С
  • Отделяет логику выборки данных от представления
  • Позволяет пользователю изменять структуру отчёта без программирования

Преимущества СКД:

  • Группировки и итоги автоматические
  • Быстрая генерация отчётов
  • Возможность сохранять варианты отчётов
  • Встроённая фильтрация и сортировка

Источник данных:

  • Запрос содержит вычисляемые поля (Прибыль)
  • Используются вложенные запросы для расчёта цены закупки
  • ЛЕВОЕ СОЕДИНЕНИЕ гарантирует товары без закупок

Без конструктора (программно):

  • Создаём макет в макет-редакторе
  • Загружаем макет в процедуре компоновки
  • Процессор вывода форматирует результат