Возврат по последней закупочной цене. УТ11
Честно говоря, я думал, что если возврат не привязан к документу продажи, то УТ11 считает его себестоимость по LIFO — т.е. берет из последней партии проданного товара.
Поэтому когда я увидел, что УТ11 возвращает товар на себестоимость по цене продажи, был удивлен.
Хорошо, более опытные товарищи подсказали, что в УТ11 для таких случаев есть варианты выбора себестоимости:
Почему 1С не сделала вариант с LIFO, лично мне непонятно. Адвокаты дьявола утверждают, что это сделано с целью соблюдения каких-то бухгалтерских правил приличия. Но мне не понятно, зачем эти приличия, если УТ используется в целях управленческого учета, а налоговая декларация сдается в БП?
Тем не менее, обсудив с клиентом данное ограничение УТ, пришли к решению, чтобы в таких возвратах при проведении автоматически устанавливалась цена последнего прихода.
Если закупочная цена довольно сильно меняется, метод не очень хороший. Например, поставщик мог дать большую скидку на закуп. Но в целом, учитывая небольшое количество возвратов, можно считать, что возврат был именно по этой партии и всё усредняется в целом.
На первом прогоне получилось странно:
Почему-то сумма регл. учета равна нулю, хотя в документе она есть. Проверка показала, что это форма способа определения себестоимости не копирует это поле из документа (баг 1С).
В общем, оставил так, в документе выглядит так:
Осталось проверить в движениях документа, там всё корректно:
Несколько замечаний:
- Клиент работает без НДС, поэтому я не особо заморачивался на себестоимости без НДС и т.п.
- Если закупки не было, то себестоимость ставится равной розничной.
Финальный код по корректировке себестоимости при возврате:
&После(«ПередЗаписью»)
Процедура дор_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
//Осипов 2021-05-10 реализую возврат от покупателя по последней закупочной цене
Если Отказ Тогда
Возврат;
КонецЕсли;
//Если по документу реализации, возврат, то не меняем
Если ЗначениеЗаполнено(ЭтотОбъект.ДокументРеализации) Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«ТН», ЭтотОбъект.Товары.Выгрузить());
Запрос.Текст =
«ВЫБРАТЬ
| ТН.Номенклатура КАК Номенклатура,
| ТН.НомерСтроки КАК НомерСтроки,
| ТН.Себестоимость КАК Себестоимость,
| ТН.Цена КАК Цена,
| ТН.Количество КАК Количество,
| ТН.СпособОпределенияСебестоимости КАК СпособОпределенияСебестоимости
|ПОМЕСТИТЬ ТН
|ИЗ
| &ТН КАК ТН
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТН.Номенклатура КАК Номенклатура,
| ТН.Себестоимость КАК Себестоимость,
| ТН.НомерСтроки КАК НомерСтроки,
| ТН.Цена КАК Цена,
| Т.Период КАК Период,
| ВЫРАЗИТЬ(ЕСТЬNULL(ВЫБОР
| КОГДА Т.Количество = 0
| ТОГДА 0
| ИНАЧЕ Т.Сумма / Т.Количество
| КОНЕЦ * ТН.Количество, 0) КАК ЧИСЛО(15, 2)) КАК СебестоимостьНовая
|ИЗ
| ТН КАК ТН
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки КАК Т
| ПО (Т.АналитикаУчетаНоменклатуры.Номенклатура = ТН.Номенклатура)
| И (Т.Период В
| (ВЫБРАТЬ
| МАКСИМУМ(Т.Период)
| ИЗ
| РегистрНакопления.Закупки КАК Т
| ГДЕ
| Т.АналитикаУчетаНоменклатуры.Номенклатура = ТН.Номенклатура
| И Т.Период <= &ДатаДокумента))";
Запрос.УстановитьПараметр(«ДатаДокумента», ЭтотОбъект.Дата);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Строка = ЭтотОбъект.Товары[Выборка.НомерСтроки — 1];
//Устанавливаем способ определения себестомости
Если Строка.СпособОпределенияСебестоимости <> Перечисления.СпособыОпределенияСебестоимости.Вручную Тогда
Строка.СпособОпределенияСебестоимости = Перечисления.СпособыОпределенияСебестоимости.Вручную;
КонецЕсли;
//Если себестоимость правильная
Если Выборка.СебестоимостьНовая = 0 Тогда
ТекСебестоимость = ОКР(Выборка.Цена * Выборка.Количество(), 2);
Иначе
Если Выборка.СебестоимостьНовая = Строка.Себестоимость Тогда
Продолжить;
КонецЕсли;
ТекСебестоимость = Выборка.СебестоимостьНовая;
КонецЕсли;
//В случае если себестоимость не указана, то оставляем как есть…
Строка.Себестоимость = ТекСебестоимость;
Строка.СебестоимостьБезНДС = ТекСебестоимость;
Строка.СебестоимостьРегл = ТекСебестоимость;
//Строка.СебестоимостьПР = ТекСебестоимость;
//Строка.СебестоимостьВР = ТекСебестоимость;
КонецЦикла;
КонецПроцедуры
Время план: 1.8 час Среда: УТ 11.4.13.46. 1С: 8.3.16.1502.
Ут используется в рамках упр. учета. На торговлю оптовую и розничную все также действует законодательство
Управленческую прибыль (маржу) бизнес может считать так, как ему удобно. Это не бухгалтерия с ПБУ.
Непонятно при чем тут LIFO, если все берется по цене только последней закупки?
Почему берется эта цена, если например эта партия только пришла, но еще не продавалась?
Даже в таком случае проще регистрировать т.н. «закупочный» вид цены и брать из него. Потому что в запросе сейчас не учтены элементарно возвраты поставщику — то есть может взять из последнего документа возврата. Ну и запрос неоптимальный
в чем не оптимальность запроса? Если вы про скорость, то я вас умоляю, там не такие объемы.
в том что у тебя на каждую запись делается еще одна выборка по РегистрНакопления. т.е. ты получил квадратичную сложнсть, если объемы возрастут скажем в десять раз то скорость запроса обвалиться в сто, а при возрастании в сто раз просадка будет уже в 10 тыс.
не согласен с подобным анализом текста запроса.
И потом, там не те объемы.
но ок, твой вариант?
раз не согласен, то приведи свою оценку сложности. потом уже поговорим об оптимальном решении
>там не те объемы.
слишком пространная фраза. если РегистрНакопления — это классификатор с условно постоянным кол-вом записей, то да. если это таблица с переменной информацией, которая постоянно растет, то у меня для тебя плохие новости
Подробнее. Пока не вижу указания на проблемы.