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