Запрос суммы продаж по контрагентам за 30 дней
Условие
Напишите запрос, который выводит сумму продаж по контрагентам за последние 30 дней.
Дано:
- Документ "РеализацияТоваровУслуг" с реквизитом "Контрагент" и табличной частью "Товары" с колонкой "Сумма"
- Регистр накопления "Продажи" с измерением "Контрагент" и ресурсом "Сумма"
Пример результата
| Контрагент | СуммаПродаж |
|---|---|
| ООО Ромашка | 150000 |
| ИП Иванов | 85000 |
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Обзор задачи
Эта задача требует написания запроса для анализа продаж по контрагентам за последние 30 дней. Это типичный бизнес-запрос, который используется в аналитике и рейтингах клиентов. Задача проверяет:
- Работу с датами (вычисление "30 дней назад")
- Группировку и суммирование (GROUP BY, SUM)
- Работу с регистрами накопления
- Условия фильтрации по датам
Математическая логика
Нужно:
- Определить дату ровно 30 дней назад
- Выбрать записи из регистра Продажи, где дата >= текущей даты - 30 дней
- Сгруппировать по контрагенту
- Просуммировать суммы продаж
Решение 1: Через регистр накопления "Продажи"
Выбрать
Продажи.Контрагент,
Контрагент.Наименование Как НаименованиеКонтрагента,
СУММА(Продажи.Сумма) Как СуммаПродаж
Из
РегистрНакопления.Продажи Как Продажи
Левое Соединение Справочник.Контрагенты Как Контрагент
На Продажи.Контрагент = Контрагент.Ссылка
Где
Продажи.Период >= ТекущаяДата() - 30 * 86400
Группировать По
Продажи.Контрагент,
Контрагент.Наименование
Упорядочить По
СуммаПродаж Убыв
Описание: Берём данные из регистра накопления, фильтруем по периоду (текущая дата минус 30 дней), группируем по контрагенту и суммируем.
Решение 2: Через документ "РеализацияТоваровУслуг"
Выбрать
РеализацияТовары.Контрагент,
Контрагент.Наименование Как НаименованиеКонтрагента,
СУММА(РеализацияДетали.Сумма) Как СуммаПродаж
Из
Документ.РеализацияТоваровУслуг Как РеализацияТовары
Внутреннее Соединение Документ.РеализацияТоваровУслуг.Товары Как РеализацияДетали
На РеализацияТовары.Ссылка = РеализацияДетали.Ссылка
Левое Соединение Справочник.Контрагенты Как Контрагент
На РеализацияТовары.Контрагент = Контрагент.Ссылка
Где
РеализацияТовары.Дата >= ТекущаяДата() - 30 * 86400
И РеализацияТовары.Проведено = Истина
Группировать По
РеализацияТовары.Контрагент,
Контрагент.Наименование
Упорядочить По
СуммаПродаж Убыв
Описание: Используем исходный документ, присоединяя табличную часть. Фильтруем по дате документа и статусу проведения.
Решение 3: С использованием параметра даты
Выбрать
Продажи.Контрагент,
Контрагент.Наименование Как НаименованиеКонтрагента,
СУММА(Продажи.Сумма) Как СуммаПродаж
Из
РегистрНакопления.Продажи Как Продажи
Левое Соединение Справочник.Контрагенты Как Контрагент
На Продажи.Контрагент = Контрагент.Ссылка
Где
Продажи.Период >= &ДатаНачало
И Продажи.Период < &ДатаОкончание
Группировать По
Продажи.Контрагент,
Контрагент.Наименование
Имеющие
СУММА(Продажи.Сумма) > 0
Упорядочить По
СуммаПродаж Убыв
Описание: Используем параметры для дат начала и окончания (более гибко), добавляем условие в HAVING для отсеивания нулевых сумм.
Решение 4: С дополнительной статистикой
Выбрать
Продажи.Контрагент,
Контрагент.Наименование Как НаименованиеКонтрагента,
СУММА(Продажи.Сумма) Как СуммаПродаж,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Документ) Как КоличествоДокументов,
СРЕДНЕЕ(Продажи.Сумма) Как СредняяСумма
Из
РегистрНакопления.Продажи Как Продажи
Левое Соединение Справочник.Контрагенты Как Контрагент
На Продажи.Контрагент = Контрагент.Ссылка
Где
Продажи.Период >= ТекущаяДата() - 30 * 86400
Группировать По
Продажи.Контрагент,
Контрагент.Наименование
Упорядочить По
СуммаПродаж Убыв
Описание: Добавляем дополнительные метрики: количество документов и среднюю сумму.
Решение 5: Со срезом последних цен (если нужна стоимость на последнюю дату)
Выбрать
Продажи.Контрагент,
Контрагент.Наименование Как НаименованиеКонтрагента,
СУММА(Продажи.Сумма) Как СуммаПродаж,
МАКС(Продажи.Период) Как ПоследняяДатаПродажи
Из
РегистрНакопления.Продажи Как Продажи
Левое Соединение Справочник.Контрагенты Как Контрагент
На Продажи.Контрагент = Контрагент.Ссылка
Где
Продажи.Период >= ТекущаяДата() - 30 * 86400
Группировать По
Продажи.Контрагент,
Контрагент.Наименование
Упорядочить По
СуммаПродаж Убыв
Описание: Добавляем максимальную дату продажи для каждого контрагента.
Решение 6: С фильтром только по активным контрагентам
Выбрать
Продажи.Контрагент,
Контрагент.Наименование Как НаименованиеКонтрагента,
СУММА(Продажи.Сумма) Как СуммаПродаж
Из
РегистрНакопления.Продажи Как Продажи
Внутреннее Соединение Справочник.Контрагенты Как Контрагент
На Продажи.Контрагент = Контрагент.Ссылка
И Контрагент.ПометкаУдаления = Ложь
Где
Продажи.Период >= ТекущаяДата() - 30 * 86400
Группировать По
Продажи.Контрагент,
Контрагент.Наименование
Упорядочить По
СуммаПродаж Убыв
Описание: Используем ВНУТРЕННЕЕ СОЕДИНЕНИЕ и фильтруем удалённые контрагенты.
Оптимальное решение
Для production кода — Решение 3:
Выбрать
Продажи.Контрагент,
Контрагент.Наименование Как НаименованиеКонтрагента,
СУММА(Продажи.Сумма) Как СуммаПродаж
Из
РегистрНакопления.Продажи Как Продажи
Левое Соединение Справочник.Контрагенты Как Контрагент
На Продажи.Контрагент = Контрагент.Ссылка
Где
Продажи.Период >= &ДатаНачало
И Продажи.Период < &ДатаОкончание
Группировать По
Продажи.Контрагент,
Контрагент.Наименование
Имеющие
СУММА(Продажи.Сумма) > 0
Упорядочить По
СуммаПродаж Убыв
Это решение:
- Гибкое — параметры для дат можно менять
- Безопасное — параметризованные запросы защищают от SQL-injection
- Понятное — ясная логика фильтрации и группировки
- Производительное — использует регистр накопления (оптимизирован для сумм)
Использование в коде 1С
Процедура ПолучитьПродажиПоКонтрагентамЗа30Дней()
ДатаНачало = НачалоДня(ТекущаяДата() - 30);
ДатаОкончание = КонецДня(ТекущаяДата() + 1);
ТекстЗапроса = "Выбрать
| Продажи.Контрагент,
| Контрагент.Наименование Как НаименованиеКонтрагента,
| СУММА(Продажи.Сумма) Как СуммаПродаж
|Из
| РегистрНакопления.Продажи Как Продажи
| Левое Соединение Справочник.Контрагенты Как Контрагент
| На Продажи.Контрагент = Контрагент.Ссылка
|Где
| Продажи.Период >= &ДатаНачало
| И Продажи.Период < &ДатаОкончание
|Группировать По
| Продажи.Контрагент,
| Контрагент.Наименование
|Имеющие
| СУММА(Продажи.Сумма) > 0
|Упорядочить По
| СуммаПродаж Убыв";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ДатаНачало", ДатаНачало);
Запрос.УстановитьПараметр("ДатаОкончание", ДатаОкончание);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаРезультата = РезультатЗапроса.Выгрузить();
Для каждого Строка Из ТаблицаРезультата Цикл
Сообщить("Контрагент: " + Строка.НаименованиеКонтрагента + ", Сумма: " + Строка.СуммаПродаж);
КонецЦикла;
КонецПроцедуры
Вычисление "30 дней назад"
// Способ 1: через секунды (30 * 86400)
ДатаНачало = ТекущаяДата() - 30 * 86400;
// Способ 2: через функцию НачалоДня
ДатаНачало = НачалоДня(ТекущаяДата() - 30);
// Способ 3: через ДОБАВИТЬМЕСЯЦ
ДатаНачало = ТекущаяДата() - 30; // если хранится как дата
Оптимизация для больших объёмов
// Если регистр большой, можно добавить фильтр по срезу последних
Выбрать
Продажи.Контрагент,
Контрагент.Наименование,
СУММА(Продажи.Сумма) Как СуммаПродаж
Из
РегистрНакопления.Продажи.СрезПоследних(&ДатаОкончание) Как Продажи
Левое Соединение Справочник.Контрагенты Как Контрагент
На Продажи.Контрагент = Контрагент.Ссылка
Где
Продажи.Период >= &ДатаНачало
Группировать По
Продажи.Контрагент,
Контрагент.Наименование
Упорядочить По
СуммаПродаж Убыв
Ключевые моменты
- Регистр накопления — лучше использовать, так как он оптимизирован для сумм
- Параметры — всегда параметризуйте дату для переиспользуемости
- ГРУППИРОВАТЬ ПО — обязателен при суммировании
- ИМЕЮЩИЕ — фильтрует результаты группировки (СУММА > 0)
- УПОРЯДОЧИТЬ ПО УБЫВ — показываем самых крупных контрагентов первыми