Возврат по последней закупочной цене. УТ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.
