"Учет товара по методу FIFO"
Метод ФИФО (FIFO (англ.)-first input first output - первым пришел, первый ушел) часто применяется преприятиятиями для учета товаров в оптовой торговле. Этот метод обязателен для учета товаров на коммиссии (на забалансовом счете 004). Т.к. этот метод не реализован в стандартной конфигурации - его пришлось реализовывать самому. Правда стандартная конфигурация дает подсказку - как это сделать на примере учета кредитов. Итак, для учета товаров по методу ФИФО создадим регистр.
Измерения: Товар (Справочник Товары), Документ (Ссылки на документ)
Ресурсы: Количество(Число 9.0), Сумма (Число 10.2), НДС (Число 10.2), Разница (Число 10.2)
Ресурс "Разница" применяется для отслеживания полученного коммиссионного вознаграждения. Если Ваша организация не реализует товары по договорам коммиссии, то его можно не применять.
Введем новую константу "Строго", принимающую значение "Булево" для включения или отключения учета товаров по ФИФО. Т.к. при всем старании, вряд-ли удасться избежать проведения документов задним числом, то и проведение регистра ФИФО необходимо проводить после того как период уже полностью оформлен. Т.о. в повседневной работе значение константы "Строго" выставлено в "Нет" и проведение регистра ФИФО не проводиться, а после оформления всех документов за отчетный период - константа "Строго" выставляется в "Да" и производится перепроведение документов.
Итак в приходных документах проведение регистра ФИФО не представляет каких либо проблем и выглядит примерно так:
Если Константа.Строго=Да
Тогда
....ВыбратьСтроки();
....Пока ПолучитьСтроку()=1 Цикл
........Если
Товар.Тип=Перечисление.ТипТовара.ПоФИФО
Тогда
............Регистр.ФИФО.Товар=Товар;
............Регистр.ФИФО.Документ=ТекущийДокумент();
............Регистр.ФИФО.Количество=Количество;
............Регистр.ФИФО.Сумма=Сумма-НДСсум;
............Регистр.ФИФО.Разница=СумСкид;
............Регистр.ФИФО.НДС=НДСсум;
............Регистр.ФИФО.ДвижениеПриходВыполнить();
........Иначе
............Предупреждение("Товар
"+Товар.Наименование+" не
является товаром ФИФО");
........КонецЕсли;
....КонецЦикла;
КонецЕсли;
В расходных документах списание производится более сложным способом. Производится запрос по регистру ФИФО. Группируем движения по документам. Находим первый документ остаток количества в котором больше 0. Проверяем количество несписанного товара. Если это количество больше, чем нам надо списать, то списываем нужное количество. Иначе списываем остаток по этому документу и переходим к следующему, пока не спишем все количество.
Запрос=СоздатьОбъект("Запрос");
ПромТовар=Товар;
ТекстЗапроса="
|НТовар=Регистр.ФИФО.Товар;
|Док1=Регистр.ФИФО.Документ;
|КолВо=Регистр.ФИФО.Количество;
|БазСто=Регистр.ФИФО.Сумма;
|НДС=Регистр.ФИФО.НДС;
|Разн=Регистр.ФИФО.Разница;
|Условие(НТовар={ПромТовар});
|Условие(КолВо <> 0);
|Группировка Док1;
|Функция КонКолВо= КонОст(КолВо);
|Функция КонБазСто= КонОст(БазСто);
|Функция КонНДС= КонОст(НДС);
|Функция КонРазница= КонОст(Разн);
|";
Флаг=Запрос.Выполнить(ТекстЗапроса);
....Если Флаг=0 тогда
....Предупреждение("Запрос при
выполнении проводки по ФИФО не
выполнился!!! Учета реализации по FIFO
не прошло!!!");
....Возврат;
КонецЕсли;
// теперь в запросе собраны все
Документы по данному товару
НовОст=Количество;
Пока
(Запрос.Группировка("Док1") = 1) И
(НовОст>0) Цикл
....Если (Запрос.КонКолВо=0) Тогда
........// пропускаем Погашенные
документы
........Продолжить;
....КонецЕсли;
....Если (Запрос.КонКолВо >= НовОст)
Тогда
........Регистр.ФИФО.Количество=НовОст;
........Регистр.ФИФО.Товар=Товар;
........Регистр.ФИФО.Документ=Запрос.Док1;
........Регистр.ФИФО.Сумма=(Запрос.КонБазСто/Запрос.КонКолВо)*НовОст;
........Если Константа.Цены=Да Тогда
............СумНакл=СумНакл+(Запрос.КонБазСто/Запрос.КонКолВо)*НовОст;
........КонецЕсли;
........Регистр.ФИФО.НДС=(Запрос.КонНДС/Запрос.КонКолВо)*НовОст;
........Регистр.ФИФО.Разница=(Запрос.КонРазница/Запрос.КонКолВо)*НовОст;
........НовОст=НовОст-Количество;
........Регистр.ФИФО.ДвижениеРасходВыполнить();
....Иначе
........Регистр.ФИФО.Количество=Запрос.КонКолВо;
........Регистр.ФИФО.Товар=Товар;
........Регистр.ФИФО.Документ=Запрос.Док1;
........Регистр.ФИФО.Сумма=Запрос.КонБазСто;
........Если Константа.Цены=Да Тогда
............СумНакл=СумНакл+Запрос.КонБазСто;
........КонецЕсли;
........Регистр.ФИФО.НДС=Запрос.КонНДС;
........Регистр.ФИФО.Разница=Запрос.КонРазница;
........Регистр.ФИФО.ДвижениеРасходВыполнить();
........НовОст=НовОст-Запрос.КонКолВо;
........Продолжить;
....КонецЕсли;
КонецЦикла;
Запрос=0;
Все. Осталось сформировать отчеты.