В реальной производственной практике и управлении проектами мы регулярно сталкиваемся со сложными задачами составления расписаний. Типичный сценарий: у нас есть технологическая цепочка операций, в которой строго задана последовательность (например, операцию Б нельзя начать до завершения операции А), и при этом существуют жесткие ресурсные ограничения. Одно из наиболее сложных ограничений формулируется так: некоторые виды работ категорически запрещено выполнять одновременно.
В теории расписаний и исследовании операций эта классическая проблема известна как RCPSP (Resource-Constrained Project Scheduling Problem — задача планирования работ с ограничениями на ресурсы). Несовместимость работ в этой модели описывается через использование так называемых дизъюнктивных (эксклюзивных) ресурсов единичной мощности. Если две работы не могут выполняться параллельно (например, из-за требований техники безопасности, ограниченного пространства или использования одного и того же уникального инструмента), под них выделяется виртуальный неделимый ресурс с емкостью, равной единице. Система планирования физически не сможет распределить этот ресурс на две задачи в один и тот же момент времени.
Давайте подробно разберем, какими штатными и архитектурными методами можно решить эту задачу в экосистеме 1С, как настроить систему и какие математические подходы лежат под капотом современных решений.
В типовом решении 1С:ERP Управление предприятием основной сущностью, задающей порядок выполнения работ и потребность в ресурсах, является Ресурсная спецификация. Именно здесь описывается технологический процесс, разбитый на этапы.
Проанализируем пошагово, как реализовать ограничения на последовательность и совместное выполнение этапов в 1С:ERP:
Если планирование в рамках ERP-системы на уровне этапов кажется слишком укрупненным, а технологический процесс требует детального пооперационного контроля (до минут и секунд), то правильным выбором будет использование специализированных программных продуктов класса MES, таких как 1С:MES Оперативное управление производством.
Выясним, как работает планирование несовместимых операций на уровне пооперационного расписания MES:
В отличие от ERP, которая оперирует общими объемами этапов, 1С:MES строит детальное расписание для каждой технологической операции с привязкой к конкретным единицам оборудования (рабочим центрам). Для решения задачи несовместимости здесь используются встроенные эвристические алгоритмы и методы математического программирования в ограничениях (Constraint Programming).
Рассмотрим ключевые настройки в 1С:MES для реализации нашей задачи:
При больших объемах данных (десятки тысяч операций в смену) встроенные алгоритмы 1С на встроенном языке могут выполнять расчет расписания достаточно долго. В современной практике автоматизации производственных гигантов применяется гибридный подход: 1С выступает транзакционной системой и хранилищем нормативно-справочной информации, а расчет оптимального расписания передается во внешние математические библиотеки (солверы), такие как Google OR-Tools, Gurobi или OptaPlanner.
Давайте проанализируем, как можно организовать выгрузку данных из 1С во внешний оптимизатор на языке Python через API. Нам необходимо передать список работ, их длительность, связи предшествования и признак несовместимости (общий виртуальный ресурс).
Посмотрим на пример кода на встроенном языке 1С, который формирует JSON-пакет данных для передачи во внешний оптимизатор:
// Функция формирует структуру данных для передачи во внешний математический движок
Функция СформироватьМодельДляРасчетаРасписания(ДокументЗаказ) Экспорт
МодельДанных = Новый Структура;
МассивРабот = Новый Массив;
// Выбираем технологические операции по заказу
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТехнологическиеОперации.Ссылка КАК Ссылка,
| ТехнологическиеОперации.Длительность КАК Длительность,
| ТехнологическиеОперации.Предок КАК Предок,
| ТехнологическиеОперации.ГруппаНесовместимости КАК ГруппаНесовместимости
|ИЗ
| Справочник.ТехнологическиеОперации КАК ТехнологическиеОперации
|ГДЕ
| ТехнологическиеОперации.Владелец = &Заказ";
Запрос.УстановитьПараметр("Заказ", ДокументЗаказ);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
СтруктураРаботы = Новый Структура;
СтруктураРаботы.Вставить("id", Строка(Выборка.Ссылка.УникальныйИдентификатор()));
СтруктураРаботы.Вставить("duration", Выборка.Длительность); // Время в минутах
// Указываем технологическую связь (какая работа должна завершиться ранее)
Если ЗначениеЗаполнено(Выборка.Предок) Тогда
СтруктураРаботы.Вставить("predecessor", Строка(Выборка.Предок.УникальныйИдентификатор()));
Иначе
СтруктураРаботы.Вставить("predecessor", Null);
КонецЕсли;
// Указываем виртуальный ресурс для моделирования несовместимости
// Если у двух работ совпадает группа несовместимости, они не могут идти одновременно
Если ЗначениеЗаполнено(Выборка.ГруппаНесовместимости) Тогда
СтруктураРаботы.Вставить("exclusive_resource", Строка(Выборка.ГруппаНесовместимости.УникальныйИдентификатор()));
Иначе
СтруктураРаботы.Вставить("exclusive_resource", Null);
КонецЕсли;
МассивРабот.Добавить(СтруктураРаботы);
КонецЦикла;
МодельДанных.Вставить("jobs", МассивРабот);
// Сериализуем данные в формат JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МодельДанных);
СтрокаJSON = ЗаписьJSON.Закрыть();
Возврат СтрокаJSON;
КонецФункции
Полученный JSON-пакет отправляется по HTTP во внешний скрипт, где с помощью библиотеки Google OR-Tools (модуль cp_model) решается задача интервального планирования. Внешний скрипт использует функцию непересечения интервалов AddNoOverlap для всех задач, у которых совпадает параметр exclusive_resource. После расчета расписания готовые даты начала и окончания операций загружаются обратно в 1С.
Если точное планирование до секунды на предприятии невозможно из-за высокой изменчивости среды (частые поломки, перебои со снабжением, человеческий фактор), то детальный математический расчет может оказаться неэффективным. В таких случаях мы рекомендуем рассмотреть методологию Барабан-Буфер-Веревка (Drum-Buffer-Rope), которая базируется на Теории ограничений систем (TOC).
Рассмотрим, как организовать данный подход в 1С:ERP:
Данный подход значительно упрощает математическую модель планирования в 1С:ERP, убирает необходимость сложного пооперационного пересчета при малейшем сдвиге и гарантирует высокую надежность выполнения заказов в срок.
Таким образом, выбор инструмента зависит от масштаба вашего предприятия и требуемой точности. Для простых задач вполне достаточно штатных спецификаций и видов рабочих центров в 1С:ERP. Для сложных производств с высокой плотностью операций идеальным выбором станет 1С:MES или интеграция со специализированными математическими солверами.