Имя: Пароль:
1C
1C 7.7
v7: Формирование отчета
0 Style2out
 
02.09.11
19:05
Доброе время соток. Делаю отчет по заказу номенклатуре, а так как новичок в программировании 1С требуется помощь.
Половину функций я реализовал на примере типовых отчетов. Мне нужно задавать и выводить в одну таблицу два периода к примеру с 01.01.11 по 10.01.11 и 11.01.11 по 20.01.11. http://imageshack.us/photo/my-images/31/80050587.jpg/ таблица http://imageshack.us/photo/my-images/717/95952520.jpg/

Как правильно реализовать запрос и формирование таблицы? Для каждого периода свой запрос? Как правильно? Сейчас работает вот так:

   Запрос = СоздатьОбъект("Запрос");
     ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с НачДата по КонДата;
   |Контрагент = Регистр.Заявки.Грузополучатель.Владелец;
   |Грузополучатель = Регистр.Заявки.Грузополучатель;
   |Номенклатура = Регистр.Заявки.Номенклатура;
   |МестоХранения = Регистр.Заявки.МестоОтгрузки;
   |СпособДоставки = Регистр.Заявки.Заявка.ВидДоставки;
   |Заказ = Регистр.Заявки.Заявка;
   |Количество = Регистр.Заявки.Количество;
   |Вес = Регистр.Заявки.Вес;
   |Функция КоличествоПлан = Приход(Количество);
   |Функция ВесПлан = Приход(Вес);
       |Функция КоличествоПлан1 = Приход(Количество);
   |Функция ВесПлан1 = Приход(Вес);  
   |"//}}ЗАПРОС

Состояние("Заполнение выходной таблицы...");
   Если КолГруппировок>0 Тогда
       Пока Запрос.Группировка(1) = 1 Цикл
             Значение1=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(1)));
           Значение11=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(1));
           Таб.ВывестиСекцию("Строка1");
           Если КолГруппировок>1 Тогда
               Пока Запрос.Группировка(2) = 1 Цикл        
                   Значение2=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(2)));
                   Значение22=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(2));
                   Таб.ВывестиСекцию("Строка2");
                   Если КолГруппировок>2 Тогда
                       Пока Запрос.Группировка(3) = 1 Цикл        
                           Значение3=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(3)));
                           Значение33=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(3));
                           Таб.ВывестиСекцию("Строка3");
                           Если КолГруппировок>3 Тогда
                               Пока Запрос.Группировка(4) = 1 Цикл        
                                   Значение4=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(4)));
                                   Значение44=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(4));
                                   Таб.ВывестиСекцию("Строка4");
                                   Если КолГруппировок>4 Тогда
                                       Пока Запрос.Группировка(5) = 1 Цикл        
                                           Значение5=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(5)));
                                           Значение55=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(5));
                                           Таб.ВывестиСекцию("Строка5");  
                                           Если КолГруппировок>5 Тогда
                                               Пока Запрос.Группировка(5) = 1 Цикл        
                                                   Значение6=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(6)));
                                                   Значение66=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(6));
                                                   Таб.ВывестиСекцию("Строка6");
                                               КонецЦикла;    
                                           КонецЕсли;
                                       КонецЦикла;    
                                   КонецЕсли;
                               КонецЦикла;    
                           КонецЕсли;
                       КонецЦикла;    
                   КонецЕсли;
               КонецЦикла;    
           КонецЕсли;
       КонецЦикла;    
   КонецЕсли;

т.е. в оба периода выводятся одинаковые значения, т.к. запрос один.
Заранее благодарен за помощь.
1 Rie
 
02.09.11
19:07
(0) Делай два запроса. Заполняй результатами этих запросов таблицу значений. А далее формируй отчёт по таблице значений.
2 VasilyKushnir
 
02.09.11
20:22
(1) +1000 Просто и со вкусом.. Только я бы сделал один запрос и сначала "подсунул" ему первый период, а потом второй, ну а дальше по классике от Rie :-))
3 Style2out
 
02.09.11
20:25
Очень интересно как это сделать с одним запросом. Покажите пожалуйста пример.
4 VasilyKushnir
 
02.09.11
20:26
(3) Запрос один (текст запросса имеется в виду), но прогоняется два раза с разными НачПериод и КонПериод.
5 Style2out
 
03.09.11
19:56
Создал два запроса с разным периодом дат. Вообще сделал вот так:
Процедура Сформировать()
   Перем Стр;    
   Если ПроверкаДат(НачДата,КонДата) = 0 Тогда
       Возврат;
   КонецЕсли;
   Если ПроверкаДат(НачДата1,КонДата1) = 0 Тогда
       Возврат;
   КонецЕсли;
   СтрокаСтатуса = "Сформирован "+ТекущаяДата()+" "+ТекущееВремя()+?(ПустоеЗначение(ИмяПользователя())=0,"  Пользователь: "+ИмяПользователя(),"");
   ТЗ=СоздатьОбъект("ТаблицаЗначений");  
   ТЗ.НоваяКолонка("Ном","Число");
   ТЗ.НоваяКолонка("Пометка_","Число");
   ТЗ.НоваяКолонка("Значение_");
   ТЗ.НоваяКолонка("Строка_");
   Для К=1 По СписокУровней.РазмерСписка() Цикл
       Если СписокУровней.Пометка(К,)=1 Тогда
           ТЗ.НоваяСтрока();
           ТЗ.Ном=К;
           ТЗ.Пометка_=0;
           ТЗ.Значение_=СписокУровней.ПолучитьЗначение(К,Стр);
           ТЗ.Строка_=Стр;
       Иначе        
           ТЗ.НоваяСтрока();
           ТЗ.Ном=К;
           ТЗ.Пометка_=1;
           ТЗ.Значение_=СписокУровней.ПолучитьЗначение(К,Стр);
           ТЗ.Строка_=Стр;
       КонецЕсли;    
   КонецЦикла;              
   СписокУровней.УдалитьВсе();
   ТЗ.Сортировать("+2,1");
   ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку()=1 Цикл
       СписокУровней.ДобавитьЗначение(ТЗ.Значение_,ТЗ.Строка_);
       Если ТЗ.Пометка_=1 Тогда
           СписокУровней.Пометка(ТЗ.НомерСтроки,0);
       Иначе
           СписокУровней.Пометка(ТЗ.НомерСтроки,1);
       КонецЕсли;    
   КонецЦикла;          
           
   Запрос = СоздатьОбъект("Запрос");
     ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с НачДата по КонДата;
   |Контрагент = Регистр.Заявки.Грузополучатель.Владелец;
   |Грузополучатель = Регистр.Заявки.Грузополучатель;
   |Номенклатура = Регистр.Заявки.Номенклатура;
   |МестоХранения = Регистр.Заявки.МестоОтгрузки;
   |СпособДоставки = Регистр.Заявки.Заявка.ВидДоставки;
   |Заказ = Регистр.Заявки.Заявка;
   |Количество = Регистр.Заявки.Количество;
   |Вес = Регистр.Заявки.Вес;
   |Функция КоличествоПлан = Приход(Количество);
   |Функция ВесПлан = Приход(Вес);
   |"//}}ЗАПРОС    
                 ;
   КолГруппировок=0;
   Для К=1 По СписокУровней.РазмерСписка() Цикл
       Если СписокУровней.Пометка(К,)=1 Тогда  
           КолГруппировок=КолГруппировок+1;
           Если СписокУровней.ПолучитьЗначение(К)="Контрагент" Тогда
               ТекстЗапроса=ТекстЗапроса+"
               |Группировка Контрагент без групп упорядочить по Контрагент.Код;";
               ТекстЗапроса=ТекстЗапроса+"
               |Условие (Контрагент в Зн2);";
           КонецЕсли;              
           Если СписокУровней.ПолучитьЗначение(К)="Грузополучатель" Тогда
               ТекстЗапроса=ТекстЗапроса+"
               |Группировка Грузополучатель без групп упорядочить по Грузополучатель.Код;";
               ТекстЗапроса=ТекстЗапроса+"
               |Условие (Грузополучатель в Зн3);";
           КонецЕсли;    
           Если СписокУровней.ПолучитьЗначение(К)="Номенклатура" Тогда
               ТекстЗапроса=ТекстЗапроса+"
               |Группировка Номенклатура без групп упорядочить по Номенклатура.Код;";
               ТекстЗапроса=ТекстЗапроса+"
               |Условие (Номенклатура в Зн1);";
           КонецЕсли;    
           Если СписокУровней.ПолучитьЗначение(К)="МестоХранения" Тогда
               ТекстЗапроса=ТекстЗапроса+"                  
               |Группировка МестоХранения без групп упорядочить по МестоХранения.Код;";
               ТекстЗапроса=ТекстЗапроса+"
               |Условие (МестоХранения в Зн4);";
           КонецЕсли;    
           Если СписокУровней.ПолучитьЗначение(К)="СпособДоставки" Тогда
               ТекстЗапроса=ТекстЗапроса+"
               |Группировка СпособДоставки без групп упорядочить по СпособДоставки.Код;";
               ТекстЗапроса=ТекстЗапроса+"
               |Условие (СпособДоставки в Зн5);";
           КонецЕсли;          
           Если СписокУровней.ПолучитьЗначение(К)="Заказ" Тогда  
               ТекстЗапроса=ТекстЗапроса+"
               |Группировка Заказ  упорядочить по Заказ.ДатаДок;";      
           КонецЕсли;    
       Иначе
           Продолжить;
       КонецЕсли;    
   КонецЦикла;
   
   Запрос1 = СоздатьОбъект("Запрос");
                   
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с НачДата1 по КонДата1;
   |Контрагент = Регистр.Заявки.Грузополучатель.Владелец;
   |Грузополучатель = Регистр.Заявки.Грузополучатель;
   |Номенклатура = Регистр.Заявки.Номенклатура;
   |МестоХранения = Регистр.Заявки.МестоОтгрузки;
   |СпособДоставки = Регистр.Заявки.Заявка.ВидДоставки;
   |Заказ = Регистр.Заявки.Заявка;
   |Количество = Регистр.Заявки.Количество;
   |Вес = Регистр.Заявки.Вес;
   |Функция КоличествоПлан1 = Приход(Количество);
   |Функция ВесПлан1 = Приход(Вес);
   |"//}}ЗАПРОС    
                 ;
   КолГруппировок=0;
   Для К=1 По СписокУровней.РазмерСписка() Цикл
       Если СписокУровней.Пометка(К,)=1 Тогда  
           КолГруппировок=КолГруппировок+1;
           Если СписокУровней.ПолучитьЗначение(К)="Контрагент" Тогда
               ТекстЗапроса=ТекстЗапроса+"
               |Группировка Контрагент без групп упорядочить по Контрагент.Код;";
               ТекстЗапроса=ТекстЗапроса+"
               |Условие (Контрагент в Зн2);";
           КонецЕсли;              
           Если СписокУровней.ПолучитьЗначение(К)="Грузополучатель" Тогда
               ТекстЗапроса=ТекстЗапроса+"
               |Группировка Грузополучатель без групп упорядочить по Грузополучатель.Код;";
               ТекстЗапроса=ТекстЗапроса+"
               |Условие (Грузополучатель в Зн3);";
           КонецЕсли;    
           Если СписокУровней.ПолучитьЗначение(К)="Номенклатура" Тогда
               ТекстЗапроса=ТекстЗапроса+"
               |Группировка Номенклатура без групп упорядочить по Номенклатура.Код;";
               ТекстЗапроса=ТекстЗапроса+"
               |Условие (Номенклатура в Зн1);";
           КонецЕсли;    
           Если СписокУровней.ПолучитьЗначение(К)="МестоХранения" Тогда
               ТекстЗапроса=ТекстЗапроса+"                  
               |Группировка МестоХранения без групп упорядочить по МестоХранения.Код;";
               ТекстЗапроса=ТекстЗапроса+"
               |Условие (МестоХранения в Зн4);";
           КонецЕсли;    
           Если СписокУровней.ПолучитьЗначение(К)="СпособДоставки" Тогда
               ТекстЗапроса=ТекстЗапроса+"
               |Группировка СпособДоставки без групп упорядочить по СпособДоставки.Код;";
               ТекстЗапроса=ТекстЗапроса+"
               |Условие (СпособДоставки в Зн5);";
           КонецЕсли;          
           Если СписокУровней.ПолучитьЗначение(К)="Заказ" Тогда  
               ТекстЗапроса=ТекстЗапроса+"
               |Группировка Заказ  упорядочить по Заказ.ДатаДок;";      
           КонецЕсли;    
       Иначе
           Продолжить;
       КонецЕсли;    
   КонецЦикла;      
   
   
   

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
 
               
Если Запрос1.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;    

   
   
Таб = СоздатьОбъект("Таблица");            
Таб.ИсходнаяТаблица("Анализ по номенклатуре");
Таб.ВывестиСекцию("Заголовок");    
   
   
Состояние("Заполнение выходной таблицы...");
   Если КолГруппировок>0 Тогда
       Пока Запрос.Группировка(1) = 1 Цикл
             Значение1=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(1)));
           Значение11=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(1));
           Таб.ВывестиСекцию("Строка1");
           Если КолГруппировок>1 Тогда
               Пока Запрос.Группировка(2) = 1 Цикл        
                   Значение2=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(2)));
                   Значение22=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(2));
                   Таб.ВывестиСекцию("Строка2");
                   Если КолГруппировок>2 Тогда
                       Пока Запрос.Группировка(3) = 1 Цикл        
                           Значение3=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(3)));
                           Значение33=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(3));
                           Таб.ВывестиСекцию("Строка3");
                           Если КолГруппировок>3 Тогда
                               Пока Запрос.Группировка(4) = 1 Цикл        
                                   Значение4=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(4)));
                                   Значение44=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(4));
                                   Таб.ВывестиСекцию("Строка4");
                                   Если КолГруппировок>4 Тогда
                                       Пока Запрос.Группировка(5) = 1 Цикл        
                                           Значение5=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(5)));
                                           Значение55=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(5));
                                           Таб.ВывестиСекцию("Строка5");  
                                           Если КолГруппировок>5 Тогда
                                               Пока Запрос.Группировка(5) = 1 Цикл        
                                                   Значение6=ПредставлениеСтроки_(Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(6)));
                                                   Значение66=Запрос.ПолучитьАтрибут(СписокУровней.ПолучитьЗначение(6));
                                                   Таб.ВывестиСекцию("Строка6");
                                               КонецЦикла;    
                                           КонецЕсли;
                                       КонецЦикла;    
                                   КонецЕсли;
                               КонецЦикла;    
                           КонецЕсли;
                       КонецЦикла;    
                   КонецЕсли;
               КонецЦикла;    
           КонецЕсли;
       КонецЦикла;    
   КонецЕсли;
Результаты формирования вот: http://imageshack.us/photo/my-images/59/1234kma.jpg/

Что я сделал не так? Я так понимаю я неправильно выгружаю результаты запросов в таблицу? Или обрабатывается всего один запрос?
6 Style2out
 
05.09.11
15:20
Как выгрузить данные из запросов в одну и ту же таблицу значений несколько раз, чтобы предыдущие выгруженные данные в таблице значений не затирались?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.