В чем ошибка процедуры?

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

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

        ОсталосьСписать = Выборка.Количество;
        ПолнаяВыборка = Выборка.Выбрать();

        Пока (ОсталосьСписать > 0) И ПолнаяВыборка.Следующий() Цикл
            КоличествоСписания = Мин(ОсталосьСписать,  ПолнаяВыборка.КоличествоОстаток);

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

            Стоимость = Стоимость + Движение.Стоимость;
         КонецЦикла;

        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = Выборка.Номенклатура;
        Движение.Количество = Выборка.Количество;
        Движение.Стоимость = Стоимость;
        Движение.Продажа = Выборка.Сумма;
    КонецЦикла;

	
КонецПроцедуры
Показать
По теме из базы знаний
Найденные решения
4. andy_zhav 197 23.06.20 08:29 Сейчас в теме
(1) Самое первое что бросилось в глаза - Это параметр запроса "Дата". По-идее тут должен быть момент времени. Ну или граница периода. Иначе при перепроведении документа будут учтены движения текущего документа.

Ну и про ОсталосьСписать правильно написали
user1426637; alex-l19041; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. soft_wind 22.06.20 20:54 Сейчас в теме
(1) Это тестовое задание? Требуйте пример и отладчик!!!!
сразу все будет понятно,
а так на первый взгляд косчк зделсь -

КоличествоСписания = Мин(ОсталосьСписать, ПолнаяВыборка.КоличествоОстаток);
не производится коррекция - ОсталосьСписать, видимо списывается больше чем надо
в общем, без отладчика - ХЗ что там еще не так.
user1426637; +1 Ответить
3. palsergeich 23.06.20 01:32 Сейчас в теме
(2) Не похоже на тестовое.
больше похоже на подготовку к спецу.
user1426637; +1 Ответить
9. TODD22 18 23.06.20 13:46 Сейчас в теме
(3)
Не похоже на тестовое.

Очень часто в качестве тестового задания дают задачу на спеца.
11. user1426637 23.06.20 17:35 Сейчас в теме
(2) спасибо большое, а как исправить ошибку в коде, где ОсталосьСписать ?
4. andy_zhav 197 23.06.20 08:29 Сейчас в теме
(1) Самое первое что бросилось в глаза - Это параметр запроса "Дата". По-идее тут должен быть момент времени. Ну или граница периода. Иначе при перепроведении документа будут учтены движения текущего документа.

Ну и про ОсталосьСписать правильно написали
user1426637; alex-l19041; +2 Ответить
10. user1426637 23.06.20 17:33 Сейчас в теме
(4) спасибо большое, а как исправить ошибку в коде, где ОсталосьСписать ?
12. andy_zhav 197 23.06.20 20:40 Сейчас в теме
(10) ОсталосьСписать = ОсталосьСписать - КоличествоСписания;
Во вложенном цикле в самом конце
user1426637; +1 Ответить
5. DenisCh 23.06.20 10:35 Сейчас в теме
А зачем внутри цикла по выборке ещё раз выборка.выбрать()?
user1426637; +1 Ответить
6. MuxaH 23.06.20 11:59 Сейчас в теме
(5) Там сгруппировано по Номенклатуре, видимо вторым выбрать остатки по партиям выбираются.
7. DenisCh 23.06.20 13:08 Сейчас в теме
(6) Ну так обход результата запроса же ставить надо...
8. andy_zhav 197 23.06.20 13:39 Сейчас в теме
(5) Там все правильно. Запрос с итогами по номенклатуре. Первая выборка с обходом по группировкам. Вторая выборка - прямая по детальным записям первой группировки.
user1426637; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот