В мире современного производства, особенно когда речь идет об изготовлении изделий с высокой степенью кастомизации, таких как стеклянные изделия с различными характеристиками, одной из наиболее актуальных задач становится гибкое управление производственными этапами. Представим ситуацию: мы производим стеклянные изделия, начиная с листа стекла, который нарезается по размеру — здесь поможет обработка оптимизации раскроя листовых материалов в 1С. Далее, в зависимости от требований конкретного заказа, к изделию применяются различные операции — закаливание, наклейка пленки, сверление отверстий и так далее. Каждая такая операция представляет собой отдельный этап производства, который должен быть выполнен строго в определенной последовательности. Однако не все этапы нужны для каждого заказа.
Например, клиент может заказать стекло без фацетирования, сверления или полировки. В таком случае соответствующие этапы должны быть пропущены, а производство должно идти по скорректированному маршруту, например: Резка по размеру -> Фрезерование -> Обработка кромки -> Закалка. При этом необходимо, чтобы полуфабрикат, произведенный на предыдущем этапе, корректно передавался следующему за пропущенным этапом. Классический подход к формированию спецификаций в 1С:ERP подразумевает статичное описание всех этапов. Но при десятках возможных параметров и сотнях их комбинаций создание отдельных спецификаций для каждого варианта становится невыполнимой задачей.
В этом руководстве мы рассмотрим, как можно организовать динамический пропуск этапов производства в 1С:ERP Управление предприятием 2 (версия 2.5.17.74 и выше), используя как штатные механизмы системы, так и возможности для программных доработок. Наша цель — обеспечить, чтобы этапы, неактуальные для конкретного заказа, не создавались вовсе, а полуфабрикаты корректно передавались между оставшимися в производственной цепочке подразделениями.
Прежде чем перейти к решениям, давайте разберем основную сложность, которая возникает при попытке "пропустить" этап. Пропуск этапа — это не просто его отсутствие в списке. Каждый этап, как правило, потребляет какие-либо материалы или полуфабрикаты и выпускает свой полуфабрикат, который является входным для следующего этапа — для контроля этих процессов разработан отчет анализа себестоимости в многопередельном производстве. Если мы просто не создадим этап, то следующий за ним этап останется без входного полуфабриката, и производственная цепочка нарушится.
Проанализируем ситуацию на примере, который мы обсуждали на форуме:
Теперь представим, что заказчик не захотел опцию, которая производится на Этапе 2 (например, фацетирование), и этот этап нужно пропустить. В этом случае на Этап 3 должен попасть ПФ1 (выпущенный на Этапе 1), а не ПФ2. Программа должна автоматически "перенаправить" поток материалов. Именно это и является основной задачей, которую мы будем решать.
Начиная с версии 2.5.9, а затем доработанное в 2.5.15 и 2.5.19, в 1С:ERP появился механизм Динамического планирования. Это очень мощный инструмент, который кардинально меняет подход к планированию производства и предоставляет значительно большую гибкость по сравнению со "статической" структурой заказа.
Рассмотрим подробнее его преимущества:
Используя динамическое планирование, мы получаем "точки входа" для влияния на процесс формирования этапов. Мы можем настраивать алгоритмы, которые будут анализировать характеристики продукции или заказа клиента и принимать решение о необходимости создания того или иного этапа. Это может быть реализовано через механизмы параметризации спецификаций или с помощью программных доработок, которые будут вмешиваться в процесс формирования этапов, опираясь на данные из этих регистров сведений.
В 1С:ERP 2.5 предусмотрен стандартный механизм, который позволяет системе не формировать этапы производства для полуфабрикатов, если они уже есть на складе. Этот функционал может быть полезен в нашем сценарии, хотя и требует определенной адаптации.
Как это работает:
Для нашего сценария с пропуском этапов, этот механизм может быть использован следующим образом: Если этап 2 должен быть пропущен, то полуфабрикат, который должен был бы быть выпущен на этапе 2 (т.е. ПФ2), нам не нужен. Вместо этого, на этап 3 должен поступить ПФ1. Мы можем смоделировать ситуацию, при которой ПФ2 никогда не "появится" в качестве необходимого выпускаемого полуфабриката, а ПФ1 будет тем полуфабрикатом, который "есть на складе" (то есть был выпущен на предыдущем этапе и доступен).
Однако, этот метод не напрямую решает проблему "не создавать этап 2 и передать ПФ1 в этап 3", а скорее "не создавать этап Х, потому что его выходной ПФ уже есть". Чтобы использовать его для нашего случая, нам потребуется:
Система 1С:ERP поддерживает различные способы учета и перемещения полуфабрикатов, что обеспечивает значительную гибкость в их маршрутизации, особенно при необходимости пропуска этапов. Понимание этих механизмов критически важно, как и отчет для поиска ошибок в учете товаров на складах.
Разберем основные принципы:
ПередачаМатериаловВКладовую, позволяют управлять движением полуфабрикатов между производственными подразделениями. Это означает, что даже если полуфабрикат был выпущен на склад, его можно легко переместить в кладовую другого цеха. Автоматизировать такие движения поможет заполнение передачи материалов в производство по отрицательным остаткам.Как это помогает при пропуске этапов:
Если мы пропускаем Этап 2, который должен был потреблять ПФ1 и выпускать ПФ2, нам нужно обеспечить, чтобы ПФ1 попал непосредственно в Этап 3. Это можно сделать следующим образом:
ПередачаМатериаловВКладовую, который направит ПФ1 из кладовой Этапа 1 в кладовую Этапа 3, минуя кладовую Этапа 2.Таким образом, гибкие механизмы передачи полуфабрикатов позволяют нам логически и физически маршрутизировать материалы по скорректированной производственной цепочке, обходя ненужные этапы. Для этого нам необходимо, чтобы Этап 3 мог потреблять ПФ1 вместо ПФ2, что подводит нас к следующему решению.
Ресурсные спецификации являются сердцем производственного процесса в 1С:ERP, определяя состав и последовательность этапов. Хотя по умолчанию спецификации достаточно статичны, в 1С:ERP существуют возможности для их "параметризации". Это позволяет делать спецификации более гибкими и динамически адаптировать их под выбранные характеристики или опции изделия.
Что подразумевает параметризация:
В контексте нашей задачи, параметризация может быть использована для того, чтобы:
Хотя параметризация спецификаций сама по себе не гарантирует полного отсутствия этапа (она чаще влияет на его содержание), она является мощным инструментом для уменьшения количества отдельных спецификаций. В сочетании с динамическим планированием и программной постобработкой, она может значительно упростить задачу.
Если штатные средства 1С:ERP (даже с использованием динамического планирования и параметризации) не позволяют полностью и гибко решить задачу динамического пропуска этапов, наиболее универсальным и мощным решением становится программная постобработка уже созданных этапов производства. Этот подход был предложен одним из участников форума как рабочий вариант и является вполне приемлемым, особенно при высокой сложности и уникальности производственных процессов.
Принцип работы программной постобработки:
ЗаказНаПроизводство или по расписанию) запускается специальный программный алгоритм (обычно в виде регламентного задания или обработки).ЭтапПроизводства может быть помечен на удаление или непосредственно удален (с соблюдением всех зависимостей).Пример гипотетического алгоритма постобработки (псевдокод):
// Внешняя обработка или модуль регламентного задания
Процедура КорректироватьЭтапыПроизводства()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЭтапыПроизводства.Ссылка КАК Этап,
| ЭтапыПроизводства.ЗаказНаПроизводство КАК ЗаказНаПроизводство,
| ЗаказНаПроизводство.ХарактеристикаПродукции КАК ХарактеристикаПродукции
|ИЗ
| Документ.ЭтапПроизводства КАК ЭтапыПроизводства
|ЛЕВОЕ СОЕДИНЕНИЕ
| Документ.ЗаказНаПроизводство КАК ЗаказНаПроизводство
|ПО
| ЭтапыПроизводства.ЗаказНаПроизводство = ЗаказНаПроизводство.Ссылка
|ГДЕ
| НЕ ЭтапыПроизводства.Проведен
| ИЛИ НЕ ЭтапыПроизводства.ПометкаУдаления"; // Обрабатываем только несформированные/непроведенные или помеченные на удаление
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
Этап = РезультатЗапроса.Этап;
Характеристика = РезультатЗапроса.ХарактеристикаПродукции;
// Получаем значения доп. реквизитов характеристики
ПлощадьЗакаливания = Характеристика.ДополнительныеРеквизиты.Найти("ПлощадьЗакаливания").Значение;
НужноФацетирование = Характеристика.ДополнительныеРеквизиты.Найти("НужноФацетирование").Значение;
НужноСверление = Характеристика.ДополнительныеРеквизиты.Найти("НужноСверление").Значение;
// Определяем, какие этапы нужно пропустить
Если Этап.Наименование = "Закаливание" И ПлощадьЗакаливания = 0 Тогда
// Если закаливание не нужно, помечаем этап на удаление
ЭтапОбъект = Этап.ПолучитьОбъект();
ЭтапОбъект.ПометкаУдаления = Истина;
ЭтапОбъект.Записать();
Продолжить; // Переходим к следующему этапу
КонецЕсли;
Если Этап.Наименование = "Фацетирование" И НЕ НужноФацетирование Тогда
ЭтапОбъект = Этап.ПолучитьОбъект();
ЭтапОбъект.ПометкаУдаления = Истина;
ЭтапОбъект.Записать();
Продолжить;
КонецЕсли;
Если Этап.Наименование = "Сверление стекла" И НЕ НужноСверление Тогда
ЭтапОбъект = Этап.ПолучитьОбъект();
ЭтапОбъект.ПометкаУдаления = Истина;
ЭтапОбъект.Записать();
Продолжить;
КонецЕсли;
// ... и так далее для других опциональных этапов
КонецЦикла;
// После пометки на удаление, необходимо скорректировать связи между оставшимися этапами.
// Это самая сложная часть. Требует анализа последовательности этапов,
// изменения входных/выходных полуфабрикатов, и, возможно, их назначения.
// Например:
// 1. Получить все этапы по заказу, исключив помеченные на удаление.
// 2. Отсортировать их по порядку выполнения.
// 3. Для каждого этапа (кроме первого) проверить, какой ПФ он должен получить.
// 4. Если предыдущий этап был удален, найти его "пред-предыдущий" и взять его выходной ПФ.
// 5. Обновить данные в табличной части "Потребности" следующего этапа.
// Пример корректировки связей (упрощенно):
// Это крайне упрощенный пример, в реальной системе потребуется глубокий анализ
// структуры этапов, их связей по спецификациям и регистрам накопления.
// Целесообразно выделить эту логику в отдельную функцию.
ВсеЭтапы = ПолучитьЭтапыПоЗаказу(ЗаказНаПроизводство, Истина); // Исключая помеченные на удаление
Если ВсеЭтапы.Количество() > 1 Тогда
Для Индекс = 0 По ВсеЭтапы.Количество() - 2 Цикл
ТекущийЭтап = ВсеЭтапы[Индекс];
СледующийЭтап = ВсеЭтапы[Индекс + 1];
// Если СледующийЭтап изначально требовал ПФ от удаленного промежуточного этапа,
// но теперь ему нужен ПФ от ТекущийЭтап
Если СледующийЭтап.Материалы.Найти("ПФ_ОтУдаленногоЭтапа") И ТекущийЭтап.ВыпускаемаяПродукция.Найти("ПФ1") Тогда
СледующийЭтапОбъект = СледующийЭтап.ПолучитьОбъект();
// Корректируем табличную часть "Материалы" следующего этапа
// Например, заменяем одну строку на другую или изменяем ее
Для Каждого СтрокаМатериала Из СледующийЭтапОбъект.Материалы Цикл
Если СтрокаМатериала.Номенклатура = "ПФ_ОтУдаленногоЭтапа" Тогда
СтрокаМатериала.Номенклатура = "ПФ1"; // ПФ1 - выходной ПФ текущего этапа
// Дополнительные корректировки, если нужны
КонецЕсли;
КонецЦикла;
СледующийЭтапОбъект.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
// Вспомогательная функция (гипотетическая)
Функция ПолучитьЭтапыПоЗаказу(ЗаказНаПроизводство, ИсключаяУдаленные = Ложь)
// Возвращает список или массив документов ЭтапПроизводства для данного заказа
// С учетом флага ИсключаяУдаленные
КонецФункции
Важно отметить, что такой подход требует глубокого понимания структуры производственных данных в 1С:ERP, умения работать с документами ЭтапПроизводства, их табличными частями (Материалы, Продукция, Работы) и регистрами накопления, отражающими движения полуфабрикатов. Особенно сложно бывает корректно перенастроить связи, чтобы следующий этап "увидел" нужный полуфабрикат, произведенный на "пред-предыдущем" этапе.
Преимущества постобработки в связке с динамическим планированием:
Механизм динамического планирования упрощает такую доработку, так как этапы формируются "по требованию", что предоставляет больше точек для вмешательства в процесс их создания и последующей корректировки. Мы можем более тонко управлять логикой формирования и корректировки, опираясь на свежие данные и не затрагивая всю цепочку сразу.
Как уже было упомянуто, создание отдельных ресурсных спецификаций для каждого варианта изделия — это первый, наиболее очевидный, но часто неприемлемый путь. В нашем случае, когда речь идет о 30-40 различных параметрах стеклянных изделий, количество возможных комбинаций и, соответственно, спецификаций может быть огромным. Это приводит к:
Поэтому этот подход может быть рассмотрен только в случаях, когда количество вариаций продукта очень невелико, и каждый вариант имеет четко фиксированный набор операций, не подлежащих динамическому изменению со стороны клиента.
Задача динамического пропуска этапов производства в 1С:ERP Управление предприятием 2 является комплексной и требует внимательного подхода. Мы рассмотрели несколько решений, от использования штатных механизмов до программных доработок:
Выбор конкретного решения или их комбинации будет зависеть от специфики вашего производства, количества вариаций, уровня сложности логики пропуска этапов и готовности к программным доработкам. В большинстве сложных случаев, когда вариативность заказа очень высока, наиболее эффективным будет сочетание динамического планирования с тщательной параметризацией спецификаций и программной постобработкой, которая будет "доводить" сформированные этапы до идеального состояния, соответствующего требованиям клиента. Всегда рекомендуем тщательно анализировать функциональные возможности системы и по возможности использовать стандартные средства, прежде чем приступать к масштабным доработкам.