Задание - аналог задания на спеца. Требуется списать расходной накладной товар со скдада по FIFO. Когда делаю проверку по остаткам - не пишет на каком складу(ВыборкаНоменклатура.Склад) не хватает(. Что нужно исправить? учет ведется в разрезе складов.
Запрос.Текст =
"ВЫБРАТЬ
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма,
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад
|ПОМЕСТИТЬ РасходнаяНакладная
|ИЗ
| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
|ГДЕ
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка.Склад
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| РасходнаяНакладная.Номенклатура КАК Номенклатура,
| РасходнаяНакладная.Количество КАК Количество,
| РасходнаяНакладная.Сумма КАК Сумма,
| ОстаткиНоменклатурыОстатки.Партия КАК Партия,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток,
| ОстаткиНоменклатурыОстатки.Склад КАК СкладСрег,
| РасходнаяНакладная.Склад
|ИЗ
| РасходнаяНакладная КАК РасходнаяНакладная
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| РасходнаяНакладная.Номенклатура
| ИЗ
| РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки
| ПО РасходнаяНакладная.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
|ГДЕ
| РасходнаяНакладная.Склад = ОстаткиНоменклатурыОстатки.Склад
|
|УПОРЯДОЧИТЬ ПО
| ОстаткиНоменклатурыОстатки.Партия.МоментВремени
|ИТОГИ
| МАКСИМУМ(Количество),
| МАКСИМУМ(Сумма),
| СУММА(КоличествоОстаток)
|ПО
| Номенклатура";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Результат = Запрос.Выполнить();
ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); //с иерархией
Пока ВыборкаНоменклатура.Следующий() Цикл
//выб= ВыборкаНоменклатура.Выбрать().Следующий();
// проверим остатки
Если (ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не хватает "+ (ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток) +
" позиций номенклатуры " + ВыборкаНоменклатура.Номенклатура + "."+ "На складе"+ВыборкаНоменклатура.Склад;
Сообщение.Сообщить();
Отказ = Истина;
Продолжить;
КонецЕсли;
ПоказатьПо теме из базы знаний
- Учет материалов по принципу FIFO/LIFO в типовой бухгалтерии 4.5
- Отчет по залежавшейся номенклатуре на складах БП 1.6
- 50+ советов для успешной сдачи 1С: Специалист по платформе
- Автоматизация предприятий пищевой отрасли на базе 1С:ERP (прослеживаемость состава готовой продукции от сырья до реализации)
- 1C:Предприятие для программистов: Решение прикладных задач. Видеокурс.
Найденные решения
(3)
ну, кстати, да... сами же и ответили на свой вопрос
вы выбираете иерархическую структуру, то есть дерево по сути
По верхнему уровню у вас есть обход, но в нём нет склада. Склад у вас на втором уровне.
Это легко проверить, например, так:
только в управляемых формах работать не будет - нужно запускать в обычном приложении
что нужно сделать - нужно "вытащить" склад на верхний уровень:
можно МАКСИМУМ или МИНИМУМ - по фигу, скад же реквизит шапки.... Его кстати, можно просто так и вывести, не из выборки.
ну, кстати, да... сами же и ответили на свой вопрос
вы выбираете иерархическую структуру, то есть дерево по сути
По верхнему уровню у вас есть обход, но в нём нет склада. Склад у вас на втором уровне.
Это легко проверить, например, так:
ДЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
ОткрытьЗначение(ДЗ);
только в управляемых формах работать не будет - нужно запускать в обычном приложении
что нужно сделать - нужно "вытащить" склад на верхний уровень:
|ИТОГИ
| МАКСИМУМ(Количество),
| МАКСИМУМ(Сумма),
| СУММА(КоличествоОстаток),
| МАКСИМУМ(Склад) как Склад
|ПО
| Номенклатура";
можно МАКСИМУМ или МИНИМУМ - по фигу, скад же реквизит шапки.... Его кстати, можно просто так и вывести, не из выборки.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
|ГДЕ
| РасходнаяНакладная.Склад = ОстаткиНоменклатурыОстатки.Склад
| РасходнаяНакладная.Склад = ОстаткиНоменклатурыОстатки.Склад
за вот это со спеца можно и домой пойти сразу :) Это должно быть в параметрах виртуальной таблицы.. там же, где и номенклатура.
В остальном похоже на правду вроде.. В консоле запросов нужно отладить и посмотреть чтоб там склад точно выводился.
(2) romansun, спасибо за своет, в следующий раз на виртуальную наложу, но в кода когда сообщениевывожу о нехватке склад не видится ВыборкаНоменклатура.Склад. Когда запрос ввывожу в прямом виде ВЫполнить().ВЫбрать()- без обхода по групировка, то склад в выражении ВыборкаНоменклатура.Склад выводится, может что нужно в обходе поменять?
(3)
ну, кстати, да... сами же и ответили на свой вопрос
вы выбираете иерархическую структуру, то есть дерево по сути
По верхнему уровню у вас есть обход, но в нём нет склада. Склад у вас на втором уровне.
Это легко проверить, например, так:
только в управляемых формах работать не будет - нужно запускать в обычном приложении
что нужно сделать - нужно "вытащить" склад на верхний уровень:
можно МАКСИМУМ или МИНИМУМ - по фигу, скад же реквизит шапки.... Его кстати, можно просто так и вывести, не из выборки.
ну, кстати, да... сами же и ответили на свой вопрос
вы выбираете иерархическую структуру, то есть дерево по сути
По верхнему уровню у вас есть обход, но в нём нет склада. Склад у вас на втором уровне.
Это легко проверить, например, так:
ДЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
ОткрытьЗначение(ДЗ);
только в управляемых формах работать не будет - нужно запускать в обычном приложении
что нужно сделать - нужно "вытащить" склад на верхний уровень:
|ИТОГИ
| МАКСИМУМ(Количество),
| МАКСИМУМ(Сумма),
| СУММА(КоличествоОстаток),
| МАКСИМУМ(Склад) как Склад
|ПО
| Номенклатура";
можно МАКСИМУМ или МИНИМУМ - по фигу, скад же реквизит шапки.... Его кстати, можно просто так и вывести, не из выборки.
(4) romansun, спасибо, получилось проверка) не знал что есть ОткрытьЗначение().
А можно ли сделать, так не создавая дополнительного запроса или модифицировать прежний,
чтобы себестоимость, которая высчитывается так:
не бралась в расчте склада с которого ее списывают.
Тоесть к примеру поступил товар1 на ОСНОВНОЙ склад, потом товар1 на ДОПОЛНИТЕЛЬНЫЙ, затем на СКЛАД1 и себестоимость считалась сначала с 1 склада, 2 склад и потом 3 склада
А можно ли сделать, так не создавая дополнительного запроса или модифицировать прежний,
чтобы себестоимость, которая высчитывается так:
// Создаем движения
ТекСебестоимость = 0;
ОсталосьСписать = ВыборкаНоменклатура.Количество;
ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
Пока (ОсталосьСписать > 0) И ВыборкаДетальныеЗаписи.Следующий() Цикл
Списываем = Мин(ОсталосьСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток);
// регистр ОстаткиНоменклатуры Расход
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура= ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Склад = ВыборкаДетальныеЗаписи.Склад;
Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
Движение.Количество = Списываем;
//расчет себестоимости
Движение.Стоимость = (Списываем * ВыборкаДетальныеЗаписи.СтоимостьОстаток) /
ВыборкаДетальныеЗаписи.КоличествоОстаток;
ТекСебестоимость = ТекСебестоимость + Движение.Стоимость;
ОсталосьСписать = ОсталосьСписать - Списываем;
КонецЦикла;
Показатьне бралась в расчте склада с которого ее списывают.
Тоесть к примеру поступил товар1 на ОСНОВНОЙ склад, потом товар1 на ДОПОЛНИТЕЛЬНЫЙ, затем на СКЛАД1 и себестоимость считалась сначала с 1 склада, 2 склад и потом 3 склада
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот