Создание серии подчиненных заказов на производство в УПП

1. discant 22.06.12 16:48 Сейчас в теме
Товарищи, что нужно изменить в алгоритме, чтобы он
на основании выбранного основного заказа формировал серию подчиненных заказов (в соответствии с деревом спецификации) по типовому механизму ввода на основании, пока в самом последнем заказе каждой «ветки» на закладке «материалы» не останутся только номенклатурные позиции с видом воспроизводства «закупка».

Процедура КнопкаВыполнитьНажатие(Кнопка)
Если НЕ ЗначениеЗаполнено(ПроизвЗаказ) Тогда
Предупреждение("Выберите главный документ <<Заказы на производство>>!");
Возврат;
КонецЕсли;
Если ПроизвЗаказ.Материалы.Количество() = 0 Тогда
Предупреждение("Заполните табличную часть "+"""Материалы""");
Возврат;
КонецЕсли;
Для каждого Объект Из РегистрыНакопления Цикл

Объект.УстановитьИспользованиеИтогов(Истина);

КонецЦикла;


ДопПараметры = Новый Структура;

МассивПолуфабрикаты = Новый Массив;
МассивПолуфабрикаты.Добавить(Перечисления.ВидыВоспроизводстваНоменклатуры.Производство);

ДопПараметры.Вставить("ВидВоспроизводства", МассивПолуфабрикаты);
ДопПараметры.Вставить("ИмяРеквЗаказТабЧасть", "Заказ");
ДопПараметры.Вставить("ВернутьРезультатЗапроса", Истина);

РезЗапроса = Неопределено;
ЗаказыНаПроизводствоИПереработку.ЗаполнитьТабличнуюЧастьПоПотребностямЗаказаНаПроизводство(РезЗапроса, ПроизвЗаказ, ДопПараметры);

// Создаем список значений подразделений.
СписокПодр = Новый СписокЗначений;
Обход = РезЗапроса.Выбрать();
Пока Обход.СледующийПоЗначениюПоля("Подразделение") Цикл
Если СписокПодр.НайтиПоЗначению(Обход.Подразделение) = неопределено Тогда
СписокПодр.Добавить(Обход.Подразделение);
КонецЕсли;
КонецЦикла;

Если СписокПодр.Количество() > 0 Тогда
Для Каждого тт Из СписокПодр Цикл
ЗП = Документы.ЗаказНаПроизводство.СоздатьДокумент();
ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЗП, ПроизвЗаказ);
ЗП.ОсновнойЗаказНаПроизводство = ПроизвЗаказ;
ЗП.Подразделение = тт.Значение;
ЗП.Дата = ТекущаяДата();
ЗП.ДатаЗапуска = ПроизвЗаказ.ДатаЗапуска;
ЗП.ДатаИсполнения = ПроизвЗаказ.ДатаИсполнения;
ЗП.УстановитьНовыйНомер(ПроизвЗаказ.Организация.Префикс);
ЗП.Ответственный = глЗначениеПеременной("глТекущийПользователь");
//вычисляем номер для ДереваЗаказов
//Вытаскиваем № - Цифры.
Если НЕ ЗначениеЗаполнено(ЗП.ДеревоЗаказов) Тогда
цц = "0123456789";
ном = "";
длинаНомера = СтрДлина(ЗП.Номер);
ии = длинаНомера;
Пока ии > 0 Цикл
Если Найти(цц,Сред(ЗП.Номер,ии,1)) > 0 Тогда
ном = Сред(ЗП.Номер,ии,1) + ном;
Иначе
Прервать;
КонецЕсли;
ии = ии - 1;
КонецЦикла;
ном = СокрЛП(ПроизвЗаказ.ДеревоЗаказов)+"_"+Строка(Формат(Число(ном),"ЧГ=0"));
ЗП.ДеревоЗаказов = ном;
КонецЕсли;

Обход = РезЗапроса.Выбрать();
Пока Обход.Следующий() Цикл
Если тт.Значение = Неопределено ИЛИ тт.Значение = Обход.Подразделение Тогда
// Заполняем таб. часть Продукция
НоваяСтрока = ЗП.Продукция.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Обход);
НоваяСтрока.Количество = Обход.Количество * Обход.КоэффициентХраненияОстатков / Обход.Коэффициент;
НоваяСтрока.Спецификация = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(НоваяСтрока.Номенклатура, НоваяСтрока.ХарактеристикаНоменклатуры, ЗП.Дата, ЗП.Подразделение);
КонецЕсли;
КонецЦикла;
//Заполняем Табл. часть Материалы:


ТаблицаИсходныеКомплектующие = ЗП.Материалы.Выгрузить();

Параметры = Новый Структура("ПараметрыВыпуска, КоличествоУровнейРазузлования, ДатаСпецификации");

Для Каждого СтрокаТабличнойЧасти Из ЗП.Продукция Цикл
Если НЕ ЗначениеЗаполнено(СтрокаТабличнойЧасти.Спецификация) Тогда
Продолжить;
КонецЕсли;

РезультатРазузлования = Новый Структура("ИсходныеКомплектующие");

СтруктураИсточник = Новый Структура("Номенклатура, ХарактеристикаНоменклатуры, ЕдиницаИзмерения, Коэффициент, Количество, Спецификация");
ЗаполнитьЗначенияСвойств(СтруктураИсточник, СтрокаТабличнойЧасти);

ПараметрыВыпуска = Новый Соответствие;
Для Каждого ПараметрВыпуска из ЗП.ПараметрыВыпускаПродукции Цикл

Если ПараметрВыпуска.КлючСвязи = СтрокаТабличнойЧасти.КлючСвязи Тогда
ПараметрыВыпуска.Вставить(ПараметрВыпуска.ВидПараметра.Наименование, ПараметрВыпуска.Значение);
КонецЕсли;

КонецЦикла;

Параметры.ПараметрыВыпуска = ПараметрыВыпуска;
Параметры.КоличествоУровнейРазузлования = 1;
Параметры.ДатаСпецификации = ЗП.Дата;

МассивОшибок = РазузлованиеНоменклатуры.РазузловатьНоменклатуру(СтруктураИсточник, РезультатРазузлования, Параметры);

Если МассивОшибок.Количество() > 0 Тогда

Для каждого Ошибка из МассивОшибок Цикл

ОбщегоНазначения.Сообщение("Ошибка: " + Ошибка.Причина, Ошибка.СтатусОшибки);
ОбщегоНазначения.Сообщение(" Спецификация: " + Ошибка.Спецификация);
ОбщегоНазначения.Сообщение(" Номер строки: " + Ошибка.НомерСтроки);
ОбщегоНазначения.Сообщение(" Описание ошибки: " + Ошибка.ОписаниеОшибки);

КонецЦикла;

КонецЕсли;

Если РезультатРазузлования.ИсходныеКомплектующие = Неопределено Тогда
Продолжить;
КонецЕсли;

ИсходныеКомплектующие = РезультатРазузлования.ИсходныеКомплектующие;

ИсходныеКомплектующие.ЗаполнитьЗначения(тт.Значение, "Подразделение");
//заполним подразделение по основной спецификации полуфабрикатов
Для каждого Строка из ИсходныеКомплектующие цикл
ПодразделениеНоменклатуры = ЗаказыНаПроизводствоИПереработку.ПолучитьПодразделениеИзСпецификации(Строка.Спецификация,Строка.Номенклатура,Строка.ХарактеристикаНоменклатуры);
Если ЗначениеЗаполнено(ПодразделениеНоменклатуры) Тогда
Строка.Подразделение = ПодразделениеНоменклатуры;
КонецЕсли;
КонецЦикла;

ИсходныеКомплектующие.Колонки.Добавить("Продукция");
ИсходныеКомплектующие.Колонки.Добавить("ХарактеристикаПродукции");

ИсходныеКомплектующие.ЗаполнитьЗначения(СтрокаТабличнойЧасти.Номенклатура, "Продукция");
ИсходныеКомплектующие.ЗаполнитьЗначения(СтрокаТабличнойЧасти.ХарактеристикаНоменклатуры, "ХарактеристикаПродукции");
ИсходныеКомплектующие.ЗаполнитьЗначения(СтрокаТабличнойЧасти.Спецификация, "Спецификация");

ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ИсходныеКомплектующие, ТаблицаИсходныеКомплектующие);

КонецЦикла;

ТаблицаИсходныеКомплектующие.Свернуть("Номенклатура, ХарактеристикаНоменклатуры, ЕдиницаИзмерения, Коэффициент, ВидВоспроизводства, Спецификация, Подразделение, Продукция, ХарактеристикаПродукции", "Количество");

ЗП.Материалы.Загрузить(ТаблицаИсходныеКомплектующие);

Для Каждого СтрокаТабличнойЧасти Из ЗП.Материалы Цикл

ОбработкаТабличныхЧастей.ЗаполнитьЕдиницуМестТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект, Ложь);

КонецЦикла;
ЗП.Записать();
Сообщить("Документ "+СокрЛП(ЗП));
// Вызываем процедуру для записанного документа, чтобы на основании него нарисовать след. уровень
СоздатьВнутреннийУровень(ЗП.Ссылка);
КонецЦикла;
Предупреждение("Документы созданы. Пожалуйста проверьте их и проведите!");
КонецЕсли;
КонецПроцедуры
//*************************************************************************
Процедура СоздатьВнутреннийУровень(ВерхЗаказ)
ДопПараметры = Новый Структура;

МассивПолуфабрикаты = Новый Массив;
МассивПолуфабрикаты.Добавить(Перечисления.ВидыВоспроизводстваНоменклатуры.Производство);

ДопПараметры.Вставить("ВидВоспроизводства", МассивПолуфабрикаты);
ДопПараметры.Вставить("ИмяРеквЗаказТабЧасть", "Заказ");
ДопПараметры.Вставить("ВернутьРезультатЗапроса", Истина);

РезЗапроса = Неопределено;
ЗаказыНаПроизводствоИПереработку.ЗаполнитьТабличнуюЧастьПоПотребностямЗаказаНаПроизводство(РезЗапроса, ВерхЗаказ, ДопПараметры);

// Создаем список значений подразделений.
СписокПодр = Новый СписокЗначений;
Обход = РезЗапроса.Выбрать();
Пока Обход.СледующийПоЗначениюПоля("Подразделение") Цикл
Если СписокПодр.НайтиПоЗначению(Обход.Подразделение) = неопределено Тогда
СписокПодр.Добавить(Обход.Подразделение);
КонецЕсли;
КонецЦикла;

Если СписокПодр.Количество() > 0 Тогда
Для Каждого тт Из СписокПодр Цикл
ЗП = Документы.ЗаказНаПроизводство.СоздатьДокумент();
ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЗП, ВерхЗаказ);
ЗП.ОсновнойЗаказНаПроизводство = ВерхЗаказ;
ЗП.Подразделение = тт.Значение;
ЗП.Дата = Текущаядата();
ЗП.ДатаЗапуска = ВерхЗаказ.ДатаЗапуска;
ЗП.ДатаИсполнения = ВерхЗаказ.ДатаИсполнения;
ЗП.УстановитьНовыйНомер(ВерхЗаказ.Организация.Префикс);
ЗП.Ответственный = глЗначениеПеременной("глТекущийПользователь");
//вычисляем номер для ДереваЗаказов
//Вытаскиваем № - Цифры.
Если НЕ ЗначениеЗаполнено(ЗП.ДеревоЗаказов) Тогда
цц = "0123456789";
ном = "";
длинаНомера = СтрДлина(ЗП.Номер);
ии = длинаНомера;
Пока ии > 0 Цикл
Если Найти(цц,Сред(ЗП.Номер,ии,1)) > 0 Тогда
ном = Сред(ЗП.Номер,ии,1) + ном;
Иначе
Прервать;
КонецЕсли;
ии = ии - 1;
КонецЦикла;
ном = СокрЛП(ВерхЗаказ.ДеревоЗаказов)+"_"+Строка(Формат(Число(ном),"ЧГ=0"));
ЗП.ДеревоЗаказов = ном;
КонецЕсли;

Обход = РезЗапроса.Выбрать();
Пока Обход.Следующий() Цикл
Если тт.Значение = Неопределено ИЛИ тт.Значение = Обход.Подразделение Тогда
// Заполняем таб. часть Продукция
НоваяСтрока = ЗП.Продукция.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Обход);
НоваяСтрока.Количество = Обход.Количество * Обход.КоэффициентХраненияОстатков / Обход.Коэффициент;
НоваяСтрока.Спецификация = УправлениеПроизводством.ОпределитьСпецификациюПоУмолчанию(НоваяСтрока.Номенклатура, НоваяСтрока.ХарактеристикаНоменклатуры, ЗП.Дата, ЗП.Подразделение);
КонецЕсли;
КонецЦикла;
//Заполняем Табл. часть Материалы:


ТаблицаИсходныеКомплектующие = ЗП.Материалы.Выгрузить();

Параметры = Новый Структура("ПараметрыВыпуска, КоличествоУровнейРазузлования, ДатаСпецификации");

Для Каждого СтрокаТабличнойЧасти Из ЗП.Продукция Цикл
Если НЕ ЗначениеЗаполнено(СтрокаТабличнойЧасти.Спецификация) Тогда
Продолжить;
КонецЕсли;

РезультатРазузлования = Новый Структура("ИсходныеКомплектующие");

СтруктураИсточник = Новый Структура("Номенклатура, ХарактеристикаНоменклатуры, ЕдиницаИзмерения, Коэффициент, Количество, Спецификация");
ЗаполнитьЗначенияСвойств(СтруктураИсточник, СтрокаТабличнойЧасти);

ПараметрыВыпуска = Новый Соответствие;
Для Каждого ПараметрВыпуска из ЗП.ПараметрыВыпускаПродукции Цикл

Если ПараметрВыпуска.КлючСвязи = СтрокаТабличнойЧасти.КлючСвязи Тогда
ПараметрыВыпуска.Вставить(ПараметрВыпуска.ВидПараметра.Наименование, ПараметрВыпуска.Значение);
КонецЕсли;

КонецЦикла;

Параметры.ПараметрыВыпуска = ПараметрыВыпуска;
Параметры.КоличествоУровнейРазузлования = 1;
Параметры.ДатаСпецификации = ЗП.Дата;

МассивОшибок = РазузлованиеНоменклатуры.РазузловатьНоменклатуру(СтруктураИсточник, РезультатРазузлования, Параметры);

Если МассивОшибок.Количество() > 0 Тогда

Для каждого Ошибка из МассивОшибок Цикл

ОбщегоНазначения.Сообщение("Ошибка: " + Ошибка.Причина, Ошибка.СтатусОшибки);
ОбщегоНазначения.Сообщение(" Спецификация: " + Ошибка.Спецификация);
ОбщегоНазначения.Сообщение(" Номер строки: " + Ошибка.НомерСтроки);
ОбщегоНазначения.Сообщение(" Описание ошибки: " + Ошибка.ОписаниеОшибки);

КонецЦикла;

КонецЕсли;

Если РезультатРазузлования.ИсходныеКомплектующие = Неопределено Тогда
Продолжить;
КонецЕсли;

ИсходныеКомплектующие = РезультатРазузлования.ИсходныеКомплектующие;

ИсходныеКомплектующие.ЗаполнитьЗначения(тт.Значение, "Подразделение");
//заполним подразделение по основной спецификации полуфабрикатов
Для каждого Строка из ИсходныеКомплектующие цикл
ПодразделениеНоменклатуры = ЗаказыНаПроизводствоИПереработку.ПолучитьПодразделениеИзСпецификации(Строка.Спецификация,Строка.Номенклатура,Строка.ХарактеристикаНоменклатуры);
Если ЗначениеЗаполнено(ПодразделениеНоменклатуры) Тогда
Строка.Подразделение = ПодразделениеНоменклатуры;
КонецЕсли;
КонецЦикла;

ИсходныеКомплектующие.Колонки.Добавить("Продукция");
ИсходныеКомплектующие.Колонки.Добавить("ХарактеристикаПродукции");

ИсходныеКомплектующие.ЗаполнитьЗначения(СтрокаТабличнойЧасти.Номенклатура, "Продукция");
ИсходныеКомплектующие.ЗаполнитьЗначения(СтрокаТабличнойЧасти.ХарактеристикаНоменклатуры, "ХарактеристикаПродукции");
ИсходныеКомплектующие.ЗаполнитьЗначения(СтрокаТабличнойЧасти.Спецификация, "Спецификация");

ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ИсходныеКомплектующие, ТаблицаИсходныеКомплектующие);

КонецЦикла;

ТаблицаИсходныеКомплектующие.Свернуть("Номенклатура, ХарактеристикаНоменклатуры, ЕдиницаИзмерения, Коэффициент, ВидВоспроизводства, Спецификация, Подразделение, Продукция, ХарактеристикаПродукции", "Количество");

ЗП.Материалы.Загрузить(ТаблицаИсходныеКомплектующие);

Для Каждого СтрокаТабличнойЧасти Из ЗП.Материалы Цикл

ОбработкаТабличныхЧастей.ЗаполнитьЕдиницуМестТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект, Ложь);

КонецЦикла;
ЗП.Записать();
Сообщить("Документ "+СокрЛП(ЗП));
// Вызываем процедуру для записанного документа
СоздатьВнутреннийУровень(ЗП.Ссылка);
КонецЦикла;
Иначе
Возврат;
КонецЕсли;

КонецПроцедуры

Процедура ПриИзменении(Элемент)
//Вытаскиваем номер док-та в цифровом виде
цц = "0123456789";
ном = "";
длинаНомера = СтрДлина(ПроизвЗаказ.Номер);
ии = длинаНомера;
Пока ии > 0 Цикл
Если Найти(цц,Сред(ПроизвЗаказ.Номер,ии,1)) > 0 Тогда
ном = Сред(ПроизвЗаказ.Номер,ии,1) + ном;
Иначе
Прервать;
КонецЕсли;
ии = ии - 1;
КонецЦикла;
ном = Строка(Формат(Число(ном),"ЧГ=0"))+"_";
Длном = СтрДлина(ном);
// Проверяем, есть ли уже подчиненные док-ты.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказНаПроизводство.ОсновнойЗаказНаПроизводство
|ИЗ
| Документ.ЗаказНаПроизводство КАК ЗаказНаПроизводство
|ГДЕ
| (ЗаказНаПроизводство.ОсновнойЗаказНаПроизводство = &ОсновнойЗаказНаПроизводство
| ИЛИ ПОДСТРОКА(ЗаказНаПроизводство.Комментарий,1,&Длном) = &ном)
| И ЗаказНаПроизводство.Проведен = ИСТИНА";

Запрос.УстановитьПараметр("ОсновнойЗаказНаПроизводство",ПроизвЗаказ.Ссылка);
Запрос.УстановитьПараметр("Длном",Длном);
Запрос.УстановитьПараметр("ном",ном);

Выб = Запрос.Выполнить().Выбрать();
Если Выб.Количество() > 0 Тогда
Предупреждение("Для документа "+ СокрЛП(ПроизвЗаказ.Ссылка)+" уже выписаны документы Заказа!"+Символы.ПС+"Чтобы заново их создать, необходимо предварительно их удалить(пометить на удаление)!"+Символы.ПС+"Или выбрать верный документ!");
Возврат;
КонецЕсли;
КонецПроцедуры
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Поручик 4659 22.06.12 17:11 Сейчас в теме
(1) За постинг в данном форуме $m не начисляются.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот