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

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем discant, 22 июн 2012.

  1. TopicStarter Overlay
    discant
    Offline

    discant

    Регистрация:
    22 июн 2012
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Товарищи, что нужно изменить в алгоритме, чтобы он
    на основании выбранного основного заказа формировал серию подчиненных заказов (в соответствии с деревом спецификации) по типовому механизму ввода на основании, пока в самом последнем заказе каждой «ветки» на закладке «материалы» не останутся только номенклатурные позиции с видом воспроизводства «закупка».
    [CODE1C]
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Если НЕ ЗначениеЗаполнено(ПроизвЗаказ) Тогда
    Предупреждение("Выберите главный документ <<Заказы на производство>>!");
    Возврат;
    КонецЕсли;
    Если ПроизвЗаказ.Материалы.Количество() = 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 Тогда
    Предупреждение("Для документа "+ СокрЛП(ПроизвЗаказ.Ссылка)+" уже выписаны документы Заказа!"+Символы.ПС+"Чтобы заново их создать, необходимо предварительно их удалить(пометить на удаление)!"+Символы.ПС+"Или выбрать верный документ!");
    Возврат;
    КонецЕсли;
    КонецПроцедуры
    [/CODE1C]
  2. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Поправьте теги для начала, а то читать невозможно. :)
    Ну и я бы на вашем месте простыню тут такую не раскладывал, а вырезал только нужные куски. Например вызов всяких предупреждений и проверки на выбранность заказа не нужны.
  3. TopicStarter Overlay
    discant
    Offline

    discant

    Регистрация:
    22 июн 2012
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    В частности интересует этот кусок:
    [CODE1C]
    ДопПараметры = Новый Структура;

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

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

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

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

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

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


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

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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

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

    КонецЦикла;

    КонецЕсли;

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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

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

    КонецЦикла;

    КонецЕсли;

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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

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

    КонецПроцедуры
    [/CODE1C]

Поделиться этой страницей