Как правильно составить запрос по валовой прибыли в разрезе менеджеров и клиентов в 1С

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

При разработке отчетов по финансовому результату в конфигурациях на базе 1С:ERP, УТ 11 или КА 2, основной массив данных черпается из регистра накопления ВыручкаИСебестоимостьПродаж. Одной из самых частых проблем, с которой сталкиваются начинающие разработчики, является «размножение» строк в результате выполнения запроса. Вместо одной сгруппированной строки по клиенту или менеджеру система выдает несколько строк с разными суммами. Рассмотрим подробнее, почему это происходит и как составить корректный запрос.

Анализ типичной ошибки в группировках запроса

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


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

Выясним причину, по которой такой запрос не будет работать корректно. Главная ошибка здесь заключается в секции СГРУППИРОВАТЬ ПО. Обратите внимание, что туда включено поле КоличествоОборот. В языке запросов 1С (как и в стандартном SQL) группировка происходит по уникальным сочетаниям всех полей, перечисленных после ключевого слова СГРУППИРОВАТЬ ПО. Если в одной продаже было 10 единиц товара, а в другой — 5, то система воспримет их как разные записи и не суммирует выручку, так как значения в колонке «Количество» различаются.

Важное правило: никогда не включайте ресурсы (числовые показатели, которые нужно складывать) в список группировки. За это, как справедливо заметили на форуме, «бьют по пальцам», так как это фундаментальная ошибка понимания работы БД.

Исправление запроса: агрегация данных

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


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

В данном примере мы используем только те поля, по которым нам действительно нужно разделить данные. Все остальное суммируется. Если у одного менеджера было 100 продаж одному и тому же партнеру, запрос вернет одну строку с общим итогом.

Особенности регистра «Выручка и себестоимость продаж»

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

  1. Аналитика учета по партнерам: В регистре данные привязаны не напрямую к справочнику Партнеры, а к ключу аналитики. Поэтому обращение АналитикаУчетаПоПартнерам.Партнер является правильным и необходимым. Это позволяет системе корректно обрабатывать ситуации, когда у одного партнера есть несколько контрагентов.
  2. Менеджер: Поле Менеджер в регистре заполняется из документа продажи (например, «Реализация товаров и услуг»). Если вам нужно получить отчет по «Основному менеджеру», который закреплен в карточке клиента, запрос придется усложнить, добавив левое соединение со справочником Партнеры по ссылке.
  3. Себестоимость и «Закрытие месяца»: Помните, что реальная себестоимость (и, как следствие, валовая прибыль) рассчитывается в системе только после выполнения регламентной операции «Закрытие месяца». До этого момента поля себестоимости могут быть либо пустыми, либо содержать неактуальные данные предварительного расчета.
  4. Валюты: В регистре суммы хранятся в нескольких валютах (валюта управленческого учета, регламентированного учета). При суммировании ресурсов обязательно убедитесь, что вы выбираете правильное поле, например СуммаВыручкиБезНДС или СуммаВыручкиРегл, иначе вы рискуете «сложить яблоки с апельсинами».

Расширение задачи: добавление скидок

Часто бизнес-аналитики просят вывести в одном отчете не только прибыль, но и сумму предоставленных скидок. Проанализируем, как это реализовать. В регистре ВыручкаИСебестоимостьПродаж есть отдельные ресурсы для автоматических и ручных скидок. Чтобы вывести их, достаточно добавить соответствующие поля в секцию выбора с использованием функции СУММА():


СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаАвтоматическойСкидкиОборот) КАК АвтоСкидка,
СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаРучнойСкидкиОборот) КАК РучнаяСкидка

Если в вашем регистре эти поля отсутствуют (зависит от версии конфигурации), сумму скидки можно вычислить как разницу между суммой продаж в ценах прайс-листа и фактической выручкой. Однако типовой регистр в большинстве случаев уже содержит эти данные в готовом виде.

Итоги и рекомендации

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

  1. Используйте виртуальную таблицу оборотов регистра.
  2. В группировки включайте только измерения: Менеджер, Партнер, Номенклатура (если нужен детальный отчет).
  3. Все ресурсы (выручка, себестоимость, количество, доп. расходы) обязательно агрегируйте через СУММА().
  4. Проверяйте, выполнено ли в базе закрытие месяца, если цифры по прибыли кажутся подозрительно низкими или равными выручке.

Следуя этим правилам, вы получите быстрый и точный запрос, который станет надежной основой для управленческой отчетности предприятия.

← На главную