При разработке отчетов по финансовому результату в конфигурациях на базе 1С:ERP, УТ 11 или КА 2, основной массив данных черпается из регистра накопления ВыручкаИСебестоимостьПродаж. Одной из самых частых проблем, с которой сталкиваются начинающие разработчики, является «размножение» строк в результате выполнения запроса. Вместо одной сгруппированной строки по клиенту или менеджеру система выдает несколько строк с разными суммами. Рассмотрим подробнее, почему это происходит и как составить корректный запрос.
Проанализируем ситуацию, описанную в теме. Автор пытается получить данные о выручке, но в консоли запросов или в результате вывода отчета строки по одному и тому же контрагенту не схлопываются. Посмотрим на пример некорректного кода, который часто генерируется конструктором запросов при неправильном выборе полей:
ВЫБРАТЬ
ВыручкаИСебестоимостьПродажОбороты.КоличествоОборот КАК КоличествоОборот,
СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот) КАК СуммаВыручкиОборот,
ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
ВыручкаИСебестоимостьПродажОбороты.ХозяйственнаяОперация КАК ХозяйственнаяОперация
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ВыручкаИСебестоимостьПродажОбороты
ГДЕ
ВыручкаИСебестоимостьПродажОбороты.ХозяйственнаяОперация = &хо
СГРУППИРОВАТЬ ПО
ВыручкаИСебестоимостьПродажОбороты.КоличествоОборот,
ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер,
ВыручкаИСебестоимостьПродажОбороты.ХозяйственнаяОперация
Выясним причину, по которой такой запрос не будет работать корректно. Главная ошибка здесь заключается в секции СГРУППИРОВАТЬ ПО. Обратите внимание, что туда включено поле КоличествоОборот. В языке запросов 1С (как и в стандартном SQL) группировка происходит по уникальным сочетаниям всех полей, перечисленных после ключевого слова СГРУППИРОВАТЬ ПО. Если в одной продаже было 10 единиц товара, а в другой — 5, то система воспримет их как разные записи и не суммирует выручку, так как значения в колонке «Количество» различаются.
Важное правило: никогда не включайте ресурсы (числовые показатели, которые нужно складывать) в список группировки. За это, как справедливо заметили на форуме, «бьют по пальцам», так как это фундаментальная ошибка понимания работы БД.
Для того чтобы данные объединились, нам необходимо оставить в группировке только те поля, которые определяют аналитический разрез (измерения), а все числовые показатели обернуть в агрегатную функцию СУММА(). Разберем правильную структуру запроса для получения валовой прибыли в разрезе менеджера и клиента.
ВЫБРАТЬ
ВыручкаИСебестоимостьПродажОбороты.Менеджер КАК Менеджер,
ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот) КАК СуммаВыручки,
СУММА(ВыручкаИСебестоимостьПродажОбороты.СебестоимостьОборот) КАК Себестоимость,
СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот - ВыручкаИСебестоимостьПродажОбороты.СебестоимостьОборот) КАК ВаловаяПрибыль
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ВыручкаИСебестоимостьПродажОбороты
СГРУППИРОВАТЬ ПО
ВыручкаИСебестоимостьПродажОбороты.Менеджер,
ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер
В данном примере мы используем только те поля, по которым нам действительно нужно разделить данные. Все остальное суммируется. Если у одного менеджера было 100 продаж одному и тому же партнеру, запрос вернет одну строку с общим итогом.
При построении подобных запросов важно учитывать специфику архитектуры современных конфигураций 1С. Рассмотрим несколько критически важных моментов:
Партнеры, а к ключу аналитики. Поэтому обращение АналитикаУчетаПоПартнерам.Партнер является правильным и необходимым. Это позволяет системе корректно обрабатывать ситуации, когда у одного партнера есть несколько контрагентов.Менеджер в регистре заполняется из документа продажи (например, «Реализация товаров и услуг»). Если вам нужно получить отчет по «Основному менеджеру», который закреплен в карточке клиента, запрос придется усложнить, добавив левое соединение со справочником Партнеры по ссылке.СуммаВыручкиБезНДС или СуммаВыручкиРегл, иначе вы рискуете «сложить яблоки с апельсинами».Часто бизнес-аналитики просят вывести в одном отчете не только прибыль, но и сумму предоставленных скидок. Проанализируем, как это реализовать. В регистре ВыручкаИСебестоимостьПродаж есть отдельные ресурсы для автоматических и ручных скидок. Чтобы вывести их, достаточно добавить соответствующие поля в секцию выбора с использованием функции СУММА():
СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаАвтоматическойСкидкиОборот) КАК АвтоСкидка,
СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаРучнойСкидкиОборот) КАК РучнаяСкидка
Если в вашем регистре эти поля отсутствуют (зависит от версии конфигурации), сумму скидки можно вычислить как разницу между суммой продаж в ценах прайс-листа и фактической выручкой. Однако типовой регистр в большинстве случаев уже содержит эти данные в готовом виде.
Для создания качественного отчета по валовой прибыли придерживайтесь следующего алгоритма:
Менеджер, Партнер, Номенклатура (если нужен детальный отчет).СУММА().Следуя этим правилам, вы получите быстрый и точный запрос, который станет надежной основой для управленческой отчетности предприятия.