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

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 8

  1. Павел:

    Ут используется в рамках упр. учета. На торговлю оптовую и розничную все также действует законодательство

    • Управленческую прибыль (маржу) бизнес может считать так, как ему удобно. Это не бухгалтерия с ПБУ.

  2. Zuko:

    Непонятно при чем тут LIFO, если все берется по цене только последней закупки?
    Почему берется эта цена, если например эта партия только пришла, но еще не продавалась?

    Даже в таком случае проще регистрировать т.н. «закупочный» вид цены и брать из него. Потому что в запросе сейчас не учтены элементарно возвраты поставщику — то есть может взять из последнего документа возврата. Ну и запрос неоптимальный

    • в чем не оптимальность запроса? Если вы про скорость, то я вас умоляю, там не такие объемы.

      • fajij28770:

        в том что у тебя на каждую запись делается еще одна выборка по РегистрНакопления. т.е. ты получил квадратичную сложнсть, если объемы возрастут скажем в десять раз то скорость запроса обвалиться в сто, а при возрастании в сто раз просадка будет уже в 10 тыс.

        • не согласен с подобным анализом текста запроса.
          И потом, там не те объемы.
          но ок, твой вариант?

          • fajij28770:

            раз не согласен, то приведи свою оценку сложности. потом уже поговорим об оптимальном решении
            >там не те объемы.
            слишком пространная фраза. если РегистрНакопления — это классификатор с условно постоянным кол-вом записей, то да. если это таблица с переменной информацией, которая постоянно растет, то у меня для тебя плохие новости

          • Подробнее. Пока не вижу указания на проблемы.

Добавить комментарий для fajij28770 Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *