О системах планирования ресурсов предприятия Scala, iScala
“ Который раз возникают мысли о возможности воспроизведения функциональности iScala средствами SQL сервера. Мой коллега Игорь Чанышев уже давно с помощью своего RM2 дорабатывает или фактически переписывает то, что в iScala работает не самым оптимальным образом или отсутствует, а может быть и работает наилучшим образом, но у клиента отсутствует соответствующая лицензионная опция или версия настолько старая, что её трудно совместить с современными требованиями. Впрочем, какая разница, давайте просто поразмышляем, что бы я оставил, что выкинул, а что усовершенствовал :)
  • Главная
    • О проекте
      • Разъяснение о проекте и его участниках
      • Заявление / Memorandum
    • Новости проекта
    • Список опубликованных материалов основного раздела
    • Информация, перенесённая из старых форумов
    • Подписаться на новостную рассылку
  • Наши услуги
  • Статьи
    • Статьи
    • Избранное
    • Мысли вслух
  • Процедуры
  • Доходчиво о сложном
    • Обучение
    • Как сделать?
    • iScala «для чайников»
    • Оч.умелые ручки
  • Структура таблиц
    • Scala 5.1 SR13
    • iScala 2.2 HF 2.3318
    • Tables structure changes history from iScala 2.2 SR2 to iScala 3.0 FSP4
    • Epicor iScala 2.3 — 2.03.3363
    • Epicor iScala 2.3 SR1
    • Epicor iScala 2.3 SR2
    • Epicor iScala 2.3 SR3
    • Epicor iScala 3.00 FSP 2 — 3.00.02254
    • Epicor iScala 3.0 FSP4 — 3.0.4267
    • Изменение структуры таблиц iScala 3.1 по сравнению с iScala 3.0 FSP4 / Table structure changes between iScala 3.0 FSP4 and iScala 3.1
    • Epicor iScala 3.1 — 3.1.0511
    • Epicor iScala 3.2 — 3.2.0317
    • Epicor iScala 3.3 — 3.3.0419
    • Epicor iScala 3.4 — 3.4.0399
    • Epicor iScala 3.5 — 3.5.0.0429
    • Изменение полей в таблицах БД iScala 3.4 по сравнению с iScala 3.2 / Difference between DB structure of iScala 3.4 and iScala 3.2
    • Изменение полей в таблицах БД iScala 3.5 по сравнению с iScala 2.2 / Difference between DB structure of iScala 3.5 and iScala 2.2
  • Материалы по модулям iScala
    • Главная Книга
    • Основные Средства
    • Книга Закупок
    • Книга Продаж
    • Заказы на Закупку
      • Требования
    • Заказы на Продажу
    • Управление Запасами
    • Установка, Администрирование
      • Настройка определений документов MSRS
    • Заработная плата
    • Структура базы данных
    • Отчётность SSRS
    • Отчётность AFR
    • Примеры отчётов
    • Примеры отчётов AFR
    • Интеграция с другими системами
    • Epicor Service Connect
  • English
  • Контакты
  • Поиск
Главная  »»»  Базы данных и программирование  »»»  Если бы я попытался воспроизвести функциональность модуля «Управление Запасами» iScala, что бы я усовершенствовал?

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

14.03.2024 Автор Алексей Васильев

Не первый раз возникают мысли о возможности воспроизведения функциональности 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). Обновить количество по всем складам в карточке запаса.

Подтвердить транзакцию.

Вуаля! Продолжение следует…

Рубрика: Базы данных и программирование, Управление Запасами Метки: iScala, RM2, проводки, склад
VK Telegram Про канал в WhatsApp

Copyright © 2025 О системах планирования ресурсов предприятия Scala, iScala.

Gammapolis WordPress Theme by ERP & Business Consulting

Прокрутка вверх