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

    КонецЦикла;
    
            

КонецЕсли;

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

Мне кажется я уже написал много лишнего и не вижу просто какую-то очевидную ошибку.
1 ДенисЧ
 
03.03.22
14:46
Мало текста
2 Галахад
 
гуру
03.03.22
15:13
Движение.СебеСтоимость = Себестоимость;

Себестоимость - это себестоимость одной партии, а нужна сумма.
3 deliv
 
03.03.22
21:43
Не подскажете как тогда изменить? Как раз таки если рассчитываю по фифо то в регистре продажи сумма продаж не правильно записывается, а когда по средней то все хорошо
4 deliv
 
03.03.22
21:44
Когда по средней то там партия пустая. Может когда по фифо пытаюсь, что-то в запросе не так?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.