В процессе внедрения и эксплуатации подсистемы бюджетирования и планирования в 1С:ERP Управление предприятием (версий 2.4 и 2.5) пользователи часто сталкиваются с задачей построения чистого плана производства. Под "чистым" планом понимается производство только того объема продукции, который действительно необходим для покрытия фактического спроса за вычетом уже имеющихся складских остатков.
На первый взгляд, задача выглядит тривиально: достаточно из планового объема продаж или заказов клиентов вычесть свободные остатки на складах. Однако при попытке реализовать эту схему на практике через стандартный механизм заполнения планов по формулам аналитики и пользователи сталкиваются с неприятными техническими нюансами. В сформированных документах планирования начинают появляться отрицательные значения (минусы), либо система заполняет документ огромным количеством "нулевых" строк по всей номенклатуре предприятия. В этой статье мы подробно разберем, почему так происходит, и пошагово настроим систему для корректного расчета.
Проанализируем классическую формулу, которую пользователи пытаются прописать в правилах заполнения плана производства:
[ПланыПродаж] - [СвободныеОстатки]
Математически эта формула абсолютно верна, но логика СУБД при расчете в 1С:ERP работает иначе. Рассмотрим стандартную ситуацию на складе и в планах продаж:
10 - 4 = 6. Система предлагает произвести 6 штук. Это корректный результат.5 - 12 = -7. Нам не нужно ничего производить, но система записывает в документ планирования значение -7.0 - 50 = -50. В документ планирования попадает строка с количеством -50.Попытки пользователей обойти эту проблему с помощью логических условий в редакторе формул 1С, например, используя конструкцию ?([ПланыПродаж] <> 0, [ПланыПродаж] - [СвободныеОстатки], 0), часто приводят ко второй проблеме — "заполнению нулями по всему справочнику".
Это происходит из-за того, что система пытается рассчитать формулу для каждой номенклатурной позиции, у которой есть данные хотя бы по одному из операндов. Если у вас на складе лежит 5000 наименований товаров, по которым нет никаких планов продаж, система все равно рассчитает для них формулу и заполнит документ 5000 строк с нулевым значением. Работать с таким документом становится невозможно.
---
Для того чтобы система не записывала отрицательные числа в документ, нам нужно принудительно ограничить нижнюю границу расчета нулем. В редакторе формул 1С:ERP для этого предусмотрена стандартная математическая функция Макс(Параметр1, Параметр2), которая возвращает наибольшее из двух значений.
Перепишем нашу формулу следующим образом:
Макс([ПланыПродаж] - [СвободныеОстатки], 0)
Давайте посмотрим, как теперь система обработает наши тестовые ситуации:
5 - 12 = -7, затем сравнивает полученное число с нулем: Макс(-7, 0). Наибольшим является 0. В документ планирования запишется ровно 0.0 - 50 = -50, сравнивает с нулем: Макс(-50, 0). В документ планирования запишется 0.Логически эта схема работает безупречно и описывается следующим алгоритмом:
Если (ПланыПродаж - СвободныеОстатки) > 0 Тогда
Результат = ПланыПродаж - СвободныеОстатки;
Иначе
Результат = 0;
КонецЕсли;
---
Использование функции Макс() решило проблему с минусами, но в документе все еще могут оставаться лишние строки с нулевым количеством. Чтобы избавиться от них и не перегружать базу данных лишней информацией, нам необходимо правильно настроить Режим заполнения состава в правиле заполнения плана.
Выполним настройку по шагам:
Как это работает?
Когда установлен режим "Из плана", система сначала собирает только те позиции номенклатуры, которые физически присутствуют в исходном документе-источнике (в нашем случае — в документе "План продаж"). И только для этого ограниченного списка позиций система начинает рассчитывать формулу с вычитанием остатков. Номенклатура, по которой не планируется никаких продаж, даже не попадет в расчет, что полностью исключит появление пустых или нулевых строк.
Также хорошей практикой является использование Отборов непосредственно в источнике данных планирования. Мы можем установить системный отбор на операнд спроса: [ПланыПродаж] > 0. Это гарантированно отсечет неликвиды и остатки товаров, не участвующих в текущем цикле продаж.
---
Если ваша цель — построить производство строго по "фактической потребности", то использование "Плана продаж" в формуле может быть не совсем корректным. План продаж — это чаще всего прогнозная величина, формируемая отделом маркетинга. Фактическая же потребность предприятия выражается в конкретных, уже подписанных спецификациях и Заказах клиентов.
Мы можем настроить более точный расчет, заменив операнд [ПланыПродаж] на данные по заказам. Для этого выполним следующие действия:
Макс([ЗаказыКлиентов] - [СвободныеОстатки], 0)
Такой подход позволяет автоматизировать классическую схему "Производство под заказ" в рамках объемно-календарного планирования.
---
Рассмотрим ситуацию шире. Если ваше предприятие работает в режиме жесткого позаказного производства ("day-to-day"), то классические документы планирования (Планы продаж, Планы производства) могут оказаться избыточным бюрократическим барьером. В 1С:ERP реализован мощный альтернативный механизм — Обеспечение потребностей, который работает без формул планирования.
Проанализируем, как работает эта "тянующая" схема:
Заказ клиента. В строках спецификации для продукции устанавливается вариант обеспечения "Обеспечивать обособленно" или просто "К обеспечению".Заказ на производство ровно на недостающее количество продукции.Использование рабочего места "Формирование заказов по потребностям" позволяет полностью уйти от ручного написания сложных формул, исключает человеческий фактор при расчете остатков и позволяет производству гибко реагировать на ежедневные изменения в портфеле заказов компании.