Имя: Пароль:
1C
1С v8
Отчет по количеству материалов, обход по всем спецификациям
0 Frida171186
 
21.11.14
13:04
Люди добрые, помогите! Подскажите, как сделать такой отчет. Нужно вывести, сколько материалов нужно закупить для определенного количества товаров. У каждой готовой продукции есть своя спецификация, но в позициях это спецификации есть номенклатура тоже со своей спецификацией,  и так до 4го уровня может быть. т.е. есть торт, в него входит украшения и болванки, в болванку сырье и полуфабрикаты и т.д. нужно вывести указав торт все материалы для изготовления этого торта, пробежавшись по всем спецификациям. всю голову сломала...
1 John83
 
21.11.14
13:05
если речь про УПП, то смотреть обработку "конструктор спецификаций"
2 Бледно Золотистый
 
21.11.14
13:12
(1) + Общий модуль РазузлованиеНоменклатуры.РазузловатьНоменклатуру()
3 YulyaS
 
21.11.14
13:16
в УПП есть документ "Формирование потребности" формирует на основе плана с учетом остатков на складе. можно взять за основу.
4 Frida171186
 
21.11.14
13:16
не УПП, бухгалтерия 2.0
5 Frida171186
 
21.11.14
13:19
БледноЗолотистый, в бух нет такого модуля
6 John83
 
21.11.14
13:20
(5) тады тащи из УПП, но придется повозиться
7 Banned
 
21.11.14
13:20
(5) Тогда для тебя у меня печальные новости...
Придётся осваивать циклы и рекурсию
8 Frida171186
 
21.11.14
13:26
Banned, спасибо)))
9 zulu_mix
 
21.11.14
13:27
выбрать запросом 1 уровень. поместить в вт1
выбрать запросом 2 уровень, включающий в себя номенклатуру из вт1. поместить в вт2
.... до 4 уровня.
профит!
10 Smallrat
 
21.11.14
13:48
(8) Пишешь функцию ПолучитьДеревоМатериалов() - которая будет получать таблицу всех материалов исходной спецификации с указанием спецификаций полуфабрикатов. Идешь циклом по таблице - если нет спецификации в строке- добавляешь в дерево с вычислением количества, если есть спецификация - вызываешь ПолучитьДеревоМатериалов() для этой спецификации. Полученное дерево подцепляешь к тому что формируется в родительском вызове функции.
В конце получаешь дерево всех ингридентов, неважно какой вложенности. Выгружаешь дерево в таблицу и сворачиваешь. Профит!

Код лень писать, но если задача неподъемная - то поможем.
11 Frida171186
 
21.11.14
14:01
Smallrat, спасибо! чуть позже начну, попробую
12 Smallrat
 
21.11.14
14:02
ща напишу сек, не бугай
13 Smallrat
 
21.11.14
14:04
Ладно, раз уж взялся - напишу примерно (это код из практически такой же задачи)


ДеревоМатериалов = ПолучитьДеревоМатериалов(Спецификация, Количество);

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

Процедура СоединитьДеревьяЗначений(Дерево1, Дерево2)
    Для каждого СтрДерево2 Из Дерево2.Строки Цикл
        СтрДерево1 = Дерево1.Строки.Добавить();
        ЗаполнитьЗначенияСвойств(СтрДерево1, СтрДерево2);
        Если СтрДерево2.Строки.Количество() <> 0 Тогда
            СоединитьДеревьяЗначений(СтрДерево1, СтрДерево2)    
        КонецЕсли;
        
    КонецЦикла;
КонецПроцедуры

14 Smallrat
 
21.11.14
14:07
а, забыл, в конце:


    ТаблицаМатериалов = Новый ТаблицаЗначений;
    ТаблицаМатериалов .Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
    ТаблицаМатериалов .Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));


        СтрокиДереваМатериалов = ДеревоМатериалов.Строки.НайтиСтроки(Новый Структура("ЭтоПолуфабрикат", Ложь), Истина);
    КонецЕсли;
    
    Для каждого СтрДеревоМатериалов Из СтрокиДереваМатериалов Цикл
        СтрТаблицаМатериалов = ТаблицаМатериалов.Добавить();
        ЗаполнитьЗначенияСвойств(СтрТаблицаМатериалов , СтрДеревоМатериалов );
    КонецЦикла;
    
    ТаблицаМатериалов.Свернуть("Номенклатура", "Количество");
15 Smallrat
 
21.11.14
14:07
КонецЕсли; в середине лишнее
16 Frida171186
 
21.11.14
14:15
Smallrat, СПАСИБО!!!
17 John83
 
21.11.14
14:29
(14) взяли и все испортил.. мог бы и фотку сначала затребовать
18 Smallrat
 
21.11.14
14:33
(17) статистика по возрастным группам и процентном соотношении красавиц приводит к выводу, что шанс получить мотивирующую фотографию сравним с шансом получить демотивирующую)))
19 Smallrat
 
21.11.14
14:37
как-то так:
http://savepic.org/6538405.jpg
20 John83
 
21.11.14
14:39
(18) о как загнул-то :)
21 Frida171186
 
21.11.14
16:49
John83, Smallrat, вам фото выслать?)))))
22 Frida171186
 
21.11.14
16:53
John83, Smallrat, в личной карточке все)))
23 John83
 
21.11.14
18:10
(22) ну вот - совсем другое дело, будем считать, что Smallrat не зря старался :)
24 Smallrat
 
21.11.14
22:28
ну теперь только запрос осталось написать ))))