Задачка По Списанию Партий

Allexei

Well-known member
02.05.2008
322
1
#1
Всем доброго времени суток. Есть задачка, из сборника задач на спеца по платформе, с очень хитрым условием.(1.5). Собственно сама задача(упрощенно).
Документом поступления товар приходуется, ведется партионный учет(только фифо). Списание производится документом реализации !!!с указанием в т.ч. приоритетного документа партии!!!. Если бы в условии было сказано что в документе нет повторяющихся строк, то решение было бы весьма не трудным, но у нас могу быть (и будут) дублирующиеся строки в документе. В чем проблема: на пример, мы работаем только с одним товаром. Имеем следующие поступления:
ПТ1-10
ПТ2-20
ПТ3-30
и одну реализацию(ее табличная часть)
Тов1 15 по ПТ1
Тов1 25 по ПТ2
Вот тут вопрос и возникает.... То есть по идеи в начале первая строка должна списать из ПТ1 10 штучек, затем вторая строка из ПТ2 20 штучек, а затем они обе из ПТ3 по 5 штучек. Все это надо реализовать в рамках 1 запроса. Ну комрады, есть мысли.
зы
Запрос писать за меня не надо, просто поделитесь мыслями как это можно организовать. Так же не надо отправлять на форум Павла Чистова. :)
 

Дайнеко

Well-known member
19.11.2009
951
0
#2
Все это надо реализовать в рамках 1 запроса.
Трудность учебных задач в том, что решение надо не для практики, а как "надо".
Скажу по своим соображениям. Не представляю возможным нарисовать круто умный запрос, который на блюдечке преподаст партии, с которых надо списать и в каком количестве, по какой стоимости, привязанным к строкам документа. Да еще и шепнет на ушко, где чего не хватает.

Реальную трудность я вижу в том, что запрос даст остатки на момент "до списания". А проводки мы делаем на каждую строку документа. Поэтому уже 2-ой строке дока нельзя доверять запросу. А вдруг первая строка уже списала этот товар?

Я делаю так:
* Запрос по всем товарам из накладной, с детализацией до партии.
* Выгрузил в ТЗ
* Цикл по строкам дока.
- Каждая строка ищет свой товар в ТЗ. Сверяет наличие
- делает проводку
- Ключевой момент: корректируется ТЗ на количество, списанной с этой партии.
- если на одной партии не хватило, идем к следующей.
 

Allexei

Well-known member
02.05.2008
322
1
#3
Дайнеко , ну у Вас слишком просто :) Так и я могу...Ладно буду медетировать над запросом, может что и придумаю...
 

puh14

Well-known member
11.07.2008
1 412
0
#4
Основная беда, которую я вижу - это необходимость циклической проверки в запросе ( осталось что- либо списывать, или нет). Циклы в запросе не поддерживаются, значит надо делать временные таблички. Их количество задается запросом - значит количество итераций ( вычисления, все-ли списали) будет ограничено. и вполне возможно попасть на ситуацию когда запланированные итерации кончились, а остаток на списание остался.

Самый простой вариант - до запроса делаем проходку по строкам и тупо списываем минимум по партии между надо списать и остатком на складе. После чего создаем движение и ЗАПИСЫВАЕМ ЕГО!. В результате мы избавляемся от приоритетной партии , а дальше просто запрос с сортировкой по фифе.

Вот наверно то что поможет - тебе нужен нарастающий итог в запросе. Делаешь табличку номер раз - в ней пишешь товар, партия, количество списать, количество наличие.

Затем формируешь вторую табличку в которой товар , из первой и партия не равна в случае в записях первой таблицы количество списать больше количество чем количество осталось. Сортируешь ее по фифе.

А дальше идет финт ушами - нарастающий итог по таблице с остатками ( http://help1c.com/faq82/view/955.html )- пихаешь его в третью таблицу.

А потом выбираешь из таблички номер три те записи, в которых количество нарастающее меньше количество осталось списать из первой.

Добавляешь записи из первой ( разумеется те, в которых происходит полное списание приоритетной партии или кол-во списания < количество наличие) и вот оно.

некоторые ньюансы опустил, условия расписал не все. Но вроде как идея рабочая.
 

unknown181538

НеГуру
28.12.2008
1 417
0
#5
Вообще, находил код реализации ФИФО в запросе, но это очень сложно, и вряд ли подойдет для этого случая. На экзамене специалиста не требуется.
Здесь я бы сделал по варианту Дайнеко.
"Самый простой вариант - до запроса делаем проходку по строкам и тупо списываем минимум по партии между надо списать и остатком на складе. После чего создаем движение и ЗАПИСЫВАЕМ ЕГО!. В результате мы избавляемся от приоритетной партии , а дальше просто запрос с сортировкой по фифе. " - мне кажется, будет дольше - два запроса и две записи движений получается.