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