Как реализовать списание материалов по средней себестоимости и учет их передачи в производство в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

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

1. Математический смысл и алгоритм расчета средней себестоимости

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

Рассмотрим пример расчета:

  1. На складе числится 1-я партия: 1 000 м ткани по цене 89,50 руб. (сумма 89 500 руб.).
  2. Поступила 2-я партия: 500 м ткани по цене 100,00 руб. (сумма 50 000 руб.).
  3. Поступила 3-я партия: 1 200 м ткани по цене 80,00 руб. (сумма 96 000 руб.).

Общий остаток ткани на складе составляет 2 700 м на общую сумму 235 500 руб. Если на производство требуется списать 2 000 м ткани, выполним расчет средней цены:

Средняя цена = Общая сумма остатка / Общее количество остатка = 235 500 / 2 700 = 87,222... руб. за 1 м.

Сумма списания в производство составит: 2 000 м * 87,222... руб. = 174 444,44 руб.

2. Разновидности метода средней: скользящая и средневзвешенная

Проанализируем две основные разновидности расчета средней себестоимости в системах 1С:

  1. Скользящая средняя: расчет себестоимости происходит оперативно непосредственно в момент проведения документа расхода. Берутся текущие актуальные остатки (количество и сумма) на момент времени документа. Именно этот подход применяется в учетных документах в течение месяца.
  2. Средневзвешенная средняя (за период): учитывает абсолютно все поступления за весь отчетный период (например, месяц). При таком подходе себестоимость, рассчитанная в течение месяца, является предварительной. Итоговая корректировка до средневзвешенной выполняется специальной регламентной процедурой закрытия месяца.

3. Архитектура регистров накопления

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

Сценарий 1: Одноэтапный выпуск (материалы списываются сразу в момент выпуска).

В этом случае достаточно одного регистра накопления остатков ОстаткиТМЦ (измерения: Номенклатура, Склад; ресурсы: Количество, Сумма):

  1. Документ ПриходнаяНакладная делает движение Приход по материалам.
  2. Документ ОтчетПроизводстваЗаСмену (или ВыпускПродукции) делает движение Расход по материалам (по рассчитанной средней сумме) и одновременно движение Приход по готовой продукции (на склад продукции по сумме, равной суммарной себестоимости списанных материалов).

Сценарий 2: Двухэтапный выпуск (передача в цех и выпуск разнесены во времени).

Если сырье передается в цех заранее, а выпуск готовой продукции происходит через несколько дней, требуется два регистра остатков:

  1. Регистр ОстаткиНоменклатуры (складской учет).
  2. Регистр МатериалыВПроизводстве или ЗатратыНаВыпуск (учет незавершенного производства). Измерения: Организация, Подразделение, Номенклатура (материал), Продукция (если выпуск адресный). Ресурсы: Количество, Сумма.

Логика движений документов в этом случае строится следующим образом:

  1. Документ ПередачаВПроизводство: делает Расход из регистра ОстаткиНоменклатуры (списывает сырье по средней себестоимости склада) и делает Приход в регистр МатериалыВПроизводстве на ту же сумму и количество.
  2. Документ ВыпускПродукции: делает Расход из регистра МатериалыВПроизводстве (списывает затраты НЗП) и делает Приход в регистр ОстаткиНоменклатуры для готовой продукции по сумме накопленных материальных затрат.

4. Программная реализация списания по скользящей средней

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

  1. Защита от деления на ноль: расчет стоимости должен производиться только при положительном количественном остатке.
  2. Проблема округлений и «хвостов»: если списывается весь доступный остаток номенклатуры (КоличествоСписания = КоличествоОстаток), сумма списания должна быть строго равна сумме остатка (СуммаСписания = СуммаОстаток). Деление и умножение в этом случае использовать нельзя, иначе на остатке могут остаться копейки при нулевом количестве.
  3. Использование блокировок данных: перед чтением остатков необходимо заблокировать пространство измерений регистра с помощью объекта БлокировкаДанных, чтобы избежать ошибок при параллельной работе пользователей.

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


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

Таким образом, использование предложенной схемы позволяет корректно списывать материальные ценности по скользящей средней, полностью исключить появление суммовых остатков («хвостов») при нулевом количестве и обеспечить прозрачный учет незавершенного производства.

← На главную