1С запилили в УНФ отличную штуку - ресурсы предприятия. Но как обычно продумали не до конца)) С одной стороны там можно указывать оборудование, с другой стороны сотрудников и бригады, но вот как привязать это к заказам на производство и посчитать сколько реально займет времени на изготовление продуктов и какое оборудование/бригады будут заняты, как построить расписание - не продумано.
Давайте сделаем первый шаг в этом направлении - предположим, что каждая операция выполняется на определенном оборудовании. Тогда в спецификации в табличной части операций надо просто добавить ещё одну колонку - ключевой ресурс.
Как пользоваться расширением:
Пусть реквизит "мощность" в справочнике ключевых ресурсов - это количество параллельно выполняемых операций, как если у вас стоит несколько одинаковых единиц оборудования.
1.) Включаем возможность планировать наши ресурсы.
2) заводим нашу номенклатуру
"Чайный лист" будет сырьем, а "чайный лист нарезанный" производимым нами полуфабрикатом.
3) теперь подключаем расширение и заводим спецификацию
На вкладке состава у нас все как обычно. 1 кг на входе - 1 кг продукта на выходе.
А вот на вкладке операций у меня появляется ресурс предприятия. Я буду считать, что за 1 час я могу нарезать 20 кг чая.
Мощность моему оборудованию я указала равную 2. У меня 2 таких машины на производстве.
переходим в заказ на производстве
На вкладке продукции добавляем "Чайный лист нарезанный", переходим на вкладку "Операции" и нажимаем "Заполнить по спецификации".
Заказ на производство автоматически считает, что на операцию уйдет 100(кг)/20(кг/ч)=5 часов
Но т.к. мощность оборудования равна двум то операция будет выполнена в два раза быстрее и два единицы оборудования смогут обработать сырье за 2 часа 30 минут.
После проведения заказа на производство видим в планировщике ресурсов наше оборудование и часы когда оно занято:
А теперь что для этого было сделано программно:
Во-первых в расширении действительно добавлена колонка в спецификацию и выведена на форму
Во - вторых я вытащила в расширение функцию "ЗаполнитьОперацииПоСпецификации" из модуля объекта Документ.ЗаказНаПроизводство и прописала в ней получение информации по длительности работы оборудования
Код как это сделать
&Вместо("ЗаполнитьОперацииПоСпецификации")
Процедура Расш1_ЗаполнитьОперацииПоСпецификации()
Операции.Очистить();
Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьТехоперации") Тогда
Возврат;
КонецЕсли;
ПроизводствоСервер.ЗаполнитьКлючиСвязи(Продукция);
Операции.Очистить();
//infostart //Mogilnikova
РесурсыПредприятия.Очистить();
//\\ infostart
Если ПоложениеИсполнителя=Перечисления.ПоложениеРеквизитаНаФорме.ВТабличнойЧасти Тогда
СоставБригады.Очистить();
КонецЕсли;
ТаблицаПродукция = Продукция.Выгрузить();
ИспользоватьРезервирование = Константы.ФункциональнаяОпцияРезервированиеЗапасов.Получить();
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Запасы", ТаблицаПродукция.Скопировать(, "НомерСтроки, Номенклатура, Спецификация"));
Запрос.Текст =
"ВЫБРАТЬ
ТабличнаяЧасть.НомерСтроки КАК НомерСтроки,
ТабличнаяЧасть.Спецификация КАК Спецификация,
ТабличнаяЧасть.Спецификация КАК ВложеннаяСпецификация,
ИСТИНА КАК ЭтоУзел,
ТабличнаяЧасть.Номенклатура КАК Операция,
//infostart //Mogilnikova
//
1 КАК НормаВремени
1 КАК НормаВремени,
ЗНАЧЕНИЕ(Справочник.Ключевыересурсы.ПустаяСсылка) как РесурсПредприятия,
1 как ДлительностьРаботы
//\\ infostart
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
&Запасы КАК ТабличнаяЧасть
ГДЕ
ТабличнаяЧасть.Спецификация <> ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
0 КАК Уровень,
МИНИМУМ(ВременнаяТаблица.НомерСтроки) КАК Порядок,
0 КАК НомерСтроки,
ЗНАЧЕНИЕ(Справочник.ЭтапыПроизводства.ПустаяСсылка) КАК Этап,
ВременнаяТаблица.Спецификация КАК Спецификация,
ВременнаяТаблица.ВложеннаяСпецификация КАК ВложеннаяСпецификация,
ВременнаяТаблица.ЭтоУзел КАК ЭтоУзел,
ВременнаяТаблица.Операция КАК Операция,
//infostart //Mogilnikova
//
ВременнаяТаблица.НормаВремени КАК НормаВремени
ВременнаяТаблица.НормаВремени КАК НормаВремени,
ВременнаяТаблица.РесурсПредприятия как РесурсПредприятия,
ВременнаяТаблица.ДлительностьРаботы как ДлительностьРаботы
//\\ infostart
ПОМЕСТИТЬ ТаблицаОпераций
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
СГРУППИРОВАТЬ ПО
ВременнаяТаблица.Спецификация,
ВременнаяТаблица.Операция,
ВременнаяТаблица.ВложеннаяСпецификация,
ВременнаяТаблица.ЭтоУзел,
//infostart //Mogilnikova
//
ВременнаяТаблица.НормаВремени
ВременнаяТаблица.НормаВремени,
ВременнаяТаблица.РесурсПредприятия,
ВременнаяТаблица.ДлительностьРаботы
//\\ infostart
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ВременнаяТаблица";
Запрос.Выполнить();
ПроизводствоСервер.РазузловатьОперации(Запрос, Неопределено, "Продукция");
Запрос.УстановитьПараметр("Продукция", ТаблицаПродукция);
Запрос.УстановитьПараметр("ВидОперации", ВидОперации);
Запрос.УстановитьПараметр("ТипСтруктурнойЕдиницы", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтруктурнаяЕдиница, "ТипСтруктурнойЕдиницы"));
Запрос.Текст =
"ВЫБРАТЬ
Продукция.НомерСтроки КАК НомерСтроки,
Продукция.КлючСвязи КАК КлючСвязиПродукция,
Продукция.ЗаказПокупателя КАК ЗаказПокупателя,
ВЫРАЗИТЬ(Продукция.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
Продукция.Спецификация КАК Спецификация,
Продукция.Количество КАК Количество,
Продукция.ЕдиницаИзмерения КАК ЕдиницаИзмерения
ПОМЕСТИТЬ Продукция
ИЗ
&Продукция КАК Продукция
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Продукция.ЗаказПокупателя КАК ЗаказПокупателя,
Продукция.НомерСтроки КАК НомерСтроки,
Продукция.КлючСвязиПродукция КАК КлючСвязиПродукция,
Продукция.Количество КАК Количество,
ВЫБОР
КОГДА НЕ ФункциональнаяОпцияИспользоватьЭтапыПроизводства.Значение
ИЛИ &ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийЗаказНаПроизводство.Разборка)
ИЛИ &ТипСтруктурнойЕдиницы <> ЗНАЧЕНИЕ(Перечисление.ТипыСтруктурныхЕдиниц.Подразделение)
ТОГДА ЗНАЧЕНИЕ(Справочник.ЭтапыПроизводства.ПустаяСсылка)
ИНАЧЕ ТаблицаОпераций.Этап
КОНЕЦ КАК Этап,
ТаблицаОпераций.Операция КАК Операция,
ВЫБОР
КОГДА ТаблицаОпераций.Операция ССЫЛКА Справочник.Номенклатура
ТОГДА ТаблицаОпераций.Операция.ЕдиницаИзмерения
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.КлассификаторЕдиницИзмерения.ПустаяСсылка)
КОНЕЦ КАК ЕдиницаИзмерения,
ВЫБОР
КОГДА ТаблицаОпераций.Операция ССЫЛКА Справочник.Номенклатура
ТОГДА ТаблицаОпераций.Операция.ФиксированнаяСтоимость
ИНАЧЕ ИСТИНА
КОНЕЦ КАК ФиксированнаяСтоимость,
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Продукция.ЕдиницаИзмерения) = ТИП(Справочник.КлассификаторЕдиницИзмерения)
ТОГДА 1
ИНАЧЕ ВЫРАЗИТЬ(Продукция.ЕдиницаИзмерения КАК Справочник.ЕдиницыИзмерения).Коэффициент
КОНЕЦ КАК Коэффициент,
ЕСТЬNULL(ТаблицаОпераций.НормаВремени, 0) * ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Продукция.ЕдиницаИзмерения) = ТИП(Справочник.ЕдиницыИзмерения)
И Продукция.ЕдиницаИзмерения <> ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)
ТОГДА ВЫРАЗИТЬ(Продукция.ЕдиницаИзмерения КАК Справочник.ЕдиницыИзмерения).Коэффициент
ИНАЧЕ 1
КОНЕЦ КАК НормаВремени,
ТаблицаОпераций.Уровень КАК Уровень,
ТаблицаОпераций.Порядок КАК Порядок,
//infostart //Mogilnikova
//
ТаблицаОпераций.НомерСтроки КАК НомерСтрокиОперации
ТаблицаОпераций.НомерСтроки КАК НомерСтрокиОперации,
ТаблицаОпераций.РесурсПредприятия КАК РесурсПредприятия,
ЕСТЬNULL(ТаблицаОпераций.ДлительностьРаботы, 0) * ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(Продукция.ЕдиницаИзмерения) = ТИП(Справочник.ЕдиницыИзмерения)
И Продукция.ЕдиницаИзмерения <> ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка)
ТОГДА ВЫРАЗИТЬ(Продукция.ЕдиницаИзмерения КАК Справочник.ЕдиницыИзмерения).Коэффициент
ИНАЧЕ 1
КОНЕЦ * ВЫБОР
КОГДА ТаблицаОпераций.РесурсПредприятия = ЗНАЧЕНИЕ(Справочник.Ключевыересурсы.ПустаяСсылка)
ТОГДА 0
ИНАЧЕ 1
КОНЕЦ * 3600 КАК ДлительностьРаботы
//\\ infostart
ПОМЕСТИТЬ Операции
ИЗ
Продукция КАК Продукция
ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаОпераций КАК ТаблицаОпераций
ПО Продукция.Спецификация = ТаблицаОпераций.Спецификация,
Константа.ФункциональнаяОпцияИспользоватьЭтапыПроизводства КАК ФункциональнаяОпцияИспользоватьЭтапыПроизводства
ГДЕ
Продукция.Номенклатура.ТипНоменклатуры В (ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Запас), ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа))
И НЕ ТаблицаОпераций.Операция ЕСТЬ NULL
И ТаблицаОпераций.Операция <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Операции.ЗаказПокупателя КАК ЗаказПокупателя,
Операции.НомерСтроки КАК НомерСтроки,
Операции.КлючСвязиПродукция КАК КлючСвязиПродукция,
Операции.Количество КАК КоличествоПлан,
Операции.Этап КАК Этап,
Операции.Операция КАК Операция,
Операции.ФиксированнаяСтоимость КАК ФиксированнаяСтоимость,
Операции.Коэффициент КАК Коэффициент,
Операции.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
//infostart //Mogilnikova
//
Операции.НормаВремени КАК НормаВремени
Операции.НормаВремени КАК НормаВремени,
Операции.РесурсПредприятия КАК РесурсПредприятия,
Операции.ДлительностьРаботы КАК ДлительностьРаботы
//\\ infostart
ИЗ
Операции КАК Операции
УПОРЯДОЧИТЬ ПО
Операции.НомерСтроки,
Операции.Уровень,
Операции.Порядок,
Операции.НомерСтрокиОперации";
Выборка = Запрос.Выполнить().Выбрать();
КлючСвязи = 0;
Пока Выборка.Следующий() Цикл
НоваяСтрока = Операции.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
Если НЕ ИспользоватьРезервирование Тогда
НоваяСтрока.ЗаказПокупателя = Документы.ЗаказПокупателя.ПустаяСсылка();
КонецЕсли;
Если НЕ ПоложениеИсполнителя=Перечисления.ПоложениеРеквизитаНаФорме.ВТабличнойЧасти Тогда
НоваяСтрока.Исполнитель = Исполнитель;
КонецЕсли;
Если ПоложениеСтруктурнойЕдиницыОпераций=Перечисления.ПоложениеРеквизитаНаФорме.ВТабличнойЧасти Тогда
НоваяСтрока.СтруктурнаяЕдиница = Справочники.СтруктурныеЕдиницы.ОсновноеПодразделение;
Иначе
НоваяСтрока.СтруктурнаяЕдиница = СтруктурнаяЕдиницаОпераций;
КонецЕсли;
НоваяСтрока.Нормочасы = НоваяСтрока.НормаВремени * НоваяСтрока.КоличествоПлан;
КлючСвязи = КлючСвязи + 1;
НоваяСтрока.КлючСвязи = КлючСвязи;
//infostart //Mogilnikova
Если ЗначениеЗаполнено(Выборка.РесурсПредприятия) тогда
СтрокаРесурсов = РесурсыПредприятия.Добавить();
СтрокаРесурсов.РесурсПредприятия = Выборка.РесурсПредприятия;
СтрокаРесурсов.Мощность = Выборка.РесурсПредприятия.Мощность;
СтрокаРесурсов.Длительность = окр(Выборка.ДлительностьРаботы * НоваяСтрока.КоличествоПлан/СтрокаРесурсов.Мощность,0,РежимОкругления.Окр15как20);
СтрокаРесурсов.Старт = Старт;
СтрокаРесурсов.Финиш = Старт+окр(Выборка.ДлительностьРаботы * НоваяСтрока.КоличествоПлан/СтрокаРесурсов.Мощность,0,РежимОкругления.Окр15как20);
КонецЕсли;
//\\ infostart
КонецЦикла;
КонецПроцедуры
Ну и в - третьих мне потребовалось аналогично вытащить и отредактировать процедуру "РазузловатьОперации" из общего модуля "ПроизводствоСервер"
&Вместо("РазузловатьОперации")
Процедура Расш1_РазузловатьОперации(Запрос, ДокументыРазузлования, ИмяТЧ, УровеньВложенности)
Если Запрос.МенеджерВременныхТаблиц=Неопределено Тогда
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
КонецЕсли;
Если ТипЗнч(ДокументыРазузлования)=Тип("Массив") Тогда
МассивДокументов = ДокументыРазузлования;
Иначе
МассивДокументов = Новый Массив;
Если ЗначениеЗаполнено(ДокументыРазузлования) Тогда
МассивДокументов.Добавить(ДокументыРазузлования);
КонецЕсли;
КонецЕсли;
// Выборка спецификаций из ТЧ документа
Если Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ТаблицаОпераций")=Неопределено Тогда
Если МассивДокументов.Количество()=0 ИЛИ ПустаяСтрока(ИмяТЧ) Тогда
Возврат;
КонецЕсли;
ПервыйДокумент = МассивДокументов[0];
Запрос.УстановитьПараметр("МассивДокументов", МассивДокументов);
Если ПервыйДокумент.Метаданные()=Метаданные.Документы.ЗаказПокупателя И ИмяТЧ="Запасы" И Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ВТЗаказПокупателяЗапасы")<>Неопределено Тогда
Запрос.Текст =
"ВЫБРАТЬ
0 КАК Уровень,
МИНИМУМ(ТабличнаяЧасть.НомерСтроки) КАК Порядок,
0 КАК НомерСтроки,
ЗНАЧЕНИЕ(Справочник.ЭтапыПроизводства.ПустаяСсылка) КАК Этап,
ТабличнаяЧасть.Спецификация КАК Спецификация,
ТабличнаяЧасть.Спецификация КАК ВложеннаяСпецификация,
ИСТИНА КАК ЭтоУзел,
ТабличнаяЧасть.Номенклатура КАК Операция,
//infostart //Mogilnikova
//
1 КАК НормаВремени
1 КАК НормаВремени,
ЗНАЧЕНИЕ(Справочник.Ключевыересурсы.ПустаяСсылка) КАК РесурсПредприятия,
1 КАК ДлительностьРаботы
//\\ infostart
ПОМЕСТИТЬ ТаблицаОпераций
ИЗ
ВТЗаказПокупателяЗапасы КАК ТабличнаяЧасть
ГДЕ
ТабличнаяЧасть.Спецификация <> ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
ТабличнаяЧасть.Номенклатура,
ТабличнаяЧасть.Спецификация";
Иначе
Запрос.Текст =
"ВЫБРАТЬ
0 КАК Уровень,
МИНИМУМ(ТабличнаяЧасть.НомерСтроки) КАК Порядок,
0 КАК НомерСтроки,
ЗНАЧЕНИЕ(Справочник.ЭтапыПроизводства.ПустаяСсылка) КАК Этап,
ТабличнаяЧасть.Спецификация КАК Спецификация,
ТабличнаяЧасть.Спецификация КАК ВложеннаяСпецификация,
ИСТИНА КАК ЭтоУзел,
ТабличнаяЧасть.Номенклатура КАК Операция,
//infostart //Mogilnikova
//
1 КАК НормаВремени
1 КАК НормаВремени,
ЗНАЧЕНИЕ(Справочник.Ключевыересурсы.ПустаяСсылка) КАК РесурсПредприятия,
1 КАК ДлительностьРаботы
//\\ infostart
ПОМЕСТИТЬ ТаблицаОпераций
ИЗ
Документ.ЗаказПокупателя.Запасы КАК ТабличнаяЧасть
ГДЕ
ТабличнаяЧасть.Ссылка В(&МассивДокументов)
И ТабличнаяЧасть.Спецификация <> ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
ТабличнаяЧасть.Спецификация,
ТабличнаяЧасть.Номенклатура";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ЗаказПокупателя.Запасы", ПервыйДокумент.Метаданные().Имя+"."+ИмяТЧ);
КонецЕсли;
Запрос.Выполнить();
КонецЕсли;
Запрос.УстановитьПараметр("УровеньВложенности", УровеньВложенности);
Запрос.УстановитьПараметр("ИспользоватьЭтапыПроизводства", ПолучитьФункциональнуюОпцию("ИспользоватьЭтапыПроизводства"));
Запрос.Текст =
"ВЫБРАТЬ
ТаблицаОпераций.Уровень КАК Уровень,
ТаблицаОпераций.Порядок КАК Порядок,
ТаблицаОпераций.НомерСтроки КАК НомерСтроки,
ТаблицаОпераций.Этап КАК Этап,
ТаблицаОпераций.Спецификация КАК Спецификация,
ТаблицаОпераций.ВложеннаяСпецификация КАК ВложеннаяСпецификация,
ТаблицаОпераций.ЭтоУзел КАК ЭтоУзел,
ТаблицаОпераций.Операция КАК Операция,
//infostart //Mogilnikova
//
ТаблицаОпераций.НормаВремени КАК НормаВремени
ТаблицаОпераций.НормаВремени КАК НормаВремени,
ТаблицаОпераций.РесурсПредприятия как РесурсПредприятия,
ТаблицаОпераций.ДлительностьРаботы как ДлительностьРаботы
//\\ infostart
ПОМЕСТИТЬ ВремТаблицаОпераций
ИЗ
ТаблицаОпераций КАК ТаблицаОпераций
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ТаблицаОпераций
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаОпераций.Уровень КАК Уровень,
ТаблицаОпераций.Порядок КАК Порядок,
ТаблицаОпераций.НомерСтроки КАК НомерСтроки,
ТаблицаОпераций.Этап КАК Этап,
ТаблицаОпераций.Спецификация КАК Спецификация,
ТаблицаОпераций.ВложеннаяСпецификация КАК ВложеннаяСпецификация,
ТаблицаОпераций.ЭтоУзел КАК ЭтоУзел,
ТаблицаОпераций.Операция КАК Операция,
СУММА(ТаблицаОпераций.НормаВремени) КАК НормаВремени,
//infostart //Mogilnikova
//
НЕОПРЕДЕЛЕНО КАК Исполнитель
НЕОПРЕДЕЛЕНО КАК Исполнитель,
ТаблицаОпераций.РесурсПредприятия как РесурсПредприятия,
СУММА(ТаблицаОпераций.ДлительностьРаботы) как ДлительностьРаботы
//\\ infostart
ПОМЕСТИТЬ ТаблицаОпераций
ИЗ
(ВЫБРАТЬ
ТаблицаОпераций.Уровень КАК Уровень,
ТаблицаОпераций.Порядок КАК Порядок,
0 КАК НомерСтроки,
ТаблицаОпераций.Этап КАК Этап,
ТаблицаОпераций.Спецификация КАК Спецификация,
НЕОПРЕДЕЛЕНО КАК ВложеннаяСпецификация,
ЛОЖЬ КАК ЭтоУзел,
ТаблицаОпераций.Операция КАК Операция,
//infostart //Mogilnikova
//
ТаблицаОпераций.НормаВремени КАК НормаВремени
ТаблицаОпераций.НормаВремени КАК НормаВремени,
ТаблицаОпераций.РесурсПредприятия как РесурсПредприятия,
ТаблицаОпераций.ДлительностьРаботы как ДлительностьРаботы
//\\ infostart
ИЗ
ВремТаблицаОпераций КАК ТаблицаОпераций
ГДЕ
НЕ ТаблицаОпераций.ЭтоУзел
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТаблицаОпераций.Уровень,
ТаблицаОпераций.Порядок,
ВЫБОР
КОГДА ТаблицаОпераций.НомерСтроки = 0
ТОГДА СпецификацииОперации.НомерСтроки
ИНАЧЕ ТаблицаОпераций.НомерСтроки
КОНЕЦ,
ВЫБОР
КОГДА НЕ &ИспользоватьЭтапыПроизводства
ТОГДА ЗНАЧЕНИЕ(Справочник.ЭтапыПроизводства.ПустаяСсылка)
КОГДА ТаблицаОпераций.Этап = ЗНАЧЕНИЕ(Справочник.ЭтапыПроизводства.ПустаяСсылка)
ТОГДА СпецификацииОперации.Этап
ИНАЧЕ ТаблицаОпераций.Этап
КОНЕЦ,
ТаблицаОпераций.Спецификация,
НЕОПРЕДЕЛЕНО,
ЛОЖЬ,
ЕСТЬNULL(СпецификацииОперации.Операция, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)),
ТаблицаОпераций.НормаВремени * ВЫБОР
КОГДА СпецификацииОперации.НормаВремени ЕСТЬ NULL
ТОГДА 1
ИНАЧЕ ВЫБОР
КОГДА СпецификацииОперации.КоличествоПродукции = 0
ТОГДА 0
ИНАЧЕ СпецификацииОперации.НормаВремени / СпецификацииОперации.КоличествоПродукции
КОНЕЦ
//infostart //Mogilnikova
//
КОНЕЦ
КОНЕЦ,
ЕСТЬNULL(СпецификацииОперации.РесурсПредприятия, ЗНАЧЕНИЕ(Справочник.Ключевыересурсы.ПустаяСсылка)),
ТаблицаОпераций.НормаВремени * ВЫБОР
КОГДА СпецификацииОперации.НормаВремени ЕСТЬ NULL
ТОГДА 1
ИНАЧЕ ВЫБОР
КОГДА СпецификацииОперации.КоличествоПродукции = 0
ТОГДА 0
ИНАЧЕ СпецификацииОперации.НормаВремени / СпецификацииОперации.КоличествоПродукции
КОНЕЦ
КОНЕЦ
//\\ infostart
ИЗ
ВремТаблицаОпераций КАК ТаблицаОпераций
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Спецификации.Операции КАК СпецификацииОперации
ПО ТаблицаОпераций.ВложеннаяСпецификация = СпецификацииОперации.Ссылка
ГДЕ
ТаблицаОпераций.ЭтоУзел
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТаблицаОпераций.Уровень + 1,
СпецификацииСостав.НомерСтроки,
0,
ВЫБОР
КОГДА НЕ &ИспользоватьЭтапыПроизводства
ТОГДА ЗНАЧЕНИЕ(Справочник.ЭтапыПроизводства.ПустаяСсылка)
КОГДА ТаблицаОпераций.Этап = ЗНАЧЕНИЕ(Справочник.ЭтапыПроизводства.ПустаяСсылка)
ТОГДА СпецификацииСостав.Этап
ИНАЧЕ ТаблицаОпераций.Этап
КОНЕЦ,
ТаблицаОпераций.Спецификация,
СпецификацииСостав.Спецификация,
ИСТИНА,
СпецификацииСостав.Номенклатура,
ТаблицаОпераций.НормаВремени * ВЫБОР
КОГДА СпецификацииСостав.КоличествоПродукции = 0
ТОГДА 0
ИНАЧЕ СпецификацииСостав.Количество / СпецификацииСостав.КоличествоПродукции
//infostart //Mogilnikova
//
КОНЕЦ
КОНЕЦ,
ЕСТЬNULL(ТаблицаОпераций.РесурсПредприятия, ЗНАЧЕНИЕ(Справочник.Ключевыересурсы.ПустаяСсылка)),
ТаблицаОпераций.НормаВремени * ВЫБОР
КОГДА СпецификацииСостав.КоличествоПродукции = 0
ТОГДА 0
ИНАЧЕ СпецификацииСостав.Количество / СпецификацииСостав.КоличествоПродукции
КОНЕЦ
//\\ infostart
ИЗ
ВремТаблицаОпераций КАК ТаблицаОпераций
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Спецификации.Состав КАК СпецификацииСостав
ПО ТаблицаОпераций.ВложеннаяСпецификация = СпецификацииСостав.Ссылка
ГДЕ
ТаблицаОпераций.ЭтоУзел
И СпецификацииСостав.ТипСтрокиСостава = ЗНАЧЕНИЕ(Перечисление.ТипыСтрокСоставаСпецификации.Узел)
И СпецификацииСостав.Спецификация <> ЗНАЧЕНИЕ(Справочник.Спецификации.ПустаяСсылка)
И &УровеньВложенности < 50) КАК ТаблицаОпераций
СГРУППИРОВАТЬ ПО
ТаблицаОпераций.Уровень,
ТаблицаОпераций.Порядок,
ТаблицаОпераций.НомерСтроки,
ТаблицаОпераций.Этап,
ТаблицаОпераций.Спецификация,
ТаблицаОпераций.ВложеннаяСпецификация,
ТаблицаОпераций.ЭтоУзел,
//infostart //Mogilnikova
//
ТаблицаОпераций.Операция
ТаблицаОпераций.Операция,
ТаблицаОпераций.РесурсПредприятия
//\\ infostart
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ВремТаблицаОпераций
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
ТаблицаОпераций.Спецификация КАК Спецификация
ИЗ
ТаблицаОпераций КАК ТаблицаОпераций
ГДЕ
ТаблицаОпераций.ЭтоУзел";
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
РазузловатьОперации(Запрос, МассивДокументов, ИмяТЧ, УровеньВложенности+1);
КонецЕсли;
КонецПроцедуры
Вот и всё. Если вы программист и есть аналогичная задача - просто возьмите код из поста и поставьте мне плюсик. Если вы пользователь - скачайте расширение и прикрепите к своей базе УНФ.