Стандартные механизмы построения графика производства в 1С:ERP Управление предприятием часто оказываются недостаточно гибкими для процессного производства, такого как фармацевтическая или химическая промышленность. В таких отраслях мы сталкиваемся с ограничениями, которые типовой функционал (дискретное производство) учитывает лишь частично: непрерывные циклы сушки (которые нельзя прерывать на выходные), режимы ожидания (подогрев в реакторе) и отсутствие возможности хранения полуфабрикатов вне трубопроводов. Разберем подробно, какие инструменты и библиотеки помогут решить задачу построения оптимального производственного расписания.
Проанализируем специфику ограничений, которые необходимо наложить на алгоритм планирования. В процессном производстве мы выделяем три критических типа рабочих центров (РЦ):
Для решения таких задач нахождения оптимума (минимума простоя и максимума загрузки) возможностей встроенного в 1С «Пооперационного планирования» (MES) часто не хватает. Рассмотрим три пути решения: использование внешних библиотек-солверов, интеграцию с APS-системами и собственную разработку на стороне 1С.
Самый мощный способ — вынести расчеты во внешнюю компоненту или микросервис. Рассмотрим библиотеку Google OR-Tools. Это бесплатный набор инструментов для оптимизации, который идеально подходит для задач типа Job Shop Scheduling.
Разберем, как реализовать связь с 1С:
CP-SAT Solver.IntervalVar и накладываем ограничение: окончание задачи не может попадать на интервал «Выходные», если задача не является прерываемой.Посмотрим на пример логики описания задачи на языке C# (используя Google.OrTools.Sat):
// Создаем модель
CpModel model = new CpModel();
// Описываем задачу: начало, длительность, конец
IntVar start = model.NewIntVar(0, horizon, "start");
IntVar duration = model.NewConstant(48); // 48 часов сушки
IntVar end = model.NewIntVar(0, horizon, "end");
IntervalVar interval = model.NewIntervalVar(start, duration, end, "drying");
// Ограничение: процесс не должен прерываться
// Добавляем запрещенные интервалы (выходные)
foreach (var period in weekendIntervals) {
model.AddNoOverlap(new[] { interval, model.NewIntervalVar(period.Start, period.Duration, period.End, "weekend") });
}
После расчета сервис возвращает в 1С массив дат начала и окончания каждой операции, которые мы записываем в регистр РасписаниеРабочихЦентров или обновляем даты в документах ЭтапПроизводства.
Если бюджет позволяет, стоит рассмотреть готовые системы расширенного планирования (Advanced Planning and Scheduling). Для 1С существуют решения, которые уже имеют механизмы бесшовной интеграции:
Если необходимо остаться в рамках стека 1С без внешних компонент, проанализируем подход с использованием концепции конечных автоматов. Вместо попытки решить огромную систему линейных уравнений, мы создаем алгоритм «имитационного моделирования».
Разберем шаги реализации:
ДатаНачала назад (на четверг) или вперед (на понедельник), пока весь блок в 48 часов не поместится в «белое» поле графика.ВремяНачалаЭтапа2 = ВремяОкончанияЭтапа1.Проанализируем пример функции проверки доступности интервала:
Функция ПроверитьДоступностьИнтервала(РабочийЦентр, ДатаНачала, ДлительностьЧасов, Прерываемый)
КонецПланирования = ДатаНачала + ДлительностьЧасов * 3600;
// Получаем периоды недоступности из графиков работы
Запрос = Новый Запрос("ВЫБРАТЬ Начало, Окончание ИЗ РегистрСведений.ГрафикиРаботы...");
// Если процесс непрерывный (Прерываемый = Ложь)
// Проверяем, нет ли внутри интервала [ДатаНачала, КонецПланирования] выходных
Если Не Прерываемый Тогда
Если ЕстьПересечениеСВыходными(РабочийЦентр, ДатаНачала, КонецПланирования) Тогда
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Возврат Истина;
КонецФункции
Для глубокого понимания моделей планирования крайне полезно изучить классические труды. Выясним, какие источники помогут в разработке собственного алгоритма:
Вывод: Для фармацевтического производства в 1С:ERP наиболее жизнеспособным решением является разработка внешнего сервиса на C# с библиотекой Google OR-Tools или использование специализированного модуля APS. Типовой механизм 1С лучше использовать как источник данных и место хранения финального результата, делегировав сложную математику специализированным инструментам.