Имя: Пароль:
1C
1С v8
Помогите разобраться в циклах
, ,
0 UUmmmmm
 
02.10.19
14:32
Был сделан обход по виду номенклатуры, и теперь расчет ведется неверно, видимо где-то неправильно расставлены циклы и "если", но не могу понять где, помогите пожалуйста разобраться!!


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

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

        
        Если ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.Количество  Тогда
            
               Отказ = Истина;
            
            Сообщение = Новый СообщениеПользователю();
                    Сообщение.Текст = "Не хватает " + (- (ВыборкаНоменклатура.Количество - ВыборкаНоменклатура.КоличествоОстаток)) +
                    " единиц материала """ + ВыборкаНоменклатура.Номенклатура + """";
                    Сообщение.Сообщить();

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

            
                    // регистр ОстаткиМатериалов Расход
                    Движение = Движения.ОстаткиМатериалов.Добавить();
                    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                    Движение.Период = Дата;
                    Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
                    Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
                    Движение.Стоимость = СтоимостьКСписанию;
                    Движение.Количество = КоличествоКСписанию;    

                    КонецЦикла;
                                
            
                 // Регистр Продажи
                Движение = Движения.Продажи.Добавить();
                Движение.Период = Дата;
                Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
                Движение.Клиент = Клиент;
                Движение.Мастер = Мастер;
                Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
                Движение.Выручка = ВыборкаДетальныеЗаписи.Сумма;
                КонецЕсли;
            
            КонецЦикла;
                    
                
            Иначе
            
            Выборка = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
            Пока Выборка.Следующий() цикл
                Движение = Движения.Продажи.Добавить();
                Движение.Период = Дата;
                Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
                Движение.Клиент = Клиент;
                Движение.Мастер = Мастер;
                Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
                Движение.Выручка = ВыборкаДетальныеЗаписи.Сумма;
        
    КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    Движения.Записать();
КонецПроцедуры
1 Волшебник
 
02.10.19
14:33
Программирование — это фантазия плюс умение крутить циклы.
2 vicof
 
02.10.19
14:33
Ctrl+A, Alt+Shift+F
3 unenu
 
02.10.19
14:34
в средние века за такой код лишали головы
4 Ёпрст
 
02.10.19
14:52
(0)

  Пока Выборка.Следующий() Цикл

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

Движения.Записать();
КонецПроцедуры
7 UUmmmmm
 
02.10.19
14:56
(4) не помогло((
8 Мимохожий Однако
 
02.10.19
14:59
(7) Еще раз..
Чего ты хочешь от проведения?
9 UUmmmmm
 
02.10.19
15:04
(8) Тут списание методом фифо, сам алгоритм верный, либо где-то опечатка либо неправильно расставлены циклы, И вот не могу понять!
10 Ёпрст
 
02.10.19
15:05
(7) еще раз

   Выборка = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
            
            Пока Выборка.Следующий() Цикл
                
                
                Если ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.Количество  Тогда // нафига тут сравнение по вышестоящей группировке ??!
11 UUmmmmm
 
02.10.19
15:11
(10) это контроль отрицательных остатков, это не причем тут
12 Ёпрст
 
02.10.19
15:15
(11) еще раз подумай
13 piter3
 
02.10.19
15:15
(11) Отрицательные это менее 0.Тук-тук
14 Ёпрст
 
02.10.19
15:17
А вот это, вообще шедевр:


    Пока Выборка.Следующий() Цикл
          ..........................
                    КоличествоНадоСписать = ВыборкаНоменклатура.Количество;
                    
                    ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); //это пять, ага
                    
                    
                    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
15 Ёпрст
 
02.10.19
15:20
Если не понял, поясняю:

ВыборкаНоменклатура - это выборка по итоговым записям вида номенклатуры
    Выборка - это выборка по итогам самой номенклатуры
    ВыборкаДетальныеЗаписи  - это выборка и итогов по номенклатуре и все детальные записи в цикле выборки по Номенклатуре у тебя

Фирштейн ?
16 UUmmmmm
 
02.10.19
15:33
(15) посмотрите вот я исправлено, где ещё может быть ошибка?

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

Движения.Записать();
КонецПроцедуры
17 Ёпрст
 
02.10.19
15:39
(16) зачем вы в выборке по Номенклатуре сравниваете остаток по вышестоящей группировке, по Видам Номенклатуры ?

     Пока Выборка.Следующий() Цикл
         Если ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.Количество  Тогда // ???
18 Ёпрст
 
02.10.19
15:45
Ну и в регистр Продажи, вы пишите хрень вот тут:


    Если ВыборкаНоменклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда
    ........................

     Иначе
    /дальше полная ересь, ибо нет обхода нижестоящей группировки по "не товару"        
            Движение = Движения.Продажи.Добавить();
            Движение.Период = Дата;
            Движение.Номенклатура = Выборка.Номенклатура;
            Движение.Клиент = Клиент;
            Движение.Мастер = Мастер;
            Движение.Количество = Выборка.Количество;
            Движение.Выручка = Выборка.Сумма;
19 UUmmmmm
 
02.10.19
15:58
(18) Это исправлено уже, теперь при записи в регистр остатки материалов, если количества достаточно для списания из одной приходной, он зачем-то добавляет вторую пустую, почему?

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

    КонецЦикла;
    КонецЕсли;
КонецЦикла;

Движения.Записать();
КонецПроцедуры
20 vicof
 
02.10.19
16:46
Ну возьми уже отладчик в руки
21 Ёпрст
 
02.10.19
17:18
(19) потому, что упорно втыкаешь условие на остаток не от нужной группировки запроса.