Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 15:20

Проверка остатков в расходной накладной при партийном учете

Автор Глеб Шахов, 14 ноя 2024, 10:26

0 Пользователей и 2 гостей просматривают эту тему.

Глеб Шахов

Всем привет. Подскажите, пожалуйста, почему в остатках получается ноль, хотя в регистре есть остатки. Есть документ партия по которому формируется приходная накладная. И есть расходная накладная. При запросе внутри расходной, когда проверяю, чтобы товара хватало в отладчике Выборка.КоличествоОстаток = 0 всегда.

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

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

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

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

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

Максим75

Глеб Шахов, видимо потому, что у Вас нет Партии с моментом времени равном текущему моменту времени.
Партия - это некий документ, который должен быть создан немного раньше, чем документ расхода, поэтому при таком условии и ноль.
Вам надо виртуальную таблицу остатков получить на нужную дату (даже не на момент времени) и желательно на конец дня в этой дате, а не отбирать партии по моменту времени. Вам же нужны ВСЕ партии, по которым на нужную дату есть остаток.

и кстати, такой алгоритм уже не используют в самой 1С, поищите лекции по этому поводу Чистова. Там вначале документ делает движение по регистру, потом вторым запросом после созданного набора записей проверяется остаток, и вот если есть остатки с минусом после "проведения", то пишется в каком товаре косяк с остатком и отказывают в проведении (вот этот Отказ=Истина);

LexaK

Глеб Шахов, вот это условие из запроса уберите
        |                Партия.МоментВремени = &МоментВремени

а вот это вообще, зачет на двоечника!

Цитировать|    СУММА(РасходнаяНакладнаяТовары.Цена) КАК Цена,
если помогло нажмите: Спасибо!

Глеб Шахов

Максим75, Да, все верно. Когда по отладчику смотрю значение Партии пустое. Я взял этот запрос из решения на сайте, просто сижу разбираюсь. Чистова только еще начал смотреть, спасибо, за совет

Глеб Шахов

LexaK, Огроменное спасибо. Стану программистом - первый миллион ваш.

Цитироватьа вот это вообще, зачет на двоечника!


Это чужой запрос, я просто пытаюсь его разобрать)

LexaK

Глеб Шахов,
ЦитироватьСтану программистом
наверно я не доживу... (особенно до хорошего программиста)  ;)

даже чужой код (тем более), надо анализировать, когда используете в своих целях

в учебниках специально закладывают ошибки в код, что бы вы не бездумно сдирали примеры...  :befhbt:
если помогло нажмите: Спасибо!

Максим75

LexaK, эх, вот так взяли и обломали  B)
ну мы же тоже учились когда-то, тоже в первое время такой бред писали, ничего, чему-то да научились.

Глеб Шахов

LexaK, Я только начал смотреть Чистова, для меня такой запрос пока еще сложноват. В целом, повторить его в конструкторе уже успех. В любом случае, еще раз спасибо.

Глеб Шахов

Максим75,  LexaK, сказал, что не доживет(((
Значит отправлю вам)

LexaK

Максим75,
Цитировать, вот так взяли и обломали
ни чего подобного!
Иногда хороший пинок - придает крылья!  :bleh:

(и не ндо браться сразу за сложные вещи! с начала в элементарном разберитесь
в ссылках, типах данных, как они взаимодействую друг с другом....)
если помогло нажмите: Спасибо!

Теги: Запрос 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск