При отпуске материалов в производство или ином выбытии их оценка для целей бухгалтерского учета производится одним из следующих способов:
- по себестоимости каждой единицы;
- по средней себестоимости;
- по себестоимости первых по времени приобретений (способ ФИФО).
При списании сырья и материалов, используемых при производстве (изготовлении) товаров (выполнении работ, оказании услуг), для целей налогообложения применяется один из следующих методов оценки указанного сырья и материалов:
- метод оценки по стоимости единицы запасов;
- метод оценки по средней стоимости;
- метод оценки по стоимости первых по времени приобретений (ФИФО);
- метод оценки по стоимости последних по времени приобретений (ЛИФО).
Списание товаров по средней себестоимости
Способ списания товаров "по средней себестоимости" предполагает расчет себестоимости единицы учета запасов по следующей формуле:
СредняяСебестоимостьЕдиницыЗапасов = (СебестоимостьОстаткаНаНачалоПериода + СебестоимостьПоступившихЗаПериод) / (КоличествоНаНачалоПериода + КоличествоПоступившихЗаПериод)
В "старой" методике контроля остатков это реализовано следующим образом:
1 2 3 4 5 6 7 |
// решим "проблему копеек" Если ВыборкаДетальныеЗаписи.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОстаток Иначе Движение.Сумма = ВыборкаДетальныеЗаписи.Количество/ВыборкаДетальныеЗаписи.КоличествоОстаток * ВыборкаДетальныеЗаписи.СуммаОстаток; |
Периодом может быть месяц или другой, определенный организацией, временной интервал.
Списание товаров по методу ФИФО (FIFO)
Название способа ФИФО (FIFO) расшифровывается как "first in - first out", т.е. "первый пришел - первый ушел".
Метод основан на допущении, что материально-производственные запасы (в том числе товары) используются в той последовательности, в которой они приобретались. Т.е запасы, первыми поступающие в производство (продажу), оцениваются по себестоимости первых по времени приобретения запасов, числящихся на складе. Таким образом, в себестоимости проданных товаров учитывается себестоимость ранних по времени приобретений, а запасы на складе на конец месяца оцениваются по себестоимости последних по времени приобретений.
Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа – «Расходная накладная». Помимо продажи товаров компания может оказывать дополнительные услуги, например, по доставке. И услуги, и товары указываются в одной табличной части.
Складской учет товаров не ведется.
При проведении «Расходной накладной» при нехватке товара программа должна выдавать соответствующее предупреждение с указанием количества «нехватки» и не позволять проводить такой документ.
Списание себестоимости товаров должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в Учетной политике компании метода списания себестоимости (FIFO или LIFO). Обратите внимание – Учетная политика действует год. На следующий год метод списания может измениться.
Необходимо построить отчеты по продажам товаров за период и остаткам товара на указанную дату.
Алгоритм обработки проведения по методу ФИФО (FIFO)
- Создать перечисление
УчетнаяПолитика
со значениями "ФИФО", "ЛИФО", "Средняя" - для хранения вариантов учетной политики. - Создаем регистр сведений (периодический)
УчетнаяПолитика
(по нему будем определять метод учетной политики на дату документа):- периодичность - по заданию (например,
В пределах года
); - режим записи -
Независимый
; - добавить его в подсистему (например, ОУ);
- вкладка "Данные" - добавить ресурс
МетодСписанияСебестоимости
с типомПеречислениеСсылка.УчетнаяПолитика
.
- периодичность - по заданию (например,
- В регистре накопления
ОстаткиНоменклатуры
создать:- измерение
Партия
с типомДокументСсылка.ПриходнаяНакладная
; - ресурс
Себестоимость
.
- измерение
- В обработке проведения документа
ПриходнаяНакладная
:- определить текущий метод списания себестоимости;
Код123456789101112МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписанияСебестоимости;Если НЕ ЗначениеЗаполнено(МетодСписания) ТогдаСообщение = Новый СообщениеПользователю;Сообщение.Текст = "Не задан метод списания учетной политики";Сообщение.Сообщить();// отказ в проведенииОтказ = Истина;Возврат;КонецЕсли;[свернуть]
- добавить строку
Движение.Партия = Ссылка;
- сопоставить ресурс
Себестоимость
регистра накопления с полемСумма
, полученным с помощью запроса из документаКод процедуры ОбработкаПроведения123456789101112131415161718192021222324252627282930313233343536Процедура ОбработкаПроведения(Отказ, Режим)Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,| СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,| СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма|ИЗ| Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры|ГДЕ| ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка||СГРУППИРОВАТЬ ПО| ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура";Запрос.УстановитьПараметр("Ссылка", Ссылка);РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();Пока ВыборкаДетальныеЗаписи.Следующий() Цикл// регистр ОстаткиНоменклатуры ПриходДвижение = Движения.ОстаткиНоменклатуры.Добавить();Движение.ВидДвижения = ВидДвиженияНакопления.Приход;Движение.Период = Дата;Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;Движение.Партия = Ссылка;Движение.Количество = ВыборкаДетальныеЗаписи.Количество;Движение.Себестоимость = ВыборкаДетальныеЗаписи.Сумма;КонецЦикла;Движения.ОстаткиНоменклатуры.Записывать = Истина;КонецПроцедуры[свернуть]
- определить текущий метод списания себестоимости;
- В расходной накладной при формировании движений конструктором:
- измерение
Партия
- не сопоставляется (будем получать запросом); - ресурс
Себестоимость
- вручную ввести переменнуюСебестоимость
(будем далее рассчитывать в коде).Рисунок[свернуть]
- измерение
- Оформляем процедуру
ОбработкаПроведения
документаРасходнаяНакладная
(с использованием "старой" методики контроля остатков):- удаляем движения и ставим блокировку;
Код123456789101112// 1. удаляем движенияДвижения.ОстаткиНоменклатуры.Записать();// 2. ставим блокировку//Блокировка = Новый БлокировкаДанных;//ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");//ЭлементБлокировки.УстановитьЗначение("Качество", Справочники.Качество.НайтиПоКоду("1"));//ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;//ЭлементБлокировки.ИсточникДанных = ДокументОбъект.ВозвратнаяТара;//ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");//ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");//Блокировка.Заблокировать();[свернуть]
- формируем запрос для выбора данных для записи движений со следующими особенностями:
- на вкладке "Порядок" добавить момент времени измерения
Партия
,Сортировка - Возрастание
(для ФИФО); - на вкладке "Итоги" построим иерархию для партий товаров:
- "Группировочное поле" -
Номенклатура
; - "Итоговое поле" -
СУММА(КоличествоОстаток)
из регистра,МАКСИМУМ(Количество)
из документа - именно их мы будем сравнивать при контроле остатков.
- "Группировочное поле" -
- на вкладке "Порядок" добавить момент времени измерения
- откорректируем текст запроса по учетной политике (ФИФО или ЛИФО);
Код123456// откорректируем текст запроса по учетной политике (ФИФО или ЛИФО)Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО ТогдаЗапрос.Текст = СтрЗаменить(Запрос.Текст,"ОстаткиНоменклатурыОстатки.Партия.МоментВремени","ОстаткиНоменклатурыОстатки.Партия.МоментВремени УБЫВ")КонецЕсли;[свернуть]
- выполняем контроль остатков по сгруппированным в ИТОГАХ номенклатурным позициям;
Код123456789101112131415161718//4. контроль остатков по сгруппированным номенклатурным позициямВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);Пока ВыборкаНоменклатура.Следующий() ЦиклЕсли ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток ТогдаСообщение = Новый СообщениеПользователю;Сообщение.Текст = "Не хватает номенклатуры " + ВыборкаНоменклатура.НоменклатураПредставление+ " в количестве " + (ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток) + " ед.";Сообщение.Сообщить();Отказ = ИСТИНА; // отменяем проведениеПродолжить;КонецЕсли;КонецЦикла;[свернуть]
- прописываем в коде партионное списание в соответствии с учетной политикой:
- вводим переменную
КоличествоВсегоСписать = ВыборкаНоменклатура.Количество
; - её будем уменьшать до полного списания; - в цикле обхода детальных записей выборки прописываем списание количества товаров в зависимости от количества в партии (не забываем про "проблему копеек") и формируем движения
Код123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657//4. контроль остатков по сгруппированным в итогах номенклатурным позициямВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);Пока ВыборкаНоменклатура.Следующий() Цикл // цикл обхода сгруппированных в ИТОГАХ номенклатурных позицийЕсли ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток ТогдаСообщение = Новый СообщениеПользователю;Сообщение.Текст = "Не хватает номенклатуры " + ВыборкаНоменклатура.НоменклатураПредставление+ " в количестве " + (ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток) + " ед.";Сообщение.Сообщить();Отказ = ИСТИНА; // отменяем проведениеКонецЕсли;Если Отказ ТогдаПродолжить; // пропускаем детальные записи, переходим к следующей группировкеКонецЕсли;ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); // ВАЖНО! Не детальные записи запросаКоличествоВсегоСписать = ВыборкаНоменклатура.Количество;Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // цикл обхода детальных записей внутри каждой группировки номенклатуры// определяем для партии максимальное количество, подлежащее списаниюКоличествоСписать = МИН(КоличествоВсегоСписать,ВыборкаДетальныеЗаписи.КоличествоОстаток);// определяем списываемую себестоимость с устранением "проблемы копеек"Если КоличествоСписать = ВыборкаДетальныеЗаписи.КоличествоОстаток ТогдаСебестоимость = ВыборкаДетальныеЗаписи.СебестоимостьОстаток;ИначеСебестоимость = КоличествоСписать / ВыборкаДетальныеЗаписи.КоличествоОстаток* ВыборкаДетальныеЗаписи.СебестоимостьОстаток;КонецЕсли;// формируем движенияДвижение = Движения.ОстаткиНоменклатуры.Добавить();Движение.ВидДвижения = ВидДвиженияНакопления.Расход;Движение.Период = Дата;Движение.Партия = ВыборкаДетальныеЗаписи.Партия;Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;Движение.Количество = КоличествоСписать;Движение.Себестоимость = Себестоимость;КоличествоВсегоСписать = КоличествоВсегоСписать - КоличествоСписать;Если КоличествоВсегоСписать<=0 ТогдаПрервать;КонецЕсли;КонецЦикла;КонецЦикла;Движения.ОстаткиНоменклатуры.Записывать = Истина;[свернуть]
- вводим переменную
- удаляем движения и ставим блокировку;