Имя: Пароль:
1C
1С v8
Для одной из номенклатур рассчитывается неправильная стоимость
,
0 Бурундук
 
19.12.21
17:55
Добрый вечер! Написала код ОбработкаПроведения, где должна рассчитываться стоимость для каждой конкретной номенклатуры. Заметила, что по мере того, как я провожу документы, для всех материалов стоимость рассчитывается правильно, кроме Шланг Резиновый. Сколько раз я провожу документ, столько раз и меняется в регистре накопления стоимость данного материала. При этом стоимость других материалов остаётся неизменной. Как это понимать?


Процедура ОбработкаПроведения(Отказ, Режим)

    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;    
    
    
    //Создать менеджер временных таблиц    
    МенеджерВТ = Новый МенеджерВременныхТаблиц;    
    
     #Область НоменклатураДокумента
    
    Запрос = Новый Запрос;  
    
    //Укажем, какой менеджер временных таблиц использует этот запрос  
    
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура КАК Номенклатура,
        |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
        |    СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
        |    СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
        |ПОМЕСТИТЬ НоменклатураДокумента
        |ИЗ
        |    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
        |ГДЕ
        |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
        |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();  
    
    #КонецОбласти
    
    #Область ДвиженияДокумента
    
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос2.Текст = "ВЫБРАТЬ
                   |    НоменклатураДокумента.Номенклатура КАК Номенклатура,
                   |    НоменклатураДокумента.ВидНоменклатуры КАК ВидНоменклатуры,
                   |    НоменклатураДокумента.КоличествоВДокументе КАК КоличествоВДокументе,
                   |    НоменклатураДокумента.СуммаВДокументе КАК СуммаВДокументе,
                   |    ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
                   |    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
                   |ИЗ
                   |    НоменклатураДокумента КАК НоменклатураДокумента
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
                   |                ,
                   |                Материал В
                   |                    (ВЫБРАТЬ
                   |                        НоменклатураДокумента.Номенклатура
                   |                    ИЗ
                   |                        НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
                   |        ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
                   |                ,
                   |                Материал В
                   |                    (ВЫБРАТЬ
                   |                        НоменклатураДокумента.Номенклатура
                   |                    ИЗ
                   |                        НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
                   |        ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал";
    
     //Установим необходимость блокировки данных в регистрах СтоимостьМатериалов и ОстаткиМатериалов
    
     Движения.СтоимостьМатериалов.БлокироватьДляИзменения = Истина;
     Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;
    
    //Запишем пустые наборы записей, чтобы читать остатки без учёта данных в документе  
    
    Движения.СтоимостьМатериалов.Записать();
    Движения.ОстаткиМатериалов.Записать();

                  
                                     
    РезультатЗапроса = Запрос2.Выполнить();      
    
    //ТЗ = РезультатЗапроса.Выгрузить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
            СтоимостьМатериала = 0;
        Иначе
            СтоимостьМатериала = ВыборкаДетальныеЗаписи.Стоимость/ВыборкаДетальныеЗаписи.Количество;
        КонецЕсли;
        
        
        Если ВыборкаДетальныеЗаписи.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
        
        // регистр ОстаткиМатериалов Расход
        Движение = Движения.ОстаткиМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Склад = Склад;
        Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;    
        
        //регистр СтоимостьМатериалов Расход
        Движение = Движения.СтоимостьМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе * СтоимостьМатериала;  
        
    КонецЕсли;  
    

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

  КонецЦикла;
  
  КонецЕсли;
  #КонецОбласти
    

      КонецПроцедуры
1 Мультук
 
гуру
20.12.21
07:27
(0)

1)
Регистры
РегистрНакопления.СтоимостьМатериалов.Остатки(
РегистрНакопления.ОстаткиМатериалов.Остатки(

удивили/повеселили. Это в какой-то типовой так? Количества в "СтоимостьМатериалов" нет совсем?

2) {Особо не думал головой.}
Jстатки снимаются на конец времен, и по идее, учитывают движения сделанные самим документом, затем еще и еще раз.
Но вам там по идее виднее в отладке