Не первый раз возникают мысли о возможности воспроизведения функциональности iScala средствами SQL сервера, особенно после инцидентов, связанных с тем, что iScala не использует транзакции SQL и обновление данных происходит частично. Но и не только это, конечно, заставляет задуматься. Мой коллега Игорь Чанышев уже давно с помощью своего RM2 дорабатывает или фактически переписывает то, что в iScala работает не самым оптимальным образом или отсутствует, а может быть и работает наилучшим образом, но у клиента отсутствует соответствующая лицензионная опция или версия настолько старая, что её трудно совместить с современными требованиями. Впрочем, какая разница, давайте просто поразмышляем, что бы я оставил, что выкинул, а что усовершенствовал 🙂
Начнём с таблиц модуля. Пока не с их структуры, а просто со списка таблиц. Для начала, я бы выбросил всё, с чем мне не пришлось сталкиваться в подавляющем количестве случаев в моей практике, оставил бы только самое основное (а там уже можно было бы что-то и добавить 🙂 ):
Название Таблицы | Маска Таблицы | Описание Таблицы |
SC01 | SC01%cc00 | SC01 — Карточки позиций запасов |
SC03 | SC03%cc00 | SC03 — Информация по позиции запаса по складам |
SC04 | SC04%cc00 | SC04 — Расширенная информация по позиции запаса |
SC07 | SC07%cc00 | SC07 — Аналитические складские проводки |
SC10 | SC10%cc00 | SC10 — Параметры модуля |
SC23 | SC23%cc00 | SC23 — Карточки складов |
SC24 | SC24%cc00 | SC24 — Таблица автоучёта |
SC25 | SC25%cc%yy | SC25 — Проводки Главной Книги |
SC33 | SC33%cc00 | SC33 — Информация по партиям |
SC34 | SC34%cc00 | SC34 — Затраты по партиям |
SC37 | SC37%cc00 | SC37 — Шаблоны карточек позиций запасов |
SC39 | SC39%cc00 | SC39 — Прейскуранты |
SCGL | SCGL%cc00 | SCGL — История складских проводок Главной Книги |
SCUC | SCUC%cc00 | SCUC — Коды единиц измерения |
SCUN | SCUN%cc00 | SCUN — Описание кодов единиц измерения на разных языках |
Сейчас, когда редактировал список таблиц, которые хотелось бы оставить на первом этапе, подумал, какое же огромное количество всего ненужного, взять хотя бы таблицу SC11 — Планирование по запасам, она используется в отчёте «Ожидаемые поступления/выдачи» и обновляется при изменении информации в заказах на закупку/продажу/производство. Всю ту же самую информацию можно получить «напрямую» из соответствующих модулей, зачем тогда тащить эту функциональность в «светлое будущее» 🙂
В то же время подход, когда остатки по конкретной позиции запаса или по конкретной партии хранятся в отдельной таблице, а не рассчитываются каждый раз из всех операций по данной позиции или партии, на мой взгляд, единственно правильный (недавно наблюдал так называемую динамическую структуру БД, как говорится «отворотясь не налюбуешься»).
Начну с типов складских проводок, как они есть сейчас:
- Проводка типа 00 — приход запаса от поставщика (создается через заказ на закупку или напрямую через модуль «Управление запасами», или в модуле «Управление производством» и т.д.). Эта проводка имеет как цену, так и количество, как правило, положительное.
- Проводка типа 01 — расход запаса (чаще всего создается через модуль «Заказ на продажу» или «напрямую» в модуле «Управление Запасами», или в модуле «Управление производством»). Эта проводка имеет как цену, так и количество, как правило, отрицательное. Кроме этого, отдельные проводки данного типа помечены специальным образом, например, сторно отрицательной партии.
- Проводка типа 02 — инвентаризационная разница (создается только «напрямую» в модуле «Управление запасами»). Эта проводка также имеет как цену, так и количество.
- Проводка типа 03 — распределение затрат (чаще всего создается через заказ на закупку или напрямую через модуль «Управление запасами»). Эта проводка, в отличие от предыдущих, не меняет количество на складе, т.е. имеет цену (сумму) и не имеет количества.
- Проводка типа 04 — перемещение между складами. Это парная проводка, т.е. перемещение со склада 01 на склад 02 создает 2 проводки по перемещению: проводку типа 04 для склада № 01 с отрицательным количеством (уход) и проводку типа 04 для склада 02 с положительным количеством (приход). Обе эти проводки обязательно дают в сумме 0 (создается только «напрямую» в модуле «Управление запасами»). Эта проводка также имеет как цену, так и количество.
- Проводка типа 05 — отклонение от нормативной цены (чаще всего создается через заказ на закупку или напрямую через модуль «Управление запасами»). Эта проводка, также как и проводка типа 03, не меняет количество на складе, т.е. имеет цену (сумму) и не имеет количества.
- Проводка типа 06 текущими версиями Скалы не создается — это устаревший тип проводки.
- Проводка типа 07 — автоматическая корректировка.
- Проводка типа 08 — переоценка (создается только «напрямую» в модуле «Управление запасами»). Эта проводка, также как и проводки типа 03 и 05, не меняет количество на складе, т.е. имеет цену (сумму) и не имеет количества.
- Проводка типа 09 — перемещение внутри одного склада. Это единственный тип аналитической проводки, на основании которой не создается бухгалтерская проводка.
- Проводка типа 10 — корректировка себестоимости «ушедшего» запаса.
Первое, что мне хотелось бы изменить в этом списке — это добавить отдельные типы проводок «отмены» для каждого типа. Я понимаю, что это требует тщательного анализа, возможно ли это в принципе и, если возможно, то каковы ограничения. Что имеется ввиду? Например, классическая ситуация, о которой меня многократно спрашивали мои клиенты на протяжении многих лет:
Например, у нас установлена модель оценки запасов «Средневзвешенная цена». На складе 01 имеется 100 единиц какого-то запаса по цене 100 рублей за единицу, на складе 02 имеется 100 единиц этого же запаса по цене 200 рублей за единицу. Делается проводка по перемещению всех единиц запаса со склада 01 на склад 02. В результате на складе 02 оказывается 200 единиц запаса по цене 150 рублей (цена усреднилась). Выясняется, что проводка была сделана ошибочно и делается обратное перемещение тех же 100 единиц запаса. Но она происходит уже по 150 рублей за штуку, а не по 100, как исходная. Пользователь недоволен. Я обычно комментирую это следующим образом: «А что вы хотите? У вас было полстакана чая без сахара, вы перелили его туда, где было полстакана чая с сахаром, перемешали и хотите вернуть обратно полстакана без сахара. Это возможно?» Ответ очевиден. Но, может быть с проводками несколько проще, чем с чаем, как вы думаете? 🙂
Кроме того, возможно, стоило бы разделить проводки типа 00 и типа 01 на исходные (приход от поставщика и отгрузка покупателю) и возврат. Понятно, что и так это можно определить по знаку, но может быть для пользователя это будет проще, если он захочет в каком-то отчёте отфильтровать только возвратные проводки. А вы как считаете?
Аналогично относительно проводок инвентаризационной разницы — отдельные тип для недостачи и отдельный для оприходования излишков.
Кроме этого, как я предлагал более 20 лет назад, я бы разделил проводки 10 типа на 3 разных типа: 10 оставил бы для проводок, которые были порождены проводками по уходу запаса покупателю (тип проводки 01), новый 11 тип — проводки, порождённые проводками по перемещению (уход на другой склад) и новый 12 тип — проводки, порождённые списанием недостачи (тип проводки 02). Сейчас первый и третий варианты имеют тип проводки 10 и отличаются только внутренними флагами в таблице проводок, которые пользователю не видны и потому непонятны, а второй вариант сделан таким образом, что проводка возникает только на складе, на который был перемещён запас, что тоже абсолютно непрозрачно.
А написать процедуру, которая создавала бы проводку определённого типа, не так уж и сложно, например, для типа 00:
Объявить транзакцию.
Проверить, есть ли для данного склада такая партия. Если нет, то создать. Добавить количество в существующую или только что созданную партию. Проделать манипуляции для таблицы затрат по партии (опускаю подробности). Проверить, есть ли запись для данного склада и данной позиции запаса в таблице средних цен (SC03 — Информация по позиции запаса по складам). Если нет, создать. Изменить в ней количество и среднюю цену. Добавить запись в таблицу складских проводок (аналитических — SC07). Обновить количество по всем складам в карточке запаса.
Подтвердить транзакцию.
Вуаля! Продолжение следует…