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