Продолжение темы «Если бы я попытался воспроизвести функциональность модуля «Управление Запасами» iScala, что бы я усовершенствовал?»

Работаю над моделью идеального модуля Управления Запасами. Пока, разумеется, это всё черновой вариант, но кое-какие идею, в том числе озвученные ранее пытаюсь проверить/протестировать. Для начала поговорим о таблице складских проводок. Из интересного я проверил идею одновременного ведения учёта не только как в Скале, т.е. в локальной валюте и валюте консолидации, но и в двух моделях оценки запасов — средневзвешенной и ФИФО также одновременно. То есть у меня в таблице будет 4 поля цены: в локальной валюте по средневзвешенной цене, в валюте консолидации по средневзвешенной цене, в локальной валюте по конкретной партии (FIFO) и валюте консолидации по конкретной партии:
| Поле | Наименование | Имя поля | Тип поля |
| 1 | Первичный ключ, счётчик (номер строки в таблице) | SCTR001 | int |
| 2 | Код запаса | SCTR002 | int |
| 3 | Код склада | SCTR003 | int |
| 4 | Код корреспондирующего склада | SCTR004 | int |
| 5 | ID партии | SCTR005 | int |
| 6 | Тип проводки | SCTR006 | int |
| 7 | Дата проводки | SCTR007 | date |
| 8 | Количество | SCTR008 | numeric(15,8) |
| 9 | Цена за единицу в локальной валюте (Средневзвешенная) | SCTR009 | numeric(20,8) |
| 10 | Цена за единицу в валюте консолидации (Средневзвешенная) | SCTR010 | numeric(20,8) |
| 11 | Цена партии (ФИФО) в локальной валюте | SCTR011 | numeric(20,8) |
| 12 | Цена партии (ФИФО) в валюте консолидации | SCTR012 | numeric(20,8) |
| 13 | Источник проводки | SCTR013 | int |
| 14 | Номер заказа | SCTR014 | int |
| 15 | Номер строки заказа | SCTR015 | int |
| 16 | Номер строки поставки | SCTR016 | int |
| 17 | Код поставщика/покупателя (получено от) | SCTR017 | int |
| 18 | Учётный код (Запас) | SCTR018 | int |
| 19 | Учётный код 2 (Покупатель/Поставщик и т.п.) | SCTR019 | int |
| 20 | User ID | SCTR020 | int |
| 21 | Номер счёта-фактуры | SCTR021 | nvarchar(25) |
| 22 | Ссылка на номер строки в таблице счётов-фактур в модулях закупок или продаж | SCTR022 | int |
| 23 | Время создания записи | SCTR023 | datetime |
| 24 | Текстовое поле | SCTR024 | nvarchar(100) |
| 25 | Сумма в локальной валюте (Средневзвешенная) | SCTR025 | numeric(20,8) |
| 26 | Сумма в валюте консолидации (Средневзвешенная) | SCTR026 | numeric(20,8) |
| 27 | Сумма по строке (ФИФО) в локальной валюте | SCTR027 | numeric(20,8) |
| 28 | Сумма по строке (ФИФО) в валюте консолидации | SCTR028 | numeric(20,8) |
| 29 | Флаг проводка главной книги создана | SCTR029 | bit |
| 30 | Номер проводки главной книги | SCTR030 | int |
| 31 | Номер приходной накладной | SCTR031 | int |
Я уже создал хранимые процедуры для типов проводок прихода, расхода и перемещения. Здесь всё по-взрослому, с транзакциями, с проверкой наличия партии и её обновлением (если есть) и созданием (если нет) и то же в отношении записи в таблице средневзвешенных цен. Работает! Осталось сделать самые сложные — распределение доп. затрат и автоматические корректировки. Увлекательнейшее занятие. Типов проводок у меня тоже будет гораздо больше, чем в Скале:
| Категория типа проводки | Код типа проводки | Описание | Использовать учётный код 2? | Откуда берётся цена? | Примечание |
| Приход | 1 | Приход от поставщика (закупка) | Да | Из строки заказа на закупку | Имеет количество и цену, изменяет текущую себестоимость |
| Приход | 2 | Возврат от покупателя | Да | Берётся текущая себестоимость, но может быть изменена вручную в форме строки заказа на продажу, если нет текущей себестоимости | Имеет количество и цену, изменяет текущую себестоимость |
| Приход | 3 | Изготовление в производстве | Да | Рассчитывается как сумма себестоимости израсходованных компонентов, делённая на приходуемое количество в производственном заказе. Нет ручной корректировки | Имеет количество и цену, изменяет текущую себестоимость |
| Приход | 4 | Излишки при инвентаризации | Нет | Берётся текущая себестоимость, но может быть изменена вручную в форме строки инвентаризационной разницы, если нет текущей себестоимости | Имеет количество и цену, изменяет текущую себестоимость |
| Перемещение | 5 | Перемещение с другого склада | Нет | Текущая себестоимость, нет ручной корректировки | Имеет количество и цену, изменяет текущую себестоимость |
| Изменение цены | 6 | Затраты на приход | Да | Распределяется по строкам поставки заказа на закупку в определённой пропорции | Только сумма, без изменения количества, изменяет текущую себестоимость |
| Изменение цены | 7 | Автоматическая корректировка цены | Да | Автоматически | Только сумма, без изменения количества, изменяет текущую себестоимость |
| Изменение цены | 8 | Переоценка (дооценка) | Нет | Автоматически | Только сумма, без изменения количества, изменяет текущую себестоимость |
| Изменение цены | 9 | Переоценка (уценка) | Нет | Автоматически | Только сумма, без изменения количества, изменяет текущую себестоимость |
| Изменение цены | 10 | Корректировка себестоимости запаса, отгруженного покупателю | Да | Автоматически | Только сумма, без изменения количества, НЕ изменяет текущую себестоимость, отправляется «вдогонку» уже израсходованному запасу |
| Изменение цены | 11 | Корректировка себестоимости запаса, списанного по недостаче | Нет | Автоматически | Только сумма, без изменения количества, НЕ изменяет текущую себестоимость, отправляется «вдогонку» уже израсходованному запасу |
| Изменение цены | 12 | Корректировка себестоимости запаса, израсходованного в производстве | Да | Автоматически | Только сумма, без изменения количества, НЕ изменяет текущую себестоимость, отправляется «вдогонку» уже израсходованному запасу |
| Изменение цены | 13 | Корректировка себестоимости запаса, списанного на различные нужды | Да | Автоматически | Только сумма, без изменения количества, НЕ изменяет текущую себестоимость, отправляется «вдогонку» уже израсходованному запасу |
| Расход | 14 | Отгрузка покупателю | Да | Текущая себестоимость, нет ручной корректировки | Имеет количество и цену, НЕ изменяет текущую себестоимость |
| Расход | 15 | Возврат поставщику | Да | Из строки заказа на закупку | Имеет количество и цену, МОЖЕТ изменять текущую себестоимость??? |
| Расход | 16 | Расход в производстве | Да | Текущая себестоимость, нет ручной корректировки | Имеет количество и цену, НЕ изменяет текущую себестоимость |
| Расход | 17 | Списание на различные нужды | Да | Текущая себестоимость, нет ручной корректировки | Имеет количество и цену, НЕ изменяет текущую себестоимость |
| Перемещение | 18 | Перемещение на другой склад | Нет | Текущая себестоимость, нет ручной корректировки | Имеет количество и цену, НЕ изменяет текущую себестоимость |
| Расход | 19 | Недостача при инвентаризации | Нет | Текущая себестоимость, нет ручной корректировки | Имеет количество и цену, НЕ изменяет текущую себестоимость |
| Перемещение внутри одного склада | 20 | Перемещение между местами хранения | Нет | Не указывается | Имеет количество, не имеет цены, ничего не меняет с точки зрения себестоимости, только местоположение |
Помните, чуть ранее я писал:
классическая ситуация, о которой меня многократно спрашивали мои клиенты на протяжении многих лет:
Например, у нас установлена модель оценки запасов «Средневзвешенная цена». На складе 01 имеется 100 единиц какого-то запаса по цене 100 рублей за единицу, на складе 02 имеется 100 единиц этого же запаса по цене 200 рублей за единицу. Делается проводка по перемещению всех единиц запаса со склада 01 на склад 02. В результате на складе 02 оказывается 200 единиц запаса по цене 150 рублей (цена усреднилась). Выясняется, что проводка была сделана ошибочно и делается обратное перемещение тех же 100 единиц запаса. Но она происходит уже по 150 рублей за штуку, а не по 100, как исходная. Пользователь недоволен. Я обычно комментирую это следующим образом: «А что вы хотите? У вас было полстакана чая без сахара, вы перелили его туда, где было полстакана чая с сахаром, перемешали и хотите вернуть обратно полстакана без сахара. Это возможно?» Ответ очевиден. Но, может быть с проводками несколько проще, чем с чаем, как вы думаете?
Вот я и думаю, может быть сделать ещё отдельный тип проводки «Отмена перемещения между складами»? Со ссылкой на конкретную исходную проводку. Правда, возможно это только в том случае, если со склада назначения ещё не был сделан расход. Или был сделан, но не из той партии, которая нам нужна? А если был сделан, то тогда нужно корректировать себестоимость ушедшего запаса по средневзвешенной цене. В общем, наверное, а ну его от греха подальше 🙂
А вы что скажете?
Продолжение уже последовало… 🙂


