Товарищи, что нужно изменить в алгоритме, чтобы он
на основании выбранного основного заказа формировал серию подчиненных заказов (в соответствии с деревом спецификации) по типовому механизму ввода на основании, пока в самом последнем заказе каждой «ветки» на закладке «материалы» не останутся только номенклатурные позиции с видом воспроизводства «закупка».
Процедура КнопкаВыполнитьНажатие(Кнопка)
Если НЕ ЗначениеЗаполнено(ПроизвЗаказ) Тогда
Предупреждение("Выберите главный документ <<Заказы на производство>>!");
Возврат;
КонецЕсли;
Если ПроизвЗаказ.Материалы.Количество() = 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 Тогда
Предупреждение("Для документа "+ СокрЛП(ПроизвЗаказ.Ссылка)+" уже выписаны документы Заказа!"+Символы.ПС+"Чтобы заново их создать, необходимо предварительно их удалить(пометить на удаление)!"+Символы.ПС+"Или выбрать верный документ!");
Возврат;
КонецЕсли;
КонецПроцедуры
на основании выбранного основного заказа формировал серию подчиненных заказов (в соответствии с деревом спецификации) по типовому механизму ввода на основании, пока в самом последнем заказе каждой «ветки» на закладке «материалы» не останутся только номенклатурные позиции с видом воспроизводства «закупка».
Процедура КнопкаВыполнитьНажатие(Кнопка)
Если НЕ ЗначениеЗаполнено(ПроизвЗаказ) Тогда
Предупреждение("Выберите главный документ <<Заказы на производство>>!");
Возврат;
КонецЕсли;
Если ПроизвЗаказ.Материалы.Количество() = 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 Тогда
Предупреждение("Для документа "+ СокрЛП(ПроизвЗаказ.Ссылка)+" уже выписаны документы Заказа!"+Символы.ПС+"Чтобы заново их создать, необходимо предварительно их удалить(пометить на удаление)!"+Символы.ПС+"Или выбрать верный документ!");
Возврат;
КонецЕсли;
КонецПроцедуры
По теме из базы знаний
- Загрузка документов и номенклатуры из Excel в 1С "одним нажатием": УПД, ТОРГ-12, отчеты маркетплейсов, заказы, счета, прайсы
- Концепция автоматизации многопрофильного Холдинга в системе АУБ на платформе 1С
- Перенос данных УПП/КА в ЕРП и КА2, что таит этот чудный процесс
- Навигация по функциональным опциям типовых конфигураций
- Распознавание и загрузка сканов в 1С "одним нажатием". УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот