Как реализовать ежедневное начисление аренды в себестоимость товаров и построить отчет по динамике стоимости

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

В данной статье мы разберем решение интересной и важной задачи оперативного учета: как автоматизировать распределение затрат на аренду складов в себестоимость хранящихся на них товаров. Основная сложность заключается в том, что стоимость аренды может меняться ежедневно, а отчетность требует контроля динамики изменения цены в процентном соотношении к первоначальной стоимости закупки.

Проанализируем ситуацию: компания закупает товары, перемещает их между складами и каждый день платит за хранение. Эти затраты должны увеличивать себестоимость товара «на лету». Рассмотрим пошагово, как спроектировать метаданные и алгоритмы в системе 1С:Предприятие 8.3 для решения этой задачи.

Проектирование структуры регистров накопления

Первым делом выясним, какая структура регистров позволит нам не только хранить текущие остатки, но и отвечать на вопрос отчета: «Какова была начальная цена и на сколько процентов она выросла?». Если мы будем записывать всё в один ресурс Себестоимость, то со временем мы потеряем информацию о цене закупки.

Рассмотрим оптимальную структуру Регистра накопления «ОстаткиТоваров» (вид — Остатки):

Такое разделение ресурсов позволяет нам в любой момент вычислить полную себестоимость как СуммаЗакупки + СуммаАренды, сохранив при этом базу для расчета процентов (СуммаЗакупки).

Хранение стоимости аренды складов

Поскольку стоимость аренды зависит от склада и конкретного дня, нам необходим инструмент для хранения этой информации. Создадим Регистр сведений «СтоимостьАренды»:

Это позволит пользователю заранее или в день начисления устанавливать сумму, которую необходимо распределить по товарам на конкретном складе.

Логика работы документа «Начисление аренды»

Проанализируем алгоритм работы регламентного документа, который должен проводиться в конце дня. Задача документа — распределить ЦенаАренды из регистра сведений между всеми товарами, которые есть на остатке на выбранном складе пропорционально их количеству.

Разберем по шагам логику проведения документа:

  1. Получаем из регистра сведений стоимость аренды для склада документа на текущую дату.
  2. Запросом получаем остатки товаров на данном складе на момент проведения документа.
  3. Рассчитываем общее количество всех товаров на складе (база распределения).
  4. В цикле рассчитываем долю аренды для каждой позиции и формируем движения по регистру накопления (вид движения — Приход), заполняя только ресурс СуммаАренды.

Посмотрим на пример кода в обработке проведения:


Процедура ОбработкаПроведения(Отказ, Режим)
    
    // 1. Получаем ставку аренды
    Менеджер = РегистрыСведений.СтоимостьАренды.СоздатьМенеджерЗаписи();
    Менеджер.Склад = Склад;
    Менеджер.Период = Дата;
    Менеджер.Прочитать();
    
    Если Не Менеджер.Выбран() Тогда
        Сообщить("Не задана стоимость аренды для склада!");
        Возврат;
    КонецЕсли;
    
    СуммаКРаспределению = Менеджер.ЦенаАренды;
    
    // 2. Получаем остатки товаров
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ОстаткиТоваровОстатки.Товар КАК Товар,
        |   ОстаткиТоваровОстатки.КоличествоОстаток КАК Количество
        |ИЗ
        |   РегистрНакопления.ОстаткиТоваров.Остатки(&МоментВремени, Склад = &Склад) КАК ОстаткиТоваровОстатки";
    
    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
    Запрос.УстановитьПараметр("Склад", Склад);
    
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    ОбщееКоличество = Результат.Выгрузить().Итог("Количество");
    
    // 3. Распределяем сумму
    Пока Выборка.Следующий() Цикл
        Движение = Движения.ОстаткиТоваров.ДобавитьПриход();
        Движение.Период = Дата;
        Движение.Склад = Склад;
        Движение.Товар = Выборка.Товар;
        
        // Расчет пропорции
        ДоляАренды = (Выборка.Количество / ОбщееКоличество) * СуммаКРаспределению;
        Движение.СуммаАренды = ДоляАренды;
    КонецЦикла;
    
КонецПроцедуры

Важный момент: при распределении сумм всегда возникает проблема «копеек». Рекомендуется последней строке выборки присваивать остаток от общей суммы аренды, чтобы итоговая сумма распределения в точности совпадала с ценой аренды из регистра сведений.

Особенности перемещения товаров между складами

Рассмотрим ситуацию перемещения. Когда товар уходит со склада А на склад Б, он должен «унести» с собой не только закупочную цену, но и всю накопленную на нем аренду. Если этого не сделать, на новом складе себестоимость товара резко упадет, что исказит отчетность.

При проведении документа ПеремещениеТоваров необходимо:

  1. Списать со склада-отправителя Количество, СуммаЗакупки и СуммаАренды (пропорционально количеству).
  2. Приходовать на склад-получатель те же самые значения.

Для этого в запросе при проведении перемещения нужно получать не только остаток количества, но и остатки по обоим ресурсам сумм.

Построение отчета по динамике изменения себестоимости

Теперь выясним, как реализовать отчет, представленный в задаче. Нам нужно вывести таблицу, где строки — это товары, колонки — даты, а в ячейках — процент стоимости от начальной.

Разберем настройки Системы Компоновки Данных (СКД):

  1. Источник данных: Используем виртуальную таблицу РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты с периодичностью «День».
  2. Вычисляемые поля: Создадим поле ПроцентСтоимости. Формула будет выглядеть так:

    (СуммаЗакупкиОстаток + СуммаАрендыОстаток) / СуммаЗакупкиОстаток * 100

  3. Настройки структуры:
    • Добавляем таблицу.
    • В строки таблицы добавляем группировку Товар.
    • В колонки таблицы добавляем группировку ПериодДень.
    • В выбранные поля добавляем наше вычисляемое поле ПроцентСтоимости.
  4. Роли полей: Для поля Период в наборе данных нужно указать «Дополнение периодов», чтобы отчет показывал колонки даже за те дни, когда по товару не было движений, но он лежал на складе.

Проанализируем, как это будет работать. В первый день, когда товар только поступил, СуммаАренды равна 0, и формула даст 100%. На следующий день документ «Начисление аренды» добавит сумму в ресурс СуммаАренды. Формула рассчитает, например, 102.34%. Если движений по товару больше не будет, СКД благодаря механизму дополнения периодов «протянет» это значение на все последующие даты.

Резюме и практические советы

Для успешного решения подобных задач придерживайтесь следующих правил:

Предложенная модель является гибкой и легко масштабируемой. Например, если потребуется распределять аренду не пропорционально количеству, а пропорционально весу или объему, достаточно будет добавить соответствующий реквизит в справочник Товары и изменить формулу расчета коэффициента в документе начисления.

← На главную