← Назад к вопросам
Отчёт по прибыли на СКД
1.7 Middle🔥 221 комментариев
#Запросы и оптимизация#СКД и отчёты
Условие
Создайте отчёт на СКД (Система компоновки данных), который показывает прибыль по товарам.
Структура отчёта:
- Организация
- Товар
- Цена продажи
- Цена закупки
- Количество
- Сумма продажи
- Прибыль (разница между суммой продажи и суммой закупки)
Группировка по организации и товару с итогами.
Пример результата
| Организация | Товар | Цена | Себестоимость | Кол-во | Сумма | Прибыль |
|---|---|---|---|---|---|---|
| ООО Ромашка | 50000 | 15000 | ||||
| Товар1 | 1000 | 700 | 30 | 30000 | 9000 | |
| Товар2 | 500 | 350 | 40 | 20000 | 6000 |
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Отчёт на СКД требует двух частей: источник данных (запрос) и компоновка (структура отчёта).
Часть 1: Создание СКД (компоновка данных)
// В метаданных:
// Отчёты
// - ОтчётПрибыльПоТоварам
// - Вид отчёта: Управляемый отчёт
// - Источник данных: СКД с запросом ниже
Часть 2: Запрос источника данных
Это основной запрос для СКД:
ВЫБРАТЬ
Продажи.Организация,
Продажи.Товар,
Продажи.ЦенаПродажи,
Закупки.ЦенаЗакупки,
Продажи.Количество,
Продажи.СуммаПродажи,
Продажи.СуммаПродажи - Закупки.ЦенаЗакупки * Продажи.Количество КАК Прибыль
ИЗ
(
ВЫБРАТЬ
ДокументыПродаж.Организация,
ДокументыПродаж.Товар,
ДокументыПродаж.Цена КАК ЦенаПродажи,
ДокументыПродаж.Количество,
ДокументыПродаж.Цена * ДокументыПродаж.Количество КАК СуммаПродажи
ИЗ
Документ.РеализацияТоваров КАС Документы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.Товары КАС ДокументыПродаж
ПО Документы.Ссылка = ДокументыПродаж.Ссылка
ГДЕ
НЕ Документы.ПометкаУдаления
И Документы.Проведено
) КАС Продажи
ЛЕВОЕ СОЕДИНЕНИЕ
(
ВЫБРАТЬ
Закупки.Товар,
МАКСИМУМ(Закупки.ЦенаЗакупки) КАС ЦенаЗакупки
ИЗ
Документ.ПокупкаТоваров КАС Документы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПокупкаТоваров.Товары КАС Закупки
ПО Документы.Ссылка = Закупки.Ссылка
ГДЕ
НЕ Документы.ПометкаУдаления
И Документы.Проведено
СГРУППИРОВАТЬ ПО
Закупки.Товар
) КАС Закупки
ПО Продажи.Товар = Закупки.Товар
ПОРЯДОКПО
Продажи.Организация,
Продажи.Товар
Часть 3: Модуль управляемого отчёта
// В модуле отчёта
Процедура ПриКомпоновкеРезультата(
ДокументРезультат,
ДанныеПараметров,
СтандартнаяОбработка) Экспорт
СтандартнаяОбработка = Ложь;
// Получаем макет СКД
Макет = ПолучитьМакет("ОсновнаяСхемаКомпоновки");
// Создаём композитор схемы компоновки
СхемаКомпоновкиДанных = Новая СхемаКомпоновкиДанных();
СхемаКомпоновкиДанных.ЗагрузитьИзМакета(Макет);
// Создаём компоновщик
Компоновщик = Новый КомпоновщикДанных();
Компоновщик.ИсходнаяСхема = СхемаКомпоновкиДанных;
// Устанавливаем параметры отчёта
Компоновщик.УстановитьПараметр("ДатаНачала", ДанныеПараметров.ДатаНачала);
Компоновщик.УстановитьПараметр("ДатаОкончания", ДанныеПараметров.ДатаОкончания);
// Создаём макет компоновки
МакетКомпоновки = Компоновщик.Выполнить();
// Создаём процессор вывода результатов
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВДокумент();
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(МакетКомпоновки);
КонецПроцедуры
Часть 4: Настройка структуры в конструкторе СКД
В конструкторе СКД (визуальном редакторе) добавляем:
Поля данных:
- Организация (группировка)
- Товар (группировка)
- ЦенаПродажи (отображение)
- ЦенаЗакупки (отображение)
- Количество (отображение)
- СуммаПродажи (отображение)
- Прибыль (отображение)
Группировки:
- По Организация (с итогом)
- По Товар (с итогом)
Итоги:
- Сумма Продажи
- Сумма Прибыли
- Сумма Количество
Часть 5: Программная настройка макета (если нет конструктора)
Процедура НастроитьСКД()
// Получаем макет
Макет = ПолучитьМакет("ОсновнаяСхемаКомпоновки");
СКД = Новая СхемаКомпоновкиДанных();
СКД.ЗагрузитьИзМакета(Макет);
// Очищаем существующие группировки
СКД.Группировки.Удалить(СКД.Группировки[0]);
// Добавляем группировку по организации
ГруппировкаОрг = СКД.Группировки.Добавить();
ГруппировкаОрг.Поля.Добавить(Новый ПолеКомпоновкиДанных("Организация"));
// Добавляем итоги для организации
ИтогОрг = ГруппировкаОрг.Итоги.Добавить();
ИтогОрг.Поле = "СуммаПродажи";
ИтогОрг.Выражение = "СУММА(СуммаПродажи)";
ИтогОрг.ТипИтога = ТипИтогаКомпоновкиДанных.Сумма;
// Добавляем группировку по товару
ГруппировкаТовар = ГруппировкаОрг.Группировки.Добавить();
ГруппировкаТовар.Поля.Добавить(Новый ПолеКомпоновкиДанных("Товар"));
// Добавляем итоги для товара
ИтогТовар = ГруппировкаТовар.Итоги.Добавить();
ИтогТовар.Поле = "Прибыль";
ИтогТовар.Выражение = "СУММА(Прибыль)";
ИтогТовар.ТипИтога = ТипИтогаКомпоновкиДанных.Сумма;
КонецПроцедуры
Часть 6: Формирование таблицы результатов
Для вывода в результирующий документ:
Процедура ВывестиОтчёт()
// Создаём документ результата
ДокРез = Новый ДокументРезультат();
ДокРез.ПолеДокумента.Колонки.Добавить("Организация", Новый ОписаниеТипов("Строка"));
ДокРез.ПолеДокумента.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ДокРез.ПолеДокумента.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
ДокРез.ПолеДокумента.Колонки.Добавить("Себестоимость", Новый ОписаниеТипов("Число"));
ДокРез.ПолеДокумента.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ДокРез.ПолеДокумента.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
ДокРез.ПолеДокумента.Колонки.Добавить("Прибыль", Новый ОписаниеТипов("Число"));
// Получаем данные через запрос
Запрос = ПолучитьЗапрос();
Таблица = Запрос.Выполнить().Выгрузить();
// Выводим в таблицу
ТекущаяОрг = "";
Для Каждого Строка Из Таблица Цикл
// Если изменилась организация — добавляем заголовок и итоги
Если Строка.Организация <> ТекущаяОрг Тогда
Если ТекущаяОрг <> "" Тогда
// Вывести итоги предыдущей организации
ВывестиИтогиОрганизации(ДокРез, ТекущаяОрг);
КонецЕсли;
ТекущаяОрг = Строка.Организация;
// Вывести заголовок организации
ВывестиЗаголовокОрганизации(ДокРез, ТекущаяОрг);
КонецЕсли;
// Добавляем строку товара
НоваяСтрока = ДокРез.ПолеДокумента.Добавить();
НоваяСтрока.Организация = "";
НоваяСтрока.Товар = Строка.Товар;
НоваяСтрока.Цена = Строка.ЦенаПродажи;
НоваяСтрока.Себестоимость = Строка.ЦенаЗакупки;
НоваяСтрока.Количество = Строка.Количество;
НоваяСтрока.Сумма = Строка.СуммаПродажи;
НоваяСтрока.Прибыль = Строка.Прибыль;
КонецЦикла;
КонецПроцедуры
Ключевые моменты СКД:
Система компоновки данных:
- Универсальный механизм создания отчётов в 1С
- Отделяет логику выборки данных от представления
- Позволяет пользователю изменять структуру отчёта без программирования
Преимущества СКД:
- Группировки и итоги автоматические
- Быстрая генерация отчётов
- Возможность сохранять варианты отчётов
- Встроённая фильтрация и сортировка
Источник данных:
- Запрос содержит вычисляемые поля (Прибыль)
- Используются вложенные запросы для расчёта цены закупки
- ЛЕВОЕ СОЕДИНЕНИЕ гарантирует товары без закупок
Без конструктора (программно):
- Создаём макет в макет-редакторе
- Загружаем макет в процедуре компоновки
- Процессор вывода форматирует результат