Возврат по последней закупочной цене. УТ11

Честно говоря, я думал, что если возврат не привязан к документу продажи, то УТ11 считает его себестоимость по LIFO — т.е. берет из последней партии проданного товара.

Поэтому когда я увидел, что УТ11 возвращает товар на себестоимость по цене продажи, был удивлен.

Хорошо, более опытные товарищи подсказали, что в УТ11 для таких случаев есть варианты выбора себестоимости:

Почему 1С не сделала вариант с LIFO, лично мне непонятно. Адвокаты дьявола утверждают, что это сделано с целью соблюдения каких-то бухгалтерских правил приличия. Но мне не понятно, зачем эти приличия, если УТ используется в целях управленческого учета, а налоговая декларация сдается в БП?

Тем не менее, обсудив с клиентом данное ограничение УТ, пришли к решению, чтобы в таких возвратах при проведении автоматически устанавливалась цена последнего прихода.

Если закупочная цена довольно сильно меняется, метод не очень хороший. Например, поставщик мог дать большую скидку на закуп. Но в целом, учитывая небольшое количество возвратов, можно считать, что возврат был именно по этой партии и всё усредняется в целом.

На первом прогоне получилось странно:

Почему-то сумма регл. учета равна нулю, хотя в документе она есть. Проверка показала, что это форма способа определения себестоимости не копирует это поле из документа (баг 1С).

В общем, оставил так, в документе выглядит так:

Осталось проверить в движениях документа, там всё корректно:

Несколько замечаний:

  1. Клиент работает без НДС, поэтому я не особо заморачивался на себестоимости без НДС и т.п.
  2. Если закупки не было, то себестоимость ставится равной розничной.

Финальный код по корректировке себестоимости при возврате:


&После(«ПередЗаписью»)
Процедура дор_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
   
//Осипов 2021-05-10 реализую возврат от покупателя по последней закупочной цене
   
Если Отказ Тогда
        Возврат;
    КонецЕсли;

    //Если по документу реализации, возврат, то не меняем
   
Если ЗначениеЗаполнено(ЭтотОбъект.ДокументРеализации) Тогда
        Возврат;
    КонецЕсли;

    Запрос = Новый Запрос;
   
Запрос.УстановитьПараметр(«ТН», ЭтотОбъект.Товары.Выгрузить());
   
Запрос.Текст =
   
«ВЫБРАТЬ
    |   ТН.Номенклатура КАК Номенклатура,
    |   ТН.НомерСтроки КАК НомерСтроки,
    |   ТН.Себестоимость КАК Себестоимость,
    |   ТН.Цена КАК Цена,
    |   ТН.Количество КАК Количество,
    |   ТН.СпособОпределенияСебестоимости КАК СпособОпределенияСебестоимости
    |ПОМЕСТИТЬ ТН
    |ИЗ
    |   &ТН КАК ТН
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |   ТН.Номенклатура КАК Номенклатура,
    |   ТН.Себестоимость КАК Себестоимость,
    |   ТН.НомерСтроки КАК НомерСтроки,
    |   ТН.Цена КАК Цена,
    |   Т.Период КАК Период,
    |   ВЫРАЗИТЬ(ЕСТЬNULL(ВЫБОР
    |               КОГДА Т.Количество = 0
    |                   ТОГДА 0
    |               ИНАЧЕ Т.Сумма / Т.Количество
    |           КОНЕЦ * ТН.Количество, 0) КАК ЧИСЛО(15, 2)) КАК СебестоимостьНовая
    |ИЗ
    |   ТН КАК ТН
    |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки КАК Т
    |       ПО (Т.АналитикаУчетаНоменклатуры.Номенклатура = ТН.Номенклатура)
    |           И (Т.Период В
    |               (ВЫБРАТЬ
    |                   МАКСИМУМ(Т.Период)
    |               ИЗ
    |                   РегистрНакопления.Закупки КАК Т
    |               ГДЕ
    |                   Т.АналитикаУчетаНоменклатуры.Номенклатура = ТН.Номенклатура
    |                   И Т.Период <= &ДатаДокумента))"
;

    Запрос.УстановитьПараметр(«ДатаДокумента», ЭтотОбъект.Дата);

    Выборка = Запрос.Выполнить().Выбрать();
    Пока
Выборка.Следующий() Цикл
       
Строка = ЭтотОбъект.Товары[Выборка.НомерСтроки 1];
       
//Устанавливаем способ определения себестомости
       
Если Строка.СпособОпределенияСебестоимости <> Перечисления.СпособыОпределенияСебестоимости.Вручную Тогда
           
Строка.СпособОпределенияСебестоимости = Перечисления.СпособыОпределенияСебестоимости.Вручную;
        КонецЕсли;
       
//Если себестоимость правильная
       
Если Выборка.СебестоимостьНовая = 0 Тогда
           
ТекСебестоимость = ОКР(Выборка.Цена * Выборка.Количество(), 2);
        Иначе
            Если
Выборка.СебестоимостьНовая = Строка.Себестоимость Тогда
                Продолжить;
            КонецЕсли;
           
ТекСебестоимость = Выборка.СебестоимостьНовая;
        КонецЕсли;

        //В случае если себестоимость не указана, то оставляем как есть…

        Строка.Себестоимость = ТекСебестоимость;
       
Строка.СебестоимостьБезНДС = ТекСебестоимость;
       
Строка.СебестоимостьРегл = ТекСебестоимость;
       
//Строка.СебестоимостьПР = ТекСебестоимость;
        //Строка.СебестоимостьВР = ТекСебестоимость;

    КонецЦикла;

КонецПроцедуры

Время план: 1.8 час Среда: УТ 11.4.13.46. 1С: 8.3.16.1502.