При разработке производственного контура в конфигурациях на платформе 1С:Предприятие одной из ключевых задач является правильный расчет себестоимости списываемых материалов и корректное отражение затрат на выпуск готовой продукции. Разберем, как программно устроен механизм расчета средней себестоимости, как спроектировать регистры накопления и как связать этапы передачи сырья и выпуска готовых изделий.
В отличие от партионного учета (например, по методам ФИФО или ЛИФО), где каждая партия списывается последовательно по своей исходной цене, при учете по средней себестоимости все остатки конкретной номенклатурной позиции обезличиваются. Цена списания единицы рассчитывается как отношение общей совокупной стоимости остатка к его общему количеству.
Рассмотрим пример расчета:
Общий остаток ткани на складе составляет 2 700 м на общую сумму 235 500 руб. Если на производство требуется списать 2 000 м ткани, выполним расчет средней цены:
Средняя цена = Общая сумма остатка / Общее количество остатка = 235 500 / 2 700 = 87,222... руб. за 1 м.
Сумма списания в производство составит: 2 000 м * 87,222... руб. = 174 444,44 руб.
Проанализируем две основные разновидности расчета средней себестоимости в системах 1С:
Выясним, какие регистры требуются для корректного отражения цепочки «Склад сырья -> Производство -> Склад готовой продукции». Структура зависит от того, разнесены ли во времени передача материалов и выпуск готовой продукции.
Сценарий 1: Одноэтапный выпуск (материалы списываются сразу в момент выпуска).
В этом случае достаточно одного регистра накопления остатков ОстаткиТМЦ (измерения: Номенклатура, Склад; ресурсы: Количество, Сумма):
ПриходнаяНакладная делает движение Приход по материалам.ОтчетПроизводстваЗаСмену (или ВыпускПродукции) делает движение Расход по материалам (по рассчитанной средней сумме) и одновременно движение Приход по готовой продукции (на склад продукции по сумме, равной суммарной себестоимости списанных материалов).Сценарий 2: Двухэтапный выпуск (передача в цех и выпуск разнесены во времени).
Если сырье передается в цех заранее, а выпуск готовой продукции происходит через несколько дней, требуется два регистра остатков:
ОстаткиНоменклатуры (складской учет).МатериалыВПроизводстве или ЗатратыНаВыпуск (учет незавершенного производства). Измерения: Организация, Подразделение, Номенклатура (материал), Продукция (если выпуск адресный). Ресурсы: Количество, Сумма.Логика движений документов в этом случае строится следующим образом:
ПередачаВПроизводство: делает Расход из регистра ОстаткиНоменклатуры (списывает сырье по средней себестоимости склада) и делает Приход в регистр МатериалыВПроизводстве на ту же сумму и количество.ВыпускПродукции: делает Расход из регистра МатериалыВПроизводстве (списывает затраты НЗП) и делает Приход в регистр ОстаткиНоменклатуры для готовой продукции по сумме накопленных материальных затрат.Разберем по шагам типовой алгоритм списания по средней стоимости в модуле проведения документа. Обратим внимание на три критически важных нюанса:
КоличествоСписания = КоличествоОстаток), сумма списания должна быть строго равна сумме остатка (СуммаСписания = СуммаОстаток). Деление и умножение в этом случае использовать нельзя, иначе на остатке могут остаться копейки при нулевом количестве.БлокировкаДанных, чтобы избежать ошибок при параллельной работе пользователей.Посмотрим на пример кода в процедуре ОбработкаПроведения:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Устанавливаем управляемую блокировку данных
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ЭтотОбъект.Материалы;
ЭлементБлокировки.ИспользоватьИмяИсточника(ПланыВидовХарактеристик.СвойстваОбъектов.Номенклатура, "Номенклатура");
Блокировка.Заблокировать();
// Получаем актуальные остатки номенклатуры на момент проведения
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Номенклатура КАК Номенклатура,
| СУММА(Док.Количество) КАК Количество
|ПОМЕСТИТЬ ВТ_ТоварыДокумента
|ИЗ
| Документ.ПередачаВПроизводство.Материалы КАК Док
|ГДЕ
| Док.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| Док.Номенклатура
|;
|
|ВЫБРАТЬ
| ВТ.Номенклатура КАК Номенклатура,
| ВТ.Количество КАК КоличествоВДокументе,
| ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(Остатки.СуммаОстаток, 0) КАК СуммаОстаток
|ИЗ
| ВТ_ТоварыДокумента КАК ВТ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &МоментВремени,
| Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ_ТоварыДокумента КАК ВТ)
| И Склад = &Склад
| ) КАК Остатки
| ПО ВТ.Номенклатура = Остатки.Номенклатура";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Склад", Склад);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Контроль остатков
Если Выборка.КоличествоВДокументе > Выборка.КоличествоОстаток Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон("Недостаточно остатка по номенклатуре %1. Требуется: %2, в наличии: %3",
Выборка.Номенклатура, Выборка.КоличествоВДокументе, Выборка.КоличествоОстаток);
Сообщение.Сообщить();
Отказ = Истина;
Продолжить;
КонецЕсли;
// Расчет суммы списания по средней стоимости
Если Выборка.КоличествоВДокументе = Выборка.КоличествоОстаток Тогда
// Списываем под ноль без округлений
СуммаСписания = Выборка.СуммаОстаток;
Иначе
СредняяЦена = Выборка.СуммаОстаток / Выборка.КоличествоОстаток;
СуммаСписания = Окр(Выборка.КоличествоВДокументе * СредняяЦена, 2);
КонецЕсли;
// 1. Расход со склада
ДвижениеСклад = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
ДвижениеСклад.Период = Дата;
ДвижениеСклад.Номенклатура = Выборка.Номенклатура;
ДвижениеСклад.Склад = Склад;
ДвижениеСклад.Количество = Выборка.КоличествоВДокументе;
ДвижениеСклад.Сумма = СуммаСписания;
// 2. Приход в незавершенное производство
ДвижениеНЗП = Движения.МатериалыВПроизводстве.ДобавитьПриход();
ДвижениеНЗП.Период = Дата;
ДвижениеНЗП.Подразделение = Подразделение;
ДвижениеНЗП.Номенклатура = Выборка.Номенклатура;
ДвижениеНЗП.Количество = Выборка.КоличествоВДокументе;
ДвижениеНЗП.Сумма = СуммаСписания;
КонецЦикла;
КонецПроцедуры
Таким образом, использование предложенной схемы позволяет корректно списывать материальные ценности по скользящей средней, полностью исключить появление суммовых остатков («хвостов») при нулевом количестве и обеспечить прозрачный учет незавершенного производства.