При разработке учетной системы с нуля часто возникает задача: как правильно хранить информацию о товарах? Требуется видеть остатки в разрезе каждого склада, но при этом себестоимость для списания при продаже нужно считать в целом по предприятию. Разберем, как спроектировать такую систему, используя один регистр накопления, и какие нюансы учесть при расчете себестоимости.
Основной вопрос — нужно ли создавать два разных регистра накопления для учета количества по складам и себестоимости по предприятию? Правильный ответ — нет, можно обойтись одним, если грамотно его спроектировать. Это упростит систему и уменьшит количество движений.
Создадим регистр накопления вида «Остатки», назовем его, например, ОстаткиТоваров. Структура регистра будет следующей:
Номенклатура (тип СправочникСсылка.Номенклатура) — товар, который мы учитываем.Склад (тип СправочникСсылка.Склады) — место хранения товара.Количество (число) — количество товара в базовых единицах измерения.Стоимость (число) — закупочная стоимость, которая и будет формировать себестоимость.Такая структура позволяет нам получать данные в разных разрезах (срезах). Если нам нужны остатки на конкретном складе, мы делаем отбор по измерениям Номенклатура и Склад. Если же нам нужны данные по всей компании для расчета средней себестоимости, мы просто игнорируем измерение Склад и группируем данные только по Номенклатура.
Документы, которые формируют движения по нашему регистру, — это основа системы. Рассмотрим основные из них.
Документ «ПриходнаяНакладная»
При проведении этот документ должен создавать движения вида «Приход». Для каждой строки табличной части документа создается одна запись в регистре ОстаткиТоваров, где указываются Номенклатура, Склад, Количество и Сумма (закупочная стоимость) поступившего товара.
Документ «ПеремещениеТоваров»
Этот документ отражает внутреннее движение остатков между складами. При его проведении себестоимость не меняется в рамках всей организации, но остатки на складах должны измениться. Поэтому документ создает две записи для каждой перемещаемой позиции:
СкладОтправитель).СкладПолучатель).Количество и стоимость в обеих записях одинаковы. Общий итог по регистру в целом по компании не меняется.
Самая интересная часть — это проведение документа «РасходнаяНакладная». Здесь мы сталкиваемся с основной задачей: списать товар с конкретного склада, но рассчитать сумму списания (себестоимость) по средней цене для всей компании.
Типичная ошибка новичка: при списании записывать в ресурс Стоимость продажную цену из документа. Это неверно и приводит к отрицательным остаткам по стоимости, так как цена продажи почти всегда выше себестоимости.
Себестоимость не хранится, а рассчитывается в момент списания.
Давайте разберем на примере, почему важен разрез расчета:
Если считать себестоимость по складу, то при продаже со Склада №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), когда товары списываются по себестоимости той партии, которая пришла первой. Для реализации ФИФО потребуется усложнить структуру регистра, добавив в измерения Партия (обычно это документ поступления). Выбор метода расчета — это важное архитектурное решение, которое зависит от требований заказчика и правил учета на предприятии.