Имя: Пароль:
1C
1С v8
Помогите, пожалуйста с вводом на основании
0 discant
 
20.06.12
13:58
Товарищи, такая проблема... Есть необходимость с каждого заказа на производства создавать подчиненные заказы для каждой подсборки. То есть, для каждого элемента закладки материалы.
Получился такой код

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

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

   КонецЦикла;    
   
   ДопПараметры = Новый Структура;    

   МассивПолуфабрикаты = Новый Массив;
   МассивПолуфабрикаты.Добавить(Перечисления.ВидыВоспроизводстваНоменклатуры.Производство);
       
   ДопПараметры.Вставить("ВидВоспроизводства",      МассивПолуфабрикаты);
   ДопПараметры.Вставить("ИмяРеквЗаказТабЧасть",    "Заказ");
   ДопПараметры.Вставить("ВернутьРезультатЗапроса", Истина);
       
   РезЗапроса = Неопределено;
   ЗаказыНаПроизводствоИПереработку.ЗаполнитьТабличнуюЧастьПоПотребностямЗаказаНаПроизводство(РезЗапроса, ПроизвЗаказ, ДопПараметры);
       
   // Создаем список значений подразделений.
   СписокПодр = Новый СписокЗначений;
   Обход = РезЗапроса.Выбрать();
   Пока Обход.СледующийПоЗначениюПоля("Подразделение") Цикл
       Если СписокПодр.НайтиПоЗначению(Обход.Подразделение)=неопределено Тогда
           СписокПодр.Добавить(Обход.Подразделение);
       КонецЕсли;
   КонецЦикла;
       
   ВыбрПодр = Неопределено; // Подставляем подразделение из шапки
   Если СписокПодр.Количество() > 1 Тогда
       СписокПодр.Вставить(0, Неопределено, "<Все подразделения>");
       ВыбрПодр = СписокПодр[0].Значение;  // По умолчанию значение - <Все подразделения>
       ВыбрПодр = СписокПодр.ВыбратьЭлемент("Выберите подразделение...", СписокПодр[0]);
       Если ВыбрПодр <> Неопределено Тогда // Пользователь отказался от выбора
           ВыбрПодр = ВыбрПодр.Значение;
       КонецЕсли;
   ИначеЕсли СписокПодр.Количество() = 1    Тогда
       ВыбрПодр = СписокПодр[0].Значение;
   КонецЕсли;
   Если ВыбрПодр <> Неопределено Тогда // Пользователь выбрал конкретное подразделение
       Подразделение = ВыбрПодр;
   КонецЕсли;
// Создаем документ на основании основного заказа
ЗП = Неопределено;


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

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

//*************************************************************************

После его выполнения создаются одинаковые документы. Из количество соответствует закладке материалы, но для каждого элемента заказа не получается.
1 zak555
 
20.06.12
14:00
смешно, использовать общие модули и менеджеры РегистрыНакопления из клиентской процедуры
2 discant
 
20.06.12
14:01
У меня файловая база, так что взлетает пока
3 zak555
 
20.06.12
14:04
(2) перепиши этот ужас, который не пойми, что создаёт
4 discant
 
20.06.12
14:06
Это типовой алгоритм ввода на основании с циклом для обхода материалов...
5 zak555
 
20.06.12
18:17
(4) что за конфигурация и документ ?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.