Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
14 дек 2024, 14:23

Не совсем корректно считает регистр продажи

Автор deliv, 04 мар 2022, 00:40

0 Пользователей и 1 гость просматривают эту тему.

deliv

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

    КонецЦикла;
   
           

КонецЕсли;

В зависимости от учетной политики рассчитываю себестоимость, но почему то если идёт по фифо то в регистр продажи попадает вот что:1cs.jpg33.jpg
По средней считает все ок, не судите строго, только учусь)


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск