Механизм прогнозирования отрицательных остатков по произвольному регистру


Подключаемый механизм, позволяющий прогнозировать возникновение отрицательных остатков по любому остаточному регистру в любой конфигурации на платформе 1С 8.2

Прогнозирование работает при любом изменении регистра — проведении/отмене проведения документа, изменении проведенного документа.

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

В составе:

  1. Справочник настроек контроля (итНастройкиПрогнозированияОтрицательныхОстатков);

  2. Регистр сведений для указания актуальной настройки контроля (итРегистрыДляПрогнозированияОтрицательныхОстатков);

  3. Общий модуль с двумя процедурами (эти процедуры можно включить в любой другой модуль, и подписку тоже свою использовать).

Как настраивать:

  1. В настройке контроля указывается регистр, перечисляются измерения и ресурсы, по которым контролировать (там флажки есть). Бантиков пока мало, имя регистра вписывается руками. Измерения и ресурсы можно заполнять.
    Флажки там не просто так:

    • — по ресурсам понятно — не все их нужно контролировать онлайн
    • — по измерениям — на всякий случай, при работе онлайн бывает, что не требуется полное закрытие в ноль. Например, для заказов поставщикам — измерение цена, можно закрыть потом, все разом.
  2. Там же, в настройке, после п. 2 надо нажать кнопку «Сформировать тексты запросов» — они там же и появятся, в форме. Их можно корректировать (пока).

  3. В регистре сведений нужно еще раз написать имя регистра, указать настройку и поставить флаг.

  4. Не включил в конфигурацию подписку на событие, чтобы к метаданным не привязываться. Подойдет любая подписка для регистра накопления, событие — перед записью. Нужно настроить, чтобы она смотрела на процедуру итПередЗаписьюРегистраПрогнозированиеОтрицательныхОстатковПередЗаписью из общего модуля. Само действие выделено в отдельную процедуру, чтобы замер производительности по процедуре делать.

По настройке — все. Контроль начинает действовать.

Как работает:

  1. Перед записью набора в регистр сравниваются его старый и новый вариант. Сравнение делается одним запросом, который сформировался в настройке контроля (см п.2 настройки, «Текст запроса уменьшения по ресурсам»);

  2. Если уменьшения нет, на этом все прекращается. Уменьшение — это когда уменьшается или распроводится приход, либо увеличивается расход.

  3. Если есть уменьшение, то идем дальше. Выполняется второй запрос, который использует временные таблицы первого запроса — осуществляется проверка остатков по регистраторам от даты документа до текущей даты.
    В текущем варианте проверяются как остатки до изменения, так и остатки после изменения, т.к. в результат попадут и отрицательные остатки, в которых мы не виноваты. Это сделано намеренно, задел на будущее. Можно убрать, удалив условие из запроса «Текст запроса выборки регистраторов» в настройке.

  4. На выходе получается таблица с регистраторами и всеми контролируемыми измерениями, а также с остатками до и после изменения. Сейчас пока все, это последняя строка процедуры.

Дальше уже начинаются вариации, как интерпретировать полученную информацию. Думаю добавить регистр с настройками по пользователям, кому можно кому нельзя создавать отрицательные остатки.

Также есть планы добавить функционал:

  1. Отбор, чтобы все подряд контролировать;

  2. Возможность задавать параметры действий в случае обнаружения отрицательных остатков. Хотя бы текст сообщения задать, или вопрос какой-то спросить.

  3. Сделать форму (или обработку), которая будет открываться толковому пользователю, чтобы он увидел всю цепочку и мог, например, на время отключить контроль остатков для себя и привести эту цепочку к требуемому виду.

Также есть мысль расширить поиск отрицательных остатков и на сам проводимый документ, т.е. вместо обычного в таких случаях запроса на наличие остатков делать один запрос текущее + прогнозируемое.

На всякий случай прикладываю cf, вдруг кому интресно. Платформа 8.2.13.219, тестировалось на УПП 1.3.12.1.

P.S. Проводил замер производительности: включил контроль по регистру ТоварыНаСкладах, перепровел складские документы за месяц — получилось 1.5 % времени уходило на весь контроль. Не знаю, много это или мало. Также буду признателен, если кто-нибудь разбирающийся в оптимальности запросов, глянет мои запросы и подскажет, где там есть неоптимальность.

10 Comments

  1. Magister

    Однозначно плюс за подробное описание и реализацию.

    Нужно попробовать внедрить себе 🙂

    Reply
  2. artbear

    Интересная идея, нужно обдумать плюсы и минусы.

    Reply
  3. hulio
    artbear пишет:

    плюсы и минусы

    Да простит меня автор, но минус могу сходу подсказать 🙂

    На примере 10-й торговли: проводим документ «Резервирование товаров», по логике автора уменьшения нет (ну правильно, мы ведь увеличили количество в резерве), а по логике программы — на свободном остатке может образоваться «минус» — если количество в резерве превысит количество на складе.

    Справедливости ради, стоит заметить, что в новых конфигурациях есть отдельный регистр — «Свободные остатки». ПО нему такой контроль вполне сработает 🙂

    Reply
  4. 1c-intelligence

    (3) hulio,

    Это скорее минус УТ 10.

    Есть также обходной вариант — если смотрели настройку прогнозирования, то там можно корректировать созданный программно запрос. В данном случае нужно усложнить запрос, скучковав все 4 регистра товаров, как это делается в УТ 10 (товары на складах минус в резерве минус к передаче плюс к получению).

    Что скажете?

    Reply
  5. pt_olga

    не уловила смысла этого творения, хоть и достаточно внушительного. Зачем заниматься прогнозом отрицательных остатков, если можно их просто не допускать?

    Reply
  6. 1c-intelligence

    (5) pt_olga, в этом и смысл — спрогнозировать возникновение отрицательных остатков и не допустить его. Согласитесь, чтобы не допустить, надо сначала спрогнозировать.

    Reply
  7. 1cspecialist

    (0) Идея не нова — в свое время она не раз поднималась в конференции разработчиков 1с (partners.v8.1c.ru). Автор молодец, что попытался ее реализовать. Но как обычно в жизни бывает — есть большое НО.

    Подскажите, как решается проблема с перепроведением например документа ПТиУ? Именно с «перепроведением», т.к. именно в этом случае предложенный способ контроля не сработает (для просто «проведения» или «отмены проведения» сработает), или убедите меня в обратном.

    Поясню.

    Не для кого не секрет, что в случае перезаписи набора записей регистра (например, в случае перепроведения документа) происходит не одна, а две итерации записи. Первая — очищает (удаляет) текущие записи (производится запись пустого набора), вторая записывает новый набор записей в регистр. Я посмотрел код этой разработки. В процедуре «ПередЗаписью» модуля набора записей регистра производится сравнение записываемого набора с текущими записями регистра. Тут-то и произойдет ошибка на первой итерации. Ведь записываемый набор записей придет пустой, что фактически для данного контроля будет означать, что уменьшили приход и соответственно могут быть отрицательные остатки в будущих расходных накладных.

    Reply
  8. pt_olga
    zaebunga пишет:

    (5) pt_olga, в этом и смысл — спрогнозировать возникновение отрицательных остатков и не допустить его. Согласитесь, чтобы не допустить, надо сначала спрогнозировать.

    если «прогноз» заменить на «проверку» возможности списания, то соглашусь.

    Дело в том,что специфика моей работы подразумевает постоянную работу по отгрузке дефицитных товаров,

    т.е. отделы продаж на перегонки резервируют появившийся на складе товар.

    Как таковой прогноз нам не нужен, тут к гадалке не ходи, что через час разметут.))

    Оперируем механизмами по недопущению вылета в минус.

    Reply
  9. ZLENKO

    (7) Вот именно что основная фишка этого метода в том чтобы он корректно работал при проведении, отмене проведения и перепроведении.

    Особенно учитывая то что в типовых конфигурациях при перепроведении регистры товарных остатков очищаются чтобы обеспечить корректность контроля остатков.

    А при применении этого метода штатный контроль остатка уже не нужен, т.е. и очистку существующих движений можно убрать. Таким образом достигается оптимизация записи регистров при перепроведении о которой 1С так много писали, но по факту она в типовых так и не реализована (точнее реализована но не используется). Но при убирании очистки появляются проблемы наличия движений у непроведенных документов (при неудачной попытке проведения и последующей просто записью).

    А плюс ко всему этому заказчик для некоторых документов захотел разрешить возникновение минусов и соответственно пришлось разрешить даже если минус есть но это приход и минус ним уменьшается, а если расход и минус увеличивается то запретить. Вот такая вот у меня эпопея с этим методом была.

    То что тут у автора к сожалению не смотрел — сейчас мне не актуально.

    Reply
  10. koladen

    Спасибо!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *