Как правильно настроить учет товаров: количество по складам, а себестоимость по всей компании?

Программист Управленческий учет Торговля и дистрибуция
← На главную

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

Проектирование структуры хранения: один регистр для двух задач

Основной вопрос — нужно ли создавать два разных регистра накопления для учета количества по складам и себестоимости по предприятию? Правильный ответ — нет, можно обойтись одним, если грамотно его спроектировать. Это упростит систему и уменьшит количество движений.

Создадим регистр накопления вида «Остатки», назовем его, например, ОстаткиТоваров. Структура регистра будет следующей:

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

Поступление и перемещение товаров

Документы, которые формируют движения по нашему регистру, — это основа системы. Рассмотрим основные из них.

Документ «ПриходнаяНакладная»

При проведении этот документ должен создавать движения вида «Приход». Для каждой строки табличной части документа создается одна запись в регистре ОстаткиТоваров, где указываются Номенклатура, Склад, Количество и Сумма (закупочная стоимость) поступившего товара.

Документ «ПеремещениеТоваров»

Этот документ отражает внутреннее движение остатков между складами. При его проведении себестоимость не меняется в рамках всей организации, но остатки на складах должны измениться. Поэтому документ создает две записи для каждой перемещаемой позиции:

  1. Расход со склада-отправителя (СкладОтправитель).
  2. Приход на склад-получатель (СкладПолучатель).

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

Расчет себестоимости при продаже: главные нюансы

Самая интересная часть — это проведение документа «РасходнаяНакладная». Здесь мы сталкиваемся с основной задачей: списать товар с конкретного склада, но рассчитать сумму списания (себестоимость) по средней цене для всей компании.

Типичная ошибка новичка: при списании записывать в ресурс Стоимость продажную цену из документа. Это неверно и приводит к отрицательным остаткам по стоимости, так как цена продажи почти всегда выше себестоимости.

Себестоимость не хранится, а рассчитывается в момент списания.

Давайте разберем на примере, почему важен разрез расчета:

Если считать себестоимость по складу, то при продаже со Склада №1 мы спишем по 50 руб., а со Склада №2 — по 75 руб. Но по условию задачи, нам нужна средняя по всей фирме. Общая стоимость 4 сапог в компании — 250 рублей. Средняя себестоимость: (100 + 150) / (2 + 2) = 62,5 руб./шт. Именно эту цифру мы должны использовать при списании с любого склада.

Алгоритм проведения «РасходнойНакладной»

Рассмотрим по шагам, что должно происходить в модуле объекта документа при проведении.

Шаг 1. Получение остатков для расчета средней себестоимости.

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


// Пример запроса для получения остатков по всей организации
Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |    ОстаткиТоваровОстатки.КоличествоОстаток,
    |    ОстаткиТоваровОстатки.СтоимостьОстаток
    |ИЗ
    |    РегистрНакопления.ОстаткиТоваров.Остатки(&МоментВремени, Номенклатура = &Номенклатура) КАК ОстаткиТоваровОстатки";

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);

Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
    ОбщееКоличествоОстаток = Результат.КоличествоОстаток;
    ОбщаяСтоимостьОстаток = Результат.СтоимостьОстаток;
КонецЕсли;

Шаг 2. Расчет суммы списания.

Теперь, имея общие остатки, мы можем рассчитать себестоимость одной единицы товара и сумму для списания.


Если ОбщееКоличествоОстаток > 0 Тогда
    СредняяСебестоимость = ОбщаяСтоимостьОстаток / ОбщееКоличествоОстаток;
    СуммаСписания = СредняяСебестоимость * СтрокаТабличнойЧасти.Количество;
Иначе
    // Обработка ситуации, когда остатков нет (хотя контроль остатков должен это предотвратить)
    СуммаСписания = 0;
КонецЕсли;

Шаг 3. Контроль остатков на складе продажи и создание движения.

Перед списанием обязательно нужно проверить, а есть ли нужное количество товара на конкретном складе, указанном в документе. После этого можно формировать движение вида «Расход».

Важный совет: обработка «копеек» при списании в ноль.

Из-за округлений при расчете средней себестоимости может возникнуть ситуация, когда после списания всего количества товара на остатке в регистре «зависает» небольшая сумма (например, 0.01 рубля) или, наоборот, образуется отрицательный остаток. Чтобы этого избежать, используйте простое правило: если вы списываете весь остаток товара по количеству, то списывайте и весь его остаток по стоимости.

Модифицируем расчет суммы списания:


// Получаем остаток на конкретном складе
КоличествоОстатокНаСкладе = ...; 

Если СтрокаТабличнойЧасти.Количество = КоличествоОстатокНаСкладе Тогда
    // Если списываем последнее, забираем всю оставшуюся стоимость
    // Важно: здесь нужно получить остаток стоимости именно по этому складу
    СуммаСписания = ПолучитьСтоимостьОстатокПоСкладу(...); 
Иначе
    // Расчет по средней, как и раньше
    Если ОбщееКоличествоОстаток > 0 Тогда
        СуммаСписания = (ОбщаяСтоимостьОстаток / ОбщееКоличествоОстаток) * СтрокаТабличнойЧасти.Количество;
    Иначе
        СуммаСписания = 0;
    КонецЕсли;
КонецЕсли;

Эта простая проверка сделает ваш учет гораздо точнее и избавит от проблем с «зависшими» суммами.

Что дальше? Другие методы расчета себестоимости

Мы рассмотрели расчет по средней. Это самый простой и распространенный метод в управленческом учете. Однако стоит знать, что существуют и другие методы, например, ФИФО (FIFO — First-In, First-Out), когда товары списываются по себестоимости той партии, которая пришла первой. Для реализации ФИФО потребуется усложнить структуру регистра, добавив в измерения Партия (обычно это документ поступления). Выбор метода расчета — это важное архитектурное решение, которое зависит от требований заказчика и правил учета на предприятии.

← На главную