списание по методу FIFO со склада

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

    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());

    Результат = Запрос.Выполнить();
	ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); //с иерархией

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

            Отказ = Истина;
			Продолжить;
        КонецЕсли;
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
4. romansun 194 24.11.12 13:32 Сейчас в теме
(3)
ну, кстати, да... сами же и ответили на свой вопрос

вы выбираете иерархическую структуру, то есть дерево по сути

По верхнему уровню у вас есть обход, но в нём нет склада. Склад у вас на втором уровне.

Это легко проверить, например, так:

ДЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
ОткрытьЗначение(ДЗ);


только в управляемых формах работать не будет - нужно запускать в обычном приложении

что нужно сделать - нужно "вытащить" склад на верхний уровень:

        |ИТОГИ
        |    МАКСИМУМ(Количество),
        |    МАКСИМУМ(Сумма),
        |    СУММА(КоличествоОстаток),
        |    МАКСИМУМ(Склад) как Склад
        |ПО
        |    Номенклатура";


можно МАКСИМУМ или МИНИМУМ - по фигу, скад же реквизит шапки.... Его кстати, можно просто так и вывести, не из выборки.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. romansun 194 23.11.12 23:11 Сейчас в теме
|ГДЕ
| РасходнаяНакладная.Склад = ОстаткиНоменклатурыОстатки.Склад



за вот это со спеца можно и домой пойти сразу :) Это должно быть в параметрах виртуальной таблицы.. там же, где и номенклатура.

В остальном похоже на правду вроде.. В консоле запросов нужно отладить и посмотреть чтоб там склад точно выводился.
3. Manticor 66 24.11.12 13:07 Сейчас в теме
(2) romansun, спасибо за своет, в следующий раз на виртуальную наложу, но в кода когда сообщениевывожу о нехватке склад не видится ВыборкаНоменклатура.Склад. Когда запрос ввывожу в прямом виде ВЫполнить().ВЫбрать()- без обхода по групировка, то склад в выражении ВыборкаНоменклатура.Склад выводится, может что нужно в обходе поменять?
4. romansun 194 24.11.12 13:32 Сейчас в теме
(3)
ну, кстати, да... сами же и ответили на свой вопрос

вы выбираете иерархическую структуру, то есть дерево по сути

По верхнему уровню у вас есть обход, но в нём нет склада. Склад у вас на втором уровне.

Это легко проверить, например, так:

ДЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
ОткрытьЗначение(ДЗ);


только в управляемых формах работать не будет - нужно запускать в обычном приложении

что нужно сделать - нужно "вытащить" склад на верхний уровень:

        |ИТОГИ
        |    МАКСИМУМ(Количество),
        |    МАКСИМУМ(Сумма),
        |    СУММА(КоличествоОстаток),
        |    МАКСИМУМ(Склад) как Склад
        |ПО
        |    Номенклатура";


можно МАКСИМУМ или МИНИМУМ - по фигу, скад же реквизит шапки.... Его кстати, можно просто так и вывести, не из выборки.
5. Manticor 66 25.11.12 20:58 Сейчас в теме
(4) romansun, спасибо, получилось проверка) не знал что есть ОткрытьЗначение().

А можно ли сделать, так не создавая дополнительного запроса или модифицировать прежний,
чтобы себестоимость, которая высчитывается так:

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

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

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

                ТекСебестоимость 	 = ТекСебестоимость + Движение.Стоимость;
                ОсталосьСписать      = ОсталосьСписать - Списываем;
            КонецЦикла;
Показать

не бралась в расчте склада с которого ее списывают.
Тоесть к примеру поступил товар1 на ОСНОВНОЙ склад, потом товар1 на ДОПОЛНИТЕЛЬНЫЙ, затем на СКЛАД1 и себестоимость считалась сначала с 1 склада, 2 склад и потом 3 склада
7. yalo 26.11.12 17:13 Сейчас в теме
(5) Manticor, тогда постановка задачи должна быть уже другой: расчет себестоимости в целом по компании, а не по складам!
6. Manticor 66 26.11.12 10:37 Сейчас в теме
Может для этой цели создать еще один регистр накопления и там хранить ПАРТИЮ(документ приход.), стоиомость и количество? - тоесть без учета склада. И уже из этого накопительного считать себестоимость не завязанную на склад??
Оставьте свое сообщение

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