Имя: Пароль:
1C
1С v8
Как программно вытащить свойства номенклатуры
0 discant
 
20.06.12
11:59
Добрый день!
Речь идет об УПП.
Есть документ ЗаказНаПроизводство. В нем заполнены номенклатурой ТЧ Продукция и Материалы. Подскажите, пожалуйста, как программно можно вытащить свойства элементов номенклатуры?
1 aspirant
 
20.06.12
12:02
РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Новый Структура("Объект,Свойство",Номенклатура,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("ИмяВашегоСвойства"))).Значение;
2 Нуф-Нуф
 
20.06.12
12:03
(1) а запросом некошерно?
3 aspirant
 
20.06.12
12:09
запросом тоже запросто, но я для форм использую такую конструкцию. Она короче.
4 aspirant
 
20.06.12
12:10
(2) запросом конечно еще проще, но фиг его знает, что за задача у ТС (что он далее собирается делать)
5 discant
 
20.06.12
12:12
Хорошо тогда так...
Делаю ввод на основании основного заказа для каждой подсборки... Как получить в поле подразделения шапки дочернего заказа свойство "Цех" элемента ТЯ Материалы?
6 Maxus43
 
20.06.12
12:13
Подразделение = (1);
7 discant
 
20.06.12
12:14
Пасибо. Попробую...
8 alextom81
 
20.06.12
12:14
В УПП есть обработка "ЗначенияСвойствОбъекта" - в ней всё есть для счастья. Если даже ей не пользоваться, то большинство методов, которые можно  применить - там есть.
9 discant
 
20.06.12
12:57
Ребят, вот такой код... Выдает ошибку, что переменная Номенклатура неопределена.
// Создаем документ на основании основного заказа
ЗП = Неопределено;
мт = ПроизвЗаказ.Материалы.Количество();
Для Каждого мт Из ПроизвЗаказ.Материалы Цикл
ЗП = Документы.ЗаказНаПроизводство.СоздатьДокумент();    
           ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЗП, ПроизвЗаказ);
           ЗП.ОсновнойЗаказНаПроизводство = ПроизвЗаказ;
           ЗП.Подразделение = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Новый Структура("Объект,Свойство",Номенклатура,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Цех"))).Значение;
10 aspirant
 
20.06.12
13:00
да уж. А номенклатура у тебя в данном случае чему равна?
11 discant
 
20.06.12
13:03
Так вот я и спрашиваю... Нужно вытащить элементы из материалы, которую обходит цикл.
12 discant
 
20.06.12
13:04
Сорри, свойства из элементов
13 aspirant
 
20.06.12
13:06
Для Каждого Мт Из ПроизвЗаказ.Материалы Цикл
  Номенклатура = Мт.Материал (или Мт.Номенклатура - как там в метаданных)
а далее - как у тебя. И никаких мт=ПроизвЗаказ.Материалы.Количество(); - вычеркни
14 zinch
 
20.06.12
13:06
Попробуй
Номенклатура = мт.Номенклатура
=)
15 aspirant
 
20.06.12
13:07
а ты в цикле на каждый материал создаешь отдельный док?
16 discant
 
20.06.12
13:26
Да.
17 discant
 
20.06.12
13:31
Ошибка вываливается...
{Форма.Форма.Форма(57)}: Поле объекта не обнаружено (Материалы)
   Номенклатура = Мт.Материалы;
18 aspirant
 
20.06.12
13:32
А как называется поле с материалом в таблице Материалы?
19 discant
 
20.06.12
13:36
Заработало с номенклатурой
20 discant
 
20.06.12
13:41
Не сочтите за наглость, есть еще вопрос...
Есть задача по каждому материалу создавать отдельный документ, а после выполнения нижеследующего кода создаются 8 одинаковых документов (кол-во материалов в основном заказе 8).

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

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

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

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


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

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

//*************************************************************************
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.