При разработке отчетов по анализу запасов в 1С:Управление торговлей 10.3 программисты часто сталкиваются с проблемой: показатели оборачиваемости (коэффициенты, доли, проценты) корректно отображаются только в детальных записях (по конкретному товару), но в группировках по складам или категориям система их просто суммирует. В результате вместо реального коэффициента мы получаем огромные, лишенные смысла числа. Рассмотрим подробно, почему это происходит и как заставить Универсальный отчет (и лежащий в его основе Построитель отчетов) вычислять итоги правильно.
Основная проблема заключается в математической природе коэффициентов. В отличие от суммы выручки или количества проданного товара, коэффициент оборачиваемости является неаддитивной величиной. Это значит, что его нельзя просто складывать. Если для одного товара коэффициент равен 0.5, а для другого — 0.3, то для группы этих товаров коэффициент не будет равен 0.8. Он должен быть рассчитан заново по формуле: СуммаОборотаГруппы / СреднийОстатокГруппы.
В стандартном Универсальном отчете, если в секции ИТОГИ указано СУММА(КоэфОборачиваемости), платформа просто складывает значения из нижних уровней. Наша задача — изменить логику расчета агрегатов.
Разберем, как изменить текст запроса, чтобы итоги считались по формуле. Посмотрим на классический пример использования секции ИТОГИ в Построителе отчетов. Вместо перечисления полей через СУММА, мы можем прописать произвольное выражение.
Проанализируем фрагмент кода, который необходимо внедрить в запрос:
ИТОГИ
СУММА(СреднедневнойОстаток),
СУММА(ОборотСебестоимость),
ВЫБОР
КОГДА СУММА(СреднедневнойОстаток) = 0 ТОГДА 0
ИНАЧЕ СУММА(ОборотСебестоимость) / СУММА(СреднедневнойОстаток)
КОНЕЦ КАК КоэфОборачиваемости
ПО
ОБЩИЕ,
Номенклатура,
Склад
Важный момент: использование такой конструкции в Построителе отчетов заставляет систему сначала вычислить суммы числителя и знаменателя для каждой группировки, и только потом выполнить деление. Это гарантирует математическую точность на любом уровне иерархии.
Для корректной оборачиваемости крайне важно правильно рассчитать знаменатель — СреднедневнойОстаток. В предоставленном примере запроса автор использует соединение с производственным календарем ВТ_Дни. Это верный, хоть и ресурсоемкий путь.
Рассмотрим более производительный вариант получения данных через виртуальную таблицу ОстаткиИОбороты с периодичностью ДЕНЬ. Выясним причину, почему это лучше: система 1С оптимизирована для работы со своими виртуальными таблицами, что сокращает нагрузку на SQL-сервер.
Пример получения ежедневных остатков для последующего усреднения:
ВЫБРАТЬ
ПартииТоваров.Номенклатура КАК Номенклатура,
ПартииТоваров.Склад КАК Склад,
ПартииТоваров.Период КАК ДатаДень,
ПартииТоваров.СтоимостьКонечныйОстаток КАК ОстатокНаДень
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&ДатаНачала, &ДатаКонца, ДЕНЬ, , ) КАК ПартииТоваров
После получения этих данных в промежуточную таблицу, расчет среднего остатка по формуле (сумма остатков на каждый день / количество дней в периоде) даст нам ту самую базу, которую можно безопасно суммировать в итогах (СУММА(СреднедневнойОстаток)) перед делением на общий оборот.
Посмотрим на ситуацию, когда товар лежал на складе (есть остаток), но не продавался (оборот равен нулю). В этом случае КоэфОборачиваемости будет равен 0, что верно. Однако расчет показателя Оборачиваемость в днях может привести к ошибке деления на ноль.
Рассмотрим правильную логику расчета этого показателя в итогах:
ОборачиваемостьВТ_Днях = КоличествоДнейПериода / КоэфОборачиваемости.В запросе это будет выглядеть следующим образом:
ВЫБОР
КОГДА СУММА(ОборотСебестоимость) = 0 ТОГДА 0
ИНАЧЕ (СУММА(СреднедневнойОстаток) * &КоличествоДней) / СУММА(ОборотСебестоимость)
КОНЕЦ КАК ОборачиваемостьВДнях
Хотя Универсальный отчет в УТ 10.3 базируется на построителе, современные конфигурации используют СКД. Если вы решите перенести этот отчет на СКД, проблема итогов решается еще проще — через Ресурсы.
Выполним следующие шаги в настройке ресурсов СКД:
КоэфОборачиваемости в список ресурсов.Сумма(ОборотСебестоимость) / Сумма(СреднедневнойОстаток).Преимущество СКД: вам не нужно вручную прописывать ВЫБОР КОГДА в итогах запроса, система сама применит агрегатные функции к составляющим формулы перед вычислением результата для итоговой строки.
Проанализируем несколько моментов, которые могут исказить ваш "красивый" отчет даже при правильных формулах:
1. Внутригрупповые перемещения. Если вы берете оборот по регистру ПартииТоваровНаСкладах без фильтра по типу документа, то перемещение товара между складами будет воспринято системой как "расход" (оборот). Это искусственно завысит оборачиваемость. Всегда фильтруйте только продажи внешним покупателям.
2. Новые товары. Если товар поступил в середине месяца, его средний остаток, рассчитанный как (Нач+Кон)/2, будет некорректным. Именно поэтому использование ежедневных срезов (как в примере автора через ВТ_Дни) является более профессиональным подходом.
3. Возвраты товаров. Оборот должен считаться как Продажи - Возвраты. В противном случае массовые возвраты (например, в торговле одеждой) создадут иллюзию высокой оборачиваемости, которой на самом деле нет.
Используя приведенные методики корректировки секции ИТОГИ и внимательно следя за чистотой данных в оборотах, вы получите надежный инструмент для анализа складских запасов, который будет показывать верные данные как по каждой позиции, так и по предприятию в целом.