|
Помогите разобраться в циклах | ☑ | ||
---|---|---|---|---|
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) потому, что упорно втыкаешь условие на остаток не от нужной группировки запроса.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |