Переход с метода ФИФО (First In, First Out) на оценку "По средней" — это не просто смена одной галочки в настройках. Для программиста 1С, особенно в контексте подготовки к экзамену "1С:Специалист" или при доработке самописных систем, эта задача требует глубокого понимания того, как меняется логика работы с регистрами накопления. В этой статье мы подробно разберем, как реализовать этот переход программно, какие изменения внести в алгоритмы проведения документов и на что обратить внимание при работе с остатками.
Рассмотрим ситуацию, когда в системе реализован партионный учет. При ФИФО ключевым измерением в регистре накопления (например, ОстаткиНоменклатуры) является Партия (обычно это документ поступления). Проанализируем, как меняется выборка данных из базы при смене метода.
При методе ФИФО: Система должна получить остатки в разрезе каждой партии и отсортировать их по моменту времени (или номеру партии), чтобы списывать товары по очереди. Запрос к виртуальной таблице Остатки будет содержать параметры: Номенклатура, Склад и Партия.
При методе "По средней": Измерение Партия в запросе становится избыточным. Мы должны получить общее количество и общую сумму по Номенклатуре и Складу (если учет ведется в разрезе складов). Посмотрим на пример того, как должен выглядеть универсальный запрос, учитывающий учетную политику:
ТекстЗапроса =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.КоличествоОстаток КАК КоличествоОстаток,
| Остатки.СуммаОстаток КАК СуммаОстаток" +
?(МетодФИФО, ", Остатки.Партия КАК Партия", "") +
" ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени, Номенклатура = &Номенклатура) КАК Остатки
" +
?(МетодФИФО, "УПОРЯДОЧИТЬ ПО Остатки.Партия.МоментВремени", "");
Выясним причину такого подхода: если мы оставим Партию в группировке при расчете по средней, мы получим "среднюю в разрезе партий", что математически равносильно ФИФО или ЛИФО и не имеет смысла. Для метода "по средней" мы обязаны "схлопнуть" все партии в одну строку.
Разберем по шагам, как программно реализовать расчет при проведении документа отгрузки. В методе "по средней" формула кажется простой, но в ней кроется важный нюанс, связанный с точностью вычислений.
Проанализируем классический расчет себестоимости:
Номенклатуре (Количество и Сумма).Цена = СуммаОстаток / КоличествоОстаток.СуммаСписания = КоличествоКБронированию * Цена.Важный момент: При полном списании товара со склада из-за округлений могут остаться "хвосты" в несколько копеек. Чтобы этого избежать, всегда добавляйте проверку: если количество списываемого товара равно количеству остатка, то сумма списания должна быть равна всей оставшейся сумме на регистре.
Если КоличествоСписания = Выборка.КоличествоОстаток Тогда
СуммаСписания = Выборка.СуммаОстаток;
Иначе
СуммаСписания = (Выборка.СуммаОстаток / Выборка.КоличествоОстаток) * КоличествоСписания;
КонецЕсли;
В практике 1С выделяют два подхода к расчету средней стоимости, и важно понимать, какой именно требуется в вашей задаче:
1. Скользящая средняя: Себестоимость рассчитывается в момент проведения каждого документа (как в примере выше). Это позволяет видеть валовую прибыль сразу. Именно этот метод чаще всего требуется реализовать на экзамене 1С:Специалист по платформе.
2. Средневзвешенная (за месяц): Согласно этому методу, себестоимость всех продаж за месяц одинакова и рассчитывается только в конце периода. Рассмотрим алгоритм: в течение месяца документы списывают только количество. В конце месяца регламентная операция Закрытие месяца берет (СтоимостьОстаткаНаНачало + СтоимостьПоступлений) / (КолвоНаНачало + КолвоПоступлений) и корректирует все движения реализации за месяц. Этот метод сложнее в реализации, так как требует перепроведения или создания корректирующих записей.
Рассмотрим ситуацию: организация работала по ФИФО, и в регистре накопления накопились остатки по сотням разных партий. Теперь мы переходим на среднюю. Нужно ли удалять данные из регистра?
Проанализируем два варианта решения:
Партия. В движениях документа Расходная накладная значение партии оставляется пустым (Справочники.Партии.ПустаяСсылка() или Неопределено). Технически это допустимо: на остатках будут висеть записи с партиями, но списания будут идти без них. Однако это может привести к путанице в отчетах.Корректировка регистров), который списывает все остатки в разрезе партий и приходует их обратно на одну общую "виртуальную" партию (например, с названием "Остатки при переходе на среднюю"). Далее учет ведется только по этой позиции.Рассмотрим важный аспект, упомянутый в обсуждении на форуме. Если ваша организация применяет УСН (Доходы минус расходы), переход на среднюю стоимость в типовых конфигурациях 1С (таких как Бухгалтерия предприятия) практически невозможен или крайне не рекомендуется.
Выясним причину: для признания расходов при УСН необходимо выполнение трех условий: товар получен, товар оплачен поставщику, товар реализован. Чтобы отследить, какой именно товар (из какой поставки и оплачен ли он) был продан, системе жизненно необходим партионный учет. При методе "по средней" связь между закупкой и продажей теряется, что делает расчет налога по правилам НК РФ невозможным.
Подводя итог, для успешного программного перехода с ФИФО на среднюю нам необходимо:
УчетнаяПолитика поле СпособОценкиСтоимости.РасходнаяНакладная реализовать ветвление логики: если выбрана средняя — исключаем Партию из группировок запроса.Ведомость по товарам выглядели корректно и не содержали пустых разрезов.Помните, что техническая реализация на экзамене "1С:Специалист" требует четкого следования методике: если в задаче сказано "учет по средней", то в движениях регистра поле партии обязательно должно оставаться пустым, иначе решение может быть признано неверным из-за избыточности данных.