Как правильно спроектировать регистры накопления для складского учета, себестоимости и продаж в 1С?

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

При разработке собственной конфигурации или доработке типовых решений разработчики часто сталкиваются с ситуацией, когда регистр остатков ведет себя некорректно: при нулевом количестве товара зависает отрицательная сумма, либо расходные накладные не списывают остаток из-за несовпадения аналитики. Выясним причину такого поведения и разберем архитектурно правильный подход к построению учета товаров на платформе «1С:Предприятие».

Анализ типичных ошибок при проектировании регистра остатков

Рассмотрим распространенные ошибки, которые приводят к искажению данных в базе:

  1. Хранение неаддитивных показателей в ресурсах. Ресурсы регистров накопления с видом «Остатки» всегда суммируются платформой. Цена является расчетной величиной, ее нельзя складывать или вычитать. Если приходовать товар по цене 150 рублей, а списывать по цене продажи 450 рублей, то при нулевом количестве остаток по ресурсу цены составит -300 рублей. В ресурсах допустимо хранить только абсолютные показатели: Количество и Сумма (или Стоимость).
  2. Смешивание закупочных и продажных цен. Регистр остатков предназначен для фиксации того, что физически лежит на складе, и оценки стоимости этих активов (в ценах поступления). Стоимость продажи (выручка) относится к финансовому результату сделки и не имеет отношения к складскому запасу.
  3. Использование переменных аналитик в измерениях регистра остатков. Если добавить в измерения поле Ответственный (менеджер), то документ закупки зафиксирует плюс по сотруднику Иванову. Когда документ реализации проведет менеджер Петров, система попытается списать товар по ключу с Петровым. В итоге по Иванову останется вечный плюс, а по Петрову возникнет отрицательный остаток. Аналитика складского остатка должна быть жестко привязана к месту хранения.

Классическая трехзвенная схема учета товаров

По стандартам разработки 1С задачи складского контроля, оценки себестоимости и анализа выручки разделяются на три отдельных регистра накопления. Разберем назначение каждого из них.

  1. Регистр остатков «ТоварыНаСкладах» (физический учет):

    Отвечает исключительно за контроль наличия физических единиц на складах.

    • Вид регистра: Остатки.
    • Измерения: Номенклатура, Склад (при необходимости — Характеристика, Серия).
    • Ресурсы: Количество.

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

  2. Регистр остатков «СтоимостьТоваров» или «ПартииТоваров» (финансовый учет запасов):

    Служит для расчета себестоимости списания (по средней цене или методом FIFO).

    • Вид регистра: Остатки.
    • Измерения: Организация, Номенклатура (при учете по FIFO добавляется Партия — документ поступления). Измерение Склад добавляется только в том случае, если на предприятии себестоимость рассчитывается отдельно по каждому складу.
    • Ресурсы: Количество, Стоимость.
  3. Регистр оборотов «Продажи» (управленческий анализ сделок):

    Фиксирует факт торговых операций для отчетов руководства и расчета мотивации менеджеров.

    • Вид регистра: Обороты.
    • Измерения: Организация, Номенклатура, Контрагент, Менеджер, Склад.
    • Ресурсы: Количество, Выручка, Себестоимость.

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

Реализация списания остатков и контроля минусов

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


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

КонецПроцедуры

Расчет себестоимости по средней и защита от копеек

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


// Пример алгоритма расчета себестоимости списания
Если КоличествоСписания = ОстатокКоличество Тогда
    // Если списываем весь остаток номенклатуры, полностью списываем и всю сумму
    СебестоимостьСписания = ОстатокСтоимость;
Иначе
    // Расчет средней себестоимости
    СебестоимостьСписания = (ОстатокСтоимость / ОстатокКоличество) * КоличествоСписания;
    СебестоимостьСписания = Окр(СебестоимостьСписания, 2);
КонецЕсли;

Соблюдение разделения регистров на количественные, количественно-суммовые и оборотные позволяет прозрачно вести учет, исключает появление зависших сумм и упрощает построение аналитических отчетов в СКД.

← На главную