Как построить график производства со сложными ограничениями в 1С:ERP?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

Стандартные механизмы построения графика производства в 1С:ERP Управление предприятием часто оказываются недостаточно гибкими для процессного производства, такого как фармацевтическая или химическая промышленность. В таких отраслях мы сталкиваемся с ограничениями, которые типовой функционал (дискретное производство) учитывает лишь частично: непрерывные циклы сушки (которые нельзя прерывать на выходные), режимы ожидания (подогрев в реакторе) и отсутствие возможности хранения полуфабрикатов вне трубопроводов. Разберем подробно, какие инструменты и библиотеки помогут решить задачу построения оптимального производственного расписания.

Анализ проблемы и постановка задачи

Проанализируем специфику ограничений, которые необходимо наложить на алгоритм планирования. В процессном производстве мы выделяем три критических типа рабочих центров (РЦ):

  1. РЦ с запретом прерывания: Если цикл сушки длится 48 часов, алгоритм должен планировать начало операции так, чтобы она завершилась до технологического перерыва (выходных) или захватывала его целиком, если оборудование работает в автоматическом режиме.
  2. РЦ с допустимым простоем: Например, упаковка. Здесь мы можем остановить процесс в пятницу вечером и продолжить с того же места в понедельник.
  3. РЦ с изменением состояния: Реактор, который после активной фазы может перейти в режим «хранения с подогревом». Это не работа, но и не освобождение ресурса.
  4. Синхронизация этапов (No-wait): Передача полуфабрикатов по трубопроводам требует, чтобы следующая стадия началась ровно в момент окончания предыдущей.

Для решения таких задач нахождения оптимума (минимума простоя и максимума загрузки) возможностей встроенного в 1С «Пооперационного планирования» (MES) часто не хватает. Рассмотрим три пути решения: использование внешних библиотек-солверов, интеграцию с APS-системами и собственную разработку на стороне 1С.

Метод 1: Использование внешних математических библиотек (C# / Python)

Самый мощный способ — вынести расчеты во внешнюю компоненту или микросервис. Рассмотрим библиотеку Google OR-Tools. Это бесплатный набор инструментов для оптимизации, который идеально подходит для задач типа Job Shop Scheduling.

Разберем, как реализовать связь с 1С:

Посмотрим на пример логики описания задачи на языке 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С массив дат начала и окончания каждой операции, которые мы записываем в регистр РасписаниеРабочихЦентров или обновляем даты в документах ЭтапПроизводства.

Метод 2: Интеграция с готовыми системами APS

Если бюджет позволяет, стоит рассмотреть готовые системы расширенного планирования (Advanced Planning and Scheduling). Для 1С существуют решения, которые уже имеют механизмы бесшовной интеграции:

Метод 3: Реализация алгоритма внутри 1С на базе конечных автоматов

Если необходимо остаться в рамках стека 1С без внешних компонент, проанализируем подход с использованием концепции конечных автоматов. Вместо попытки решить огромную систему линейных уравнений, мы создаем алгоритм «имитационного моделирования».

Разберем шаги реализации:

  1. Создаем таблицу состояний оборудования на каждый интервал времени (например, час).
  2. Размещаем этапы производства по приоритетам (сначала заказы с жестким сроком).
  3. Для каждого этапа проверяем «проходимость» через график. Если этап «сушка» попадает на субботу, алгоритм должен автоматически сдвинуть ДатаНачала назад (на четверг) или вперед (на понедельник), пока весь блок в 48 часов не поместится в «белое» поле графика.
  4. Для связи этапов «через трубу» используем жесткую фиксацию: ВремяНачалаЭтапа2 = ВремяОкончанияЭтапа1.

Проанализируем пример функции проверки доступности интервала:


Функция ПроверитьДоступностьИнтервала(РабочийЦентр, ДатаНачала, ДлительностьЧасов, Прерываемый)
    
    КонецПланирования = ДатаНачала + ДлительностьЧасов * 3600;
    
    // Получаем периоды недоступности из графиков работы
    Запрос = Новый Запрос("ВЫБРАТЬ Начало, Окончание ИЗ РегистрСведений.ГрафикиРаботы...");
    
    // Если процесс непрерывный (Прерываемый = Ложь)
    // Проверяем, нет ли внутри интервала [ДатаНачала, КонецПланирования] выходных
    Если Не Прерываемый Тогда
        Если ЕстьПересечениеСВыходными(РабочийЦентр, ДатаНачала, КонецПланирования) Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Истина;
КонецФункции

Теоретическая база и литература

Для глубокого понимания моделей планирования крайне полезно изучить классические труды. Выясним, какие источники помогут в разработке собственного алгоритма:

Вывод: Для фармацевтического производства в 1С:ERP наиболее жизнеспособным решением является разработка внешнего сервиса на C# с библиотекой Google OR-Tools или использование специализированного модуля APS. Типовой механизм 1С лучше использовать как источник данных и место хранения финального результата, делегировав сложную математику специализированным инструментам.

← На главную