В данной статье мы разберем решение интересной и важной задачи оперативного учета: как автоматизировать распределение затрат на аренду складов в себестоимость хранящихся на них товаров. Основная сложность заключается в том, что стоимость аренды может меняться ежедневно, а отчетность требует контроля динамики изменения цены в процентном соотношении к первоначальной стоимости закупки.
Проанализируем ситуацию: компания закупает товары, перемещает их между складами и каждый день платит за хранение. Эти затраты должны увеличивать себестоимость товара «на лету». Рассмотрим пошагово, как спроектировать метаданные и алгоритмы в системе 1С:Предприятие 8.3 для решения этой задачи.
Первым делом выясним, какая структура регистров позволит нам не только хранить текущие остатки, но и отвечать на вопрос отчета: «Какова была начальная цена и на сколько процентов она выросла?». Если мы будем записывать всё в один ресурс Себестоимость, то со временем мы потеряем информацию о цене закупки.
Рассмотрим оптимальную структуру Регистра накопления «ОстаткиТоваров» (вид — Остатки):
Товар (СправочникСсылка.Товары), Склад (СправочникСсылка.Склады).Количество (Число);СуммаЗакупки (Число) — здесь мы храним только «чистую» стоимость без учета аренды;СуммаАренды (Число) — здесь мы накапливаем распределенные доп. расходы.Такое разделение ресурсов позволяет нам в любой момент вычислить полную себестоимость как СуммаЗакупки + СуммаАренды, сохранив при этом базу для расчета процентов (СуммаЗакупки).
Поскольку стоимость аренды зависит от склада и конкретного дня, нам необходим инструмент для хранения этой информации. Создадим Регистр сведений «СтоимостьАренды»:
Склад.ЦенаАренды (Число).Это позволит пользователю заранее или в день начисления устанавливать сумму, которую необходимо распределить по товарам на конкретном складе.
Проанализируем алгоритм работы регламентного документа, который должен проводиться в конце дня. Задача документа — распределить ЦенаАренды из регистра сведений между всеми товарами, которые есть на остатке на выбранном складе пропорционально их количеству.
Разберем по шагам логику проведения документа:
СуммаАренды.Посмотрим на пример кода в обработке проведения:
Процедура ОбработкаПроведения(Отказ, Режим)
// 1. Получаем ставку аренды
Менеджер = РегистрыСведений.СтоимостьАренды.СоздатьМенеджерЗаписи();
Менеджер.Склад = Склад;
Менеджер.Период = Дата;
Менеджер.Прочитать();
Если Не Менеджер.Выбран() Тогда
Сообщить("Не задана стоимость аренды для склада!");
Возврат;
КонецЕсли;
СуммаКРаспределению = Менеджер.ЦенаАренды;
// 2. Получаем остатки товаров
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровОстатки.Товар КАК Товар,
| ОстаткиТоваровОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(&МоментВремени, Склад = &Склад) КАК ОстаткиТоваровОстатки";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ОбщееКоличество = Результат.Выгрузить().Итог("Количество");
// 3. Распределяем сумму
Пока Выборка.Следующий() Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьПриход();
Движение.Период = Дата;
Движение.Склад = Склад;
Движение.Товар = Выборка.Товар;
// Расчет пропорции
ДоляАренды = (Выборка.Количество / ОбщееКоличество) * СуммаКРаспределению;
Движение.СуммаАренды = ДоляАренды;
КонецЦикла;
КонецПроцедуры
Важный момент: при распределении сумм всегда возникает проблема «копеек». Рекомендуется последней строке выборки присваивать остаток от общей суммы аренды, чтобы итоговая сумма распределения в точности совпадала с ценой аренды из регистра сведений.
Рассмотрим ситуацию перемещения. Когда товар уходит со склада А на склад Б, он должен «унести» с собой не только закупочную цену, но и всю накопленную на нем аренду. Если этого не сделать, на новом складе себестоимость товара резко упадет, что исказит отчетность.
При проведении документа ПеремещениеТоваров необходимо:
Количество, СуммаЗакупки и СуммаАренды (пропорционально количеству).Для этого в запросе при проведении перемещения нужно получать не только остаток количества, но и остатки по обоим ресурсам сумм.
Теперь выясним, как реализовать отчет, представленный в задаче. Нам нужно вывести таблицу, где строки — это товары, колонки — даты, а в ячейках — процент стоимости от начальной.
Разберем настройки Системы Компоновки Данных (СКД):
РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты с периодичностью «День».ПроцентСтоимости. Формула будет выглядеть так:
(СуммаЗакупкиОстаток + СуммаАрендыОстаток) / СуммаЗакупкиОстаток * 100
Товар.ПериодДень.ПроцентСтоимости.Период в наборе данных нужно указать «Дополнение периодов», чтобы отчет показывал колонки даже за те дни, когда по товару не было движений, но он лежал на складе.Проанализируем, как это будет работать. В первый день, когда товар только поступил, СуммаАренды равна 0, и формула даст 100%. На следующий день документ «Начисление аренды» добавит сумму в ресурс СуммаАренды. Формула рассчитает, например, 102.34%. Если движений по товару больше не будет, СКД благодаря механизму дополнения периодов «протянет» это значение на все последующие даты.
Для успешного решения подобных задач придерживайтесь следующих правил:
23:59:59, чтобы захватывать все складские движения текущего дня (поступления и перемещения).СуммаЗакупки не равна нулю, иначе отчет выдаст ошибку при попытке рассчитать процент для разукомплектованного или некорректно оприходованного товара.Предложенная модель является гибкой и легко масштабируемой. Например, если потребуется распределять аренду не пропорционально количеству, а пропорционально весу или объему, достаточно будет добавить соответствующий реквизит в справочник Товары и изменить формулу расчета коэффициента в документе начисления.