Имя: Пароль:
1C
1С v8
Алгоритм списания партий по FIFO, есть ли ошибка?
0 devlabnn
 
13.07.13
01:35
Алгоритм предназначен для поиска набора партий, из которых должен списаться товар.


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

1) Ищем партию, с которой начинается списание, исходя из остатка товара на момент списания. Искомая партия - та строка таблицы приходов, где сумма предидущих приходов, включая текущий приход (нарастающий итог) впервые превысила или стала равной остатку товара на заданную дату.

Например, остаток товара 10 шт, таблица прихода такая:

Партия      Цена      Количество  Количество (нар. итог)
Партия3    10          2                  2
*Партия2   20          9                  11
Партия1    10          15                26


искомая партия -Партия2 (т.к. 11>=10). С этой партии начнется списание.

2) Обрезаем таблицу партий: оставляем только партии до нашей искомой  включительно (незабываем, что партии упорядочены по убыванию даты). Получим

Партия      Цена      Количество  Количество (нар. итог)
Партия3    10          2                  2
*Партия2   20          9                  11

3) Отсечем количество из искомой партии, которое нельзя использовать: сумма партий - остаток.
Количество в искомой партии = (Количество в искомой партии) - (сумма партий) + (остаток)

в нашем примере: 9 - 11 + 10 = 8. получим:

Партия      Цена      Количество
Партия3    10          2                  
*Партия2   20          8  

На данном этапе фактически получены остатки по партиям на дату списания без использования регистра остатков партий. Осталось лишь оставить в этой таблице самые старые партии, исходя из требуемого кол-ва списания. Кстати, на этом этапе мы знаем себестоимость товара - (10*2 + 20*8)/10 = 18

4) Отсортируем таблицу в обратном порядке:

Партия      Цена      Количество      Количество (нарастающий итог)
Партия2    20          8                      8
Партия3    10          2                      10

Оставим в таблице только те партии, где нарастающий итог по кол-ву не превысит списываемое кол-во + 1 партию. В последней партии изменим кол-во на разность между нарастающим итогом и списываемым кол-вом.
Предположим, требуется списать 9 единиц товара:

Партия      Цена      Количество      
Партия2    20          8                      
Партия3    10          1 (10-9)

Таблица списания партий получена.

6
Плюсы
- не требуется (не используется) регистр остатков по партиям товара, в следствие чего предидущие ошибки парт учета не влияют на будущее списание себестоимости (известная ситуация, когда приход на час позже, чем расход, и весь последующий парт. учет полетел)
- быстрое восстановление парт. учета
- быстрый подсчет себестоимости, когда нет остатков по партиям
1 Aleksey
 
13.07.13
01:38
а что делать с доп.расходами?
2 devlabnn
 
13.07.13
01:43
(1) как видите, они не учитываются - не было необходимости. Но, уверен, их можно прикрутить
3 ХомаБрут
 
13.07.13
01:50
а как без регистра партий мы увидим, что уже попользовались данной партией раньше?
4 Darych
 
13.07.13
01:52
(3)+ и ты попробуй про сроки годности товаров подумать
5 Aleksey
 
13.07.13
01:57
(3) никак, предполагаться что в прошлый раз списано все "правильно"


Правда я несовсем понимаю
1. как в возврате от покупателя определить партию
2. Как оприходования будет влиять на партии? Порождать свои новые текущей датой?
6 devlabnn
 
13.07.13
02:33
(5) 1. В моей организации возврат от покупателя является партией (с ценой партии равной цене возврата). В противном случае добавляем возвратны в таблицу поступлений с ценой партии, из которой был возврат
2. Оприходования - это партии
7 Reaper_1c
 
13.07.13
07:38
кг.
1. При работе задним числом учет становится неконтролируемой кашей.
2. Алгоритмы, построенные на базе расчета нарастающих итогов, работают медленнее, чем нормальное списание остатка партий.
3. Блокировки ласково улыбаются автору и предвкушают самосуд.

В результате от проблем обычного партионного учета не избавились, а новых понаделали.
8 shuhard
 
13.07.13
07:42
(0) минус один и жирный - производительность, которая будет падать с удлинением цепочки документов
9 Aleksey
 
13.07.13
10:12
(7) А блокировка на что?
10 Reaper_1c
 
13.07.13
10:27
(9) Видимо на все документы, образующие партии.
11 Aleksey
 
13.07.13
11:09
(10) Не понял. список партий - это обычный РС, При поступлении туд добавляется одна строчка, при списании идет чтения. В каком месте и когда блокировка возникнет?

P.S. У меня просто по похожему принципу организовано "подбор" партий при оприходования.
12 MKZM
 
13.07.13
11:14
Вместо того, чтобы заставить пользователей не класть прибор на работу, придумываем всякую велосипед.
13 Reaper_1c
 
13.07.13
13:00
(11) Да какая разница, если чтение должно быть блокирующим?
14 Aleksey
 
13.07.13
23:37
(13) это ненужно
15 RomanYS
 
14.07.13
00:58
Не вижу плюсов.
"- не требуется (не используется) регистр остатков по партиям товара, в следствие чего предидущие ошибки парт учета не влияют на будущее списание себестоимости (известная ситуация, когда приход на час позже, чем расход, и весь последующий парт. учет полетел)"
То, что ошибки нельзя выявить, не значит, что их нет. При твоем алгоритме ты узнаешь, только когда склад обнулится, а стоимость прихода и расхода не совпадет.

Единственное применение подобным алгоритмам: когда детальный учет не ведется, а заказчик очень хочет "детальный" отчет, а прикручивать новый регистр нецелесообразно. Например, классификация задолженности по срокам, когда нет учета по документам.