Основная причина такого положения вещей, это сложность и неочевидность механизма расчета резервов – центральной подсистемы механизма Интеркампани. Чтобы разобраться в проблеме и проследить алгоритм расчета резервов может уйти уйма времени, которого, как правило всегда недостаточно.
Я уже писал ранее о методике исправлении отрицательных остатков по товарам организаций, но:
- во-первых, описанные там подходы уже несколько устарели,
- во-вторых, в данной статье я хочу подробно остановиться на основных принципах формирования резервов. Взглянуть на этот процесс изнутри с позиции программиста.
Я не буду описывать различные нюансы расчета, а расскажу об основной концепции. Понимание этой концепции должно помочь при расследовании причин возникновения отрицательных остатков. А если у кого-то появиться желание разобраться в этом механизме более глубоко, данная статья будет для этого хорошей точкой опоры.
Примечание: Замечу сразу, что под резервами я здесь подразумеваю не резервы товаров на складах, а резервы образованные при нехватке товаров на определенной организации - резервы по Интеркампани. Если кто не знаком с реализацией данного механизма в ЕРП 2.4, для понимания текущего материала очень рекомендую прочесть эту статью.
И так поехали
Как было описано в первой статье на эту тему, расчет резервов в типовых конфигурациях выполняется в два этапа. Различные виды документов в процессе записи и проведения могут выполнять отдельно первый этап, отдельно второй или оба этапа последовательно.
Приведу схему из первой статьи
Виды документов |
Операция |
Первый этап |
Второй этап |
Документы поступления |
Проведение |
|
V |
Отмена проведения |
|
V |
|
Документы списания
|
Проведение, перепроведение с перезаполнением видов запасов |
V |
|
Отмена проведения |
|
V |
|
Документы списания и поступления |
Проведение, перепроведение с перезаполнением видов запасов |
V |
V |
Отмена проведения |
|
V |
Первый этап расчета резервов
Первый этап расчета резервов выполняется при заполнении или перезаполнении видов запасов в документах, которые осуществляют списание товаров и имеют табличную часть «ВидыЗапасов».
К таким документам относятся: «Реализация товаров и услуг», «Отчет о розничных продажах», «Перемещение товаров», «Списание недостач товаров», «Сборка товаров», «Передача товаров между организациями».
Входная процедура расчета: ЗапасыСервер -> ЗаполнитьВидыЗапасовПоТоварамОрганизаций, которая вызывается в обработчике модуля документа «ПередЗаписью».
Расчет выполняется только в следующих случаях:
- Проводится непроведенный документ.
- Выполнены изменения в документе, которые влияют на количество и состав видов запасов.
- Указано дополнительное свойство для документа «ПерезаполнитьВидыЗапасов». Данное свойство можно использовать при перепроведении документов для принудительного перезаполнения видов запасов и перерасчета резервов.
В результате, формирование резервов происходит до начала проведения документа и итоговые данные сохраняются в дополнительных свойствах в таблице «ТаблицаРезервыТоваровОрганизаций». Если для данного вида документа выполняется только первый этап, сформированные записи будут помещены в регистр «РезервыТоваровОрганизаций» совместно с записью в остальные регистры. Если расчет резервов выполняется в два этапа, запись в регистр «РезервыТоваровОрганизаций» произойдет после записи в остальные регистры и после выполнения второго этапа расчета.
Алгоритм расчета резервов на первом этапе
Ниже будут перечислены ключевые этапы расчета с примерами и с указанием процедур общего модуля «ЗапасыСервер».
Процедура: СформироватьВТТоварыОрганизацийИзменения
Формируется таблица «ВТТоварыОрганизацийИзменения» с изменениями по регистру «ТоварыОрганизаций» - на первом этапе эти изменения представляют из себя данные регистра до начала проведения документа. Если регистр пуст, то-есть проводится непроведенный документ, таблица изменений тоже будет пустая.
Процедура: СформироватьВТСторноРезервов
Формируется таблица, содержащая записи сторнирующие существующие резервы «ВТСторноРезервов».
Если происходит принудительное перезаполнение видов запасов (данные документа не изменяются), таблица не формируется, ниже будет понятно, почему это так.
Для формирования записей сторно отбираются все существующие резервы (не только резервы сформированные по текущему документу). Полученные записи фильтруются по полям: «АналитикаУчетаНоменклатуры», «Организация», «ВидЗапасов», «НомерГТД». В качестве фильтра используются записи таблицы «ВТТоварыОрганизацийИзменения», данные которой были получены ранее. Максимальное количество в записях сторно ограничено максимальным количеством в записях таблицы изменений.
Пример:
Если с учетом фильтров найдено резервов в количестве: 100, а изменений по товарам организаций: 5, в записях сторно количество будет: 5.
Процедура: СформироватьВТТаблицаОстатков
Здесь происходит расчет доступных остатков. В зависимости от типа документа, расчет может выполняться по товарам организаций, по товарам отданным на комиссию, по проданным товарам, по переданным товарам между организациями, по проданным товарам к возврату, по переданной возвратной таре, и это еще не весь список. Но нас будет интересовать самый первый вариант - расчет по товарам организаций, в котом происходит расчет доступных остатков, с учетом всех возможных передач по настройкам передач Интеркампани.
Процедура: ТаблицаОстатковТоваровОрганизаций
Первым делом формируется вспомогательная таблица «ДвиженияДокумента».
Таблица получается следующим образом. К записям таблицы с движениям по товарам организаций перед записью «ДвиженияТоварыОрганизацийПередЗаписью», прибавляются записи из сформированной выше таблицы «ВТСторноРезервов». Причем, если движение по товарам организаций перед записью - это расход по регистру, количество записи будет взято со знаком «-».
Рассмотрим все это на примере
Товар1 есть в наличии в организации Орг1 в количестве 2 шт. и в организации Орг2 в количестве 2 шт.
Есть проведенный документ «Реализация товаров и услуг» по организации Орг1 с товаром Товар1 в количестве 3 шт. Реализация сформировала резерв по организации Орг1 1 шт. (приход) и по организации Орг2 1 шт. (расход) в части недостающего товара.
При изменении количества в документе с 3 на 4 и проведении документа, происходит следующее:
Данные регистра «РезервыТоваровОрганизаций» перед перепроведением:
Товар1, Орг1: количество 1 шт. (приход)
Товар1, Орг2: количество 1 шт. (расход)
Таблица «ДвиженияТоварыОрганизацийПередЗаписью»:
Товар1: количество 3 шт. (расход)
Таблица «ВТТоварыОрганизацийИзменения»:
Товар1: количество 3 шт.
Таблица «ВТСторноРезервов»:
Товар1, Орг1: количество -1 шт. (приход)
Товар1, Орг2: количество -1 шт. (расход)
Таблица «ДвиженияДокумента»:
Товар1, Орг1: количество -3 + 1 = -2 шт.
Товар1, Орг2: количество -1 шт.
Продолжим описание механизма расчета
Далее формируются доступные остатки по сумме регистров «ТоварыОрганизаций» и «РезервыТоваровОрганизаций». По умолчанию, остатки формируются на конец месяца документа и на конец каждого последующего месяца, до момента последнего движения в регистре «ТоварыОрганизаций». Соответственно, если остатков не будет хватать хотя бы в одном периоде, документ проводиться не будет.
Можно установить дополнительное свойство документа «ОкончаниеПериодаПомощникаИсправленияОстатков», для ограничения периода расчета остатков текущим месяцем.
Примечание: Для исправления отрицательных остатков по товарам организаций может потребоваться выполнять расчет на границу текущего документа включительно. Такая возможность есть, но для этого необходимо внести небольшие корректировки в функцию «ДополнитьЗапросКонтролемОстатковНаКаждыйМесяц».
Сформированные остатки дополняются данными из таблицы «ДвиженияДокумента» со знаком «-». Результирующие остатки считаются доступными для распределения товаров текущего документа.
Продолжим пример выше
Таблица «ТаблицаОстатков»:
Товар1, Орг1: количество 0 – (-2) = 2 шт.
Товар1, Орг2: количество 1 – (-1) = 2 шт.
Если текущим документом является передача товаров между организациям, к доступным остаткам дополнительно прибавляются существующие резервы с видом движения «Расход», и значением реквизита «КорВидЗапасов» равным виду запасов, по которому товар приходуется в новую организацию.
Пример (не является продолжением примера выше)
Товар1 передается из организации Орг1 в организацию Орг2.
В регистре «РезервыТоваровОрганизаций» существуют следующие записи:
Товар1, Орг1: количество 1 шт. (расход) (КорВидаЗапасов – Орг2)
Товар1, Орг2: количество 1 шт. (приход) (КорВидаЗапасов – Орг1)
Остатки по товару Товар1 и организации Орг1, необходимо увеличить на 1, что скомпенсирует существующий резерв по этому товару и организации. Мы это можем сделать, так как после проведения документа передачи товаров, этот резерв в любом случае будет отсторнирован.
Вернемся к нашему примеру
Процедура: ЗаполнитьВидыЗапасовПоТаблицеОстатковСформироватьВТНовыеРезервы
После формирования таблицы с остатками происходит распределение товаров документа по доступным остаткам. Если не хватает остатка по видам запасов текущей организации, происходит формирование новых резервов. Очень интересен приоритет подбора доступных видов запасов, он будет рассмотрен ниже в отдельном разделе.
В случае с нашим примером
Таблица «ВТНовыеРезервы»:
Товар1, Орг1: количество 2 шт. (приход)
Товар1, Орг2: количество 2 шт. (расход)
Функция: ТаблицаРезервыТоваровОрганизаций
На последнем этапе выполняется формирование итоговых резервов в таблице «ТаблицаРезервыТоваровОрганизаций», которые складываются из следующих данных:
- Движения по регистру «РезервыТоваровОрганизаций» по текущему регистратору до проведения
- Таблица «ВТСторноРезервов»
- Таблица «ВТНовыеРезервы»
Для нашего примера
Таблица «ТаблицаРезервыТоваровОрганизаций»:
Товар1, Орг1: количество 1 – 1 + 2 = 2 шт. (приход)
Товар1, Орг2: количество 1 – 1 + 2 = 2 шт. (расход)
Для наглядности приведу все данные по рассмотренному примеру в оной таблице:
Товар |
Организация |
Резервы до проведения |
Изменения |
Сторно |
Данные документа |
Остатки |
Новые резервы |
Итог |
Товар1 |
Орг1 |
1 |
3 |
-1 |
-2 |
2 |
2 |
2 |
Товар1 |
Орг2 |
1 (расход) |
|
-1 |
-1 |
2 |
2 (расход) |
2 (расход) |
Такой сложный, с первого взгляда, механизм реализован в первую очередь для корректного расчета изменений в уже проведенных документах. Мы как раз рассмотрели такой случай выше.
Если данные документа не меняются и документ перепроводится с принудительным перезаполнением видов запасов, такой сложный механизм будет избыточным. По этому, формирование таблицы «ВТСторноРезервов» в этом случае не требуется.
Процесс расчета резервов будет выглядеть следующим образом:
Товар |
Организация |
Резервы до проведения |
Изменения |
Сторно |
Данные документа |
Остатки |
Новые резервы |
Итог |
Товар1 |
Орг1 |
1 |
3 |
|
-3 |
3 |
|
1 |
Товар1 |
Орг2 |
1 (расход) |
|
|
|
1 |
|
1 (расход) |
Процесс расчета в случае, если будет проводится непроведенный документ:
Товар |
Организация |
Резервы до проведения |
Изменения |
Сторно |
Данные документа |
Остатки |
Новые резервы |
Итог |
Товар1 |
Орг1 |
|
|
|
|
2 |
1 |
1 |
Товар1 |
Орг2 |
|
|
|
|
2 |
1 |
1 (расход) |
Как Вы можете увидеть, расчет в обоих случаях значительно упрощается.
Если Вы читали внимательно, Вы могли заметить, что если в первом рассмотренном примере не формировать таблицу «ВТСторноРезервов», результат не измениться.
И это действительно так, в том конкретном случае.
Но представьте теперь, что вы меняете количество списываемого товара с 3 на 2. В этом случае существующий резерв по документу должен быть удален или отсторнирован, так как в организации Орг1 будет достаточно товара для списания. Очистка регистров «ТоварыОрганизаций» И «РезервыТоваровОрганизаций» перед формированием будет некорректной, так как резервы могут быть привязаны к другому регистратору. Так что сторнирование уже существующего резерва в этом случае является обязательным.
Приоритеты при подборе видов запасов
Это достаточно важный момент, который часто всех интересует, особенно, если приходится перепроводить уже проведенный период с перезаполнением видов запасов. В этом случае всех интересует, будут ли подобраны те же виды запасов и те же номера ГТД, которые были при первом проведении.
Сразу хочу сказать, что здесь все не очень однозначно.
Алгоритм подбора реализован в запросе, в процедуре «ЗапросРаспределенияСУчетомПриоритетовТаблицыТоваровНаТаблицуОстатков»
Типовой подбор представляет из себя последовательную сортировку по следующим признакам:
1. Отбор по приоритету:
- Первыми подбираются остатки видами запасов и ГТД совпадающими с данными документа (табличная часть ВидыЗапасов),
- далее подбираются остатки организации, выбранной в документе,
- далее подбираются все остальные остатки
2. Отбор по заполненности ГТД. Первыми подбираются остатки с незаполненными номерами ГТД.
3. Отбор по дате поступления товара в организацию.
Это самое узкое место подбора вида запасов, которое, в большинстве случаев, приводит к изменению номеров ГТД при повторном проведении документов с перезаполнением видов запасов.
Дело в том, что механизм определения даты поступления товара в компанию реализован крайне примитивно. Существует независимый и непериодический регистр сведений «ДатыПоступленияТоваровОрганизаций» в котором фиксируются даты поступления товаров в разрезе аналитик: вид запасов, номенклатура, характеристика, серия, назначение и номер ГТД. Причем любой документ, выполняющий поступление товаров в организацию (Поступление товаров, перемещение, передача между организациями) перезаписывает в нем данные в разрезе указанных выше аналитик.
Заметьте, никакой истории не сохраняется!
Очевидно, что данные в этом регистре в разрезе одних и тех же аналитик могут меняться в течении месяца, что будет оказывать влияние на сортировку при подборе остатков при перепроведении задним числом.
4. Дальше выполняется сортировка по типу запасов, организации остатка товаров, владельцу товара (устаревший) и виду запасов. Все эти данные не меняются во времени.
Из всего вышесказанного можно сделать следующий вывод:
Наличие сортировки по дате поступления будет приводить к постоянным изменениям подбираемых остатков, особенно, если ведется учет по ГТД.
Поэтому, если вы планируете перепроводить документы с перезаполнением видов запасов и у вас ведется учет по ГТД, вам просто необходимо переделать этот механизм. В простейшим случае, можно вообще убрать сортировку по дате поступления товара. Также можно сделать отбор по номеру ГТД, чтобы подбирались в первую очередь ГТД с более ранней датой. Если же нужно все-таки сортировать остатки по сроку поступления их компанию, необходимо реализовывать более сложный механизм учета дат поступления товара в компанию.
Заключение
Изначально я хотел описать в одной статье и первый и второй этап расчета резервов. Но статья и так получилась достаточно объемной, по этому второй этап я рассмотрю в следующей раз.
Спасибо что дочитали до конца. Пишите в комментариях, если у Вас есть вопросы по данной теме или остались неясные моменты, постараемся вместе в них разобраться.
Другие мои статьи по теме Интеркампани и механизма расчета резервов
- Интеркампани, новая методика учета в ЕРП 2.4
- Новая концепция учета по видам запасов в ЕРП 2.4
- Исправления отрицательных остатков по организациям в УТ 11.4