В процессе работы с 1С:ERP Управление предприятием 2.4 (и более новыми версиями) часто возникает задача точной идентификации этапов производства, порожденных конкретной строкой заказа. Типовой сценарий: пользователь отменяет одну позицию в многострочном заказе, и системе необходимо автоматически найти и пометить на удаление (или скорректировать) соответствующие Этапы производства. Сложность заключается в том, что система может объединять («схлопывать») одинаковые позиции в один этап, а прямая ссылка на номер строки в документах часто отсутствует или не является надежной.
В этой статье мы подробно разберем, как реализована связь между распоряжением и исполнением, проанализируем технические нюансы и рассмотрим программные способы получения нужных данных.
Самый надежный способ связать строку заказа и этап — это использование механизма обособления. Разберем, как это работает. Если в заказе на производство для строки продукции включено обособленное обеспечение (например, под направление деятельности или конкретный заказ), система создает уникальный объект в справочнике Назначения.
Проанализируем преимущества этого подхода:
Продукция документа Заказ на производство для каждой строки фиксируется свое Назначение.Назначение транслируется в соответствующий реквизит документа Этап производства.Таким образом, для получения этапов по строке заказа нам достаточно выполнить запрос, где условием будет выступать пара Распоряжение (ссылка на заказ) и Назначение (взятое из конкретной строки заказа).
Если обособление не используется, нам придется обратиться к более глубоким техническим реквизитам. Рассмотрим структуру табличных частей. В современных версиях ERP для строк используется скрытый реквизит ИдентификаторСтроки (тип УникальныйИдентификатор). Также существует числовой КлючСвязи.
Проанализируем ситуацию, когда нам нужно программно найти связь:
В табличной части Продукция заказа на производство КлючСвязи позволяет сопоставить основную строку с данными в других табличных частях (например, если используются параметрические спецификации). При генерации этапов через Управление очередью заказов система анализирует эти ключи. Чтобы найти связь, мы можем заглянуть в служебные регистры.
Рассмотрим использование регистра накопления График производства. Именно в нем фиксируются потребности, созданные заказом, и их обеспечение конкретными этапами. Запрос к этому регистру по регистратору (Заказу) позволит увидеть, какие этапы были сформированы для закрытия потребности конкретной номенклатуры.
Важно понимать, что в 1С:ERP по умолчанию включена оптимизация производства. Рассмотрим настройки системы: в разделе НСИ и администрирование — Производство существуют опции, определяющие способ формирования этапов. Если система настроена на объединение одинаковых позиций, то одна строка этапа может обеспечивать сразу несколько строк заказа.
Выясним причину, почему это происходит: это делается для минимизации количества документов и оптимизации работы производственных цехов. Если в заказе есть две строки «Болт» по 50 штук, системе проще выпустить один этап на 100 штук.
В этом случае получить «чистую» связь «одна строка — один этап» невозможно. Нам придется анализировать общее количество:
Распоряжение равно нашему заказу, а Номенклатура и Характеристика совпадают с данными в строке.Этап производства есть реквизит Спецификация, который должен совпадать со спецификацией в строке заказа.Посмотрим на пример того, как может выглядеть запрос для получения этапов по конкретной номенклатуре из заказа, учитывая возможные дубли строк. Проанализируем следующий код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЭтапПроизводства.Ссылка КАК Этап,
| ЭтапПроизводства.Количество КАК КоличествоВЭтапе
|ИЗ
| Документ.ЭтапПроизводства КАК ЭтапПроизводства
|ГДЕ
| ЭтапПроизводства.Распоряжение = &Заказ
| И ЭтапПроизводства.Номенклатура = &Номенклатура
| И ЭтапПроизводства.Характеристика = &Характеристика
| И ЭтапПроизводства.Спецификация = &Спецификация
| И НЕ ЭтапПроизводства.ПометкаУдаления";
Запрос.УстановитьПараметр("Заказ", СсылкаНаЗаказ);
Запрос.УстановитьПараметр("Номенклатура", СтрокаЗаказа.Номенклатура);
Запрос.УстановитьПараметр("Характеристика", СтрокаЗаказа.Характеристика);
Запрос.УстановитьПараметр("Спецификация", СтрокаЗаказа.Спецификация);
Результат = Запрос.Выполнить();
Важный нюанс: если вы используете параметрические спецификации, то сравнение просто по ссылке на спецификацию может быть недостаточным, так как одна и та же спецификация может порождать разные наборы этапов в зависимости от параметров (свойств) заказа. В этом случае единственным верным ключом остается Назначение или ручная прокидка КлючаСвязи в дополнительные реквизиты этапа при его создании.
Разберем еще один продвинутый метод. В конфигурации ERP существуют общие модули, отвечающие за расчет графика и визуализацию дерева производства. Например, функции, вызываемые из формы Диспетчирование заказов.
Проанализируем процедуру ЗаполнитьДеревоЭтапов. Внутри она оперирует временными таблицами, в которых сопоставляются идентификаторы строк заказа и конкретные номера этапов. Если ваша задача — создать сложную обработку, мы рекомендуем изучить логику работы модуля УправлениеПроизводствомГрафикПроизводства. Там можно найти механизмы, которые 1С использует для построения иерархии «Заказ — Этап — Субэтап».
Если ваша цель — пометить этапы на удаление при установке признака Отменено в строке заказа, рекомендуем придерживаться следующего алгоритма:
Начато или Завершено. Если по этапу уже есть фактические затраты или выпуск, удалять его нельзя — потребуется ручная корректировка.График производства и Обеспечение заказов.Подводя итог, можно сказать, что прямой и простой связи «индекс строки — ссылка на этап» в типовой поставке 1С:ERP 2.4 без включенного обособления не существует. Однако, используя комбинацию Номенклатура + Характеристика + Спецификация + Назначение, можно с высокой точностью идентифицировать нужные документы и автоматизировать рутинные операции по управлению очередью производства.