Имя: Пароль:
1C
1C 7.7
v7: Нифига не работает запрос (
0 ololo9
 
09.02.12
10:29
Есть такой отчетик "Выпуск продукции", в нем расчет по цене отгрузки осуществляется след. образом:
Процедура Сформировать_Колонки(Ит, Таб, Стр)
   Флаг = 0;
   Таб.ВывестиСекцию(Стр+"|Начало");
   Ит.ВыбратьПериоды(1);
   Пока Ит.ПолучитьПериод() = 1 Цикл
   //Таб.ПрисоединитьСекцию(Стр+"|Период");
   КонецЦикла;
   Таб.ПрисоединитьСекцию(Стр+"|Итог");  
   
   ИтДав = СоздатьОбъект("БухгалтерскиеИтоги");
   ИтДав.ИспользоватьПланСчетов(ОсновнойПланСчетов());
   ИтДав.ИспользоватьСубконто(ВидыСубконто.Изделие,ТекИзделие, 1);  
   ИтДав.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода,"Дав",,, 2,, "К");
   
   ИтОтг = СоздатьОбъект("БухгалтерскиеИтоги");
   ИтОтг.ИспользоватьПланСчетов(ОсновнойПланСчетов());
   ИтОтг.ИспользоватьСубконто(ВидыСубконто.Изделие,ТекИзделие, 1);  
   ИтОтг.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода,"Отг",,, 2,, "К");
   
   ИтСум = СоздатьОбъект("БухгалтерскиеИтоги");
   ИтСум.ИспользоватьПланСчетов(ОсновнойПланСчетов());
   ИтСум.ИспользоватьСубконто(ВидыСубконто.Изделие,ТекИзделие, 1);  
   ИтСум.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода,"Сум",,, 2,, "К");
   
   Продукция = Ит.Субконто(ВидыСубконто.Изделие);
   
   //Если Счетчик=1 Тогда  
   //    ЦенаПоЦенеОтгрузки = 0;
   //    Пометка = ""; // не пустое значение, когда расчет по цене отгруженного товара
   //Если Ит.ДО(3) > ИтОтг.ДО(3) Тогда
   //    //ЦенаПоЦенеОтгрузки = Окр((((Ит.ДО(3)-ИтОтг.ДО(3))*Ит.Субконто(ВидыСубконто.Изделие).ЦенаДейств.Получить(ВыбКонПериода))+ИтСум.ДО(3))/Ит.ДО(3),0,1);  
   //    ЦенаПоЦенеОтгрузки = Окр((((Ит.ДО(3)-ИтОтг.ДО(3))*ЦенаДействующая)+ИтСум.ДО(3))/Ит.ДО(3),0,1);  
   //    //ЦенаПоЦенеОтгрузки = ИтСум.ДО(3)/ИтОтг.ДО(3);
   //Иначе
   //    //ЦенаПоЦенеОтгрузки = ИтСум.ДО(3)/ИтОтг.ДО(3);
   //    ЦенаПоЦенеОтгрузки = Окр(ИтСум.ДО(3)/ИтОтг.ДО(3),0,1);  
   //    Пометка = "*";
   //КонецЕсли;
   
   Если ИтОтг.ДО(3) > 0  Тогда
       ЦенаПоЦенеОтгрузки = Окр(ИтСум.ДО(3) / ИтОтг.ДО(3),0,1);
   КонецЕсли;
   
   ГлСуммаДейст=ГлСуммаДейст+ЦенаДействующая*(Ит.ДО(3)-ИтДав.ДО(3));
   ГлСуммаСопост=ГлСуммаСопост+ЦенаСопоставимая*Ит.ДО(3);
   ГлСуммаДавал=ГлСуммаДавал+ЦенаДавальческая*ИтДав.ДО(3);
   ГлОтгружено=ГлОтгружено+ИтОтг.ДО(3);
   //ГлЦенаОтгр=ГлЦенаОтгр+(((Ит.ДО(3)-ИтОтг.ДО(3))*Ит.Субконто(ВидыСубконто.Изделие).ЦенаДейств.Получить(ВыбКонПериода)+ИтСум.ДО(3))/?(ПустоеЗначение(Ит.ДО(3))=0,Ит.ДО(3),1))*Ит.ДО(3);
   ГлЦенаОтгр=ГлЦенаОтгр+ЦенаПоЦенеОтгрузки*Ит.ДО(3);
   //КонецЕсли;
   
   Таб.ПрисоединитьСекцию(Стр+"|БезДавал");
   Таб.ПрисоединитьСекцию(Стр+"|ДавКол");
   Таб.ПрисоединитьСекцию(Стр+"|Всего");
   КонецПроцедуры

Однако, если в тек. месяце отгрузки не было тогда расчет по цене отгрузки выдает значения по нулям, а нужно сделать, чтобы тогда цену он брал с док-та Цена, кот. не формирует проводок. Прописываю:
//  из док-та Цена берется цена отгрузки в случае, если количество отгруженной продукции = 0

   ТЗ = СоздатьОбъект("ТаблицаЗначений");
       Запрос = СоздатьОбъект("Запрос");
       ТекстЗапроса =
       "//{{ЗАПРОС(Показать)
   |Период с ВыбНачПериода по ВыбКонПериода;
   |Обрабатывать НеПомеченныеНаУдаление;
   |ДатаДок = Документ.Цена.ДатаДок;
   |Наименование = Документ.Цена.Изделие.Наименование;
   |ЦенаОтгрузки = Документ.Цена.ЦенаОтгрузки;
   |Группировка ДатаДок;
   |Группировка Наименование;
   |Группировка ЦенаОтгрузки;
   |Условие(ЦенаОтгрузки > 0);
   |"//}}ЗАПРОС
       ;
       Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
           Возврат;
       КонецЕсли;
       
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   ТЗ.НоваяКолонка("ДатаДок");
   ТЗ.НоваяКолонка("Наименование");
   ТЗ.НоваяКолонка("ЦенаОтгрузки");
   
   Док = СоздатьОбъект("Документ.Цена");
   Пока Запрос.Группировка (1) = 1 Цикл
       ТЗ.ВыбратьСтроки();
       Пока ТЗ.ПолучитьСтроку() = 1 Цикл
           ТЗ.НоваяСтрока();
           ТЗ.ДатаДок = Запрос.ДатаДок;
           ТЗ.Наименование = Запрос.Наименование;
           ТЗ.ЦенаОтгрузки = Запрос.ЦенаОтгрузки;
           
           //Продукция = 0;
           //ЦенаОтгрузки = 0;    
           //Пока Запрос.Группировка(2) = 1 Цикл
           Если (Док.Изделие = ТЗ.Наименование) и (ИтОтг.ДО(3) = 0) Тогда
               //Продукция = Запрос.Продукция;
               ЦенаОтгрузки = Запрос.ЦенаОтгрузки;
               ЦенаПоЦенеОтгрузки = ТЗ.ЦенаОтгрузки;    
           ИначеЕсли ИтОтг.ДО(3) > 0  Тогда
               ЦенаПоЦенеОтгрузки = Окр(ИтСум.ДО(3) / ИтОтг.ДО(3),0,1);
           КонецЕсли;
           //КонецЕсли;
       КонецЦикла;    
       КонецЦикла;

И нихц в в отчет не попадает, что не так?
1 Mans
 
09.02.12
10:37
ТЗ.ВыбратьСтроки();
строки чего? ТЗ новая
2 ololo9
 
09.02.12
10:43
и при этом в тзэшку все равно попадает, все что нужно, а не выполняется походу тут
           Если (Док.Изделие = ТЗ.Наименование) и (ИтОтг.ДО(3) = 0) Тогда
               //Продукция = Запрос.Продукция;

               ЦенаОтгрузки = Запрос.ЦенаОтгрузки;
               ЦенаПоЦенеОтгрузки = ТЗ.ЦенаОтгрузки;    
           ИначеЕсли ИтОтг.ДО(3) > 0  Тогда
               ЦенаПоЦенеОтгрузки = Окр(ИтСум.ДО(3) / ИтОтг.ДО(3),0,1);
           КонецЕсли;
3 Mans
 
09.02.12
11:11
из чего следует что попадает? тыб её визуальной на пробу сделал, на форму выложил
//ТЗ = СоздатьОбъект("ТаблицаЗначений");
4 1Сергей
 
09.02.12
11:14
+ Обходится только первая группировка запроса. Если в день несколько документов Цена, то каюк. Если в документе Цена Наименование и Цена отгрузки - реквизиты ТаблЧасти, то каюк.
5 Он
 
09.02.12
11:18
(3) Сколько комментариев! )
6 1Сергей
 
09.02.12
11:21
недоглядел:

   |Наименование = Документ.Цена.Изделие.Наименование;
   ...
   |Группировка Наименование;

расстрел на месте без права переписки!
7 ololo9
 
09.02.12
11:27
ок ,путаница какая-то выходит, вот и интересуюсь как переделать
8 Mans
 
09.02.12
11:28
Док.Изделие = ТЗ.Наименование
тут вообще безобразие, подозреваю что Док.Изделие - справочник,
да и Док = СоздатьОбъект("Документ.Цена"); нет там еще никаких изделий
9 Mans
 
09.02.12
11:30
ты вот чего
Запрос.Выгрузить(ТЗНаФорме);
сделай и кумекай чего получил
10 1Сергей
 
09.02.12
11:36
(9) глупости. Достаточно
ТЗ.ВыбратьСтроку();
11 ololo9
 
09.02.12
11:51
вот, в тзэшку ничего не поподает.... а может это проще сделать выборкой документов?
12 Mans
 
09.02.12
11:54
давно кодить начал? дата регистрации на Мисте не показатель
13 1Сергей
 
09.02.12
11:55
(11) у бери перебор строк ТЗ
14 ololo9
 
09.02.12
11:58
с перебором или без, все равно не попадает
15 ololo9
 
09.02.12
12:00
(12) не сильно, просто с запросами по регистром как-то легче идет, а тут какой-то тупняк начался
16 1Сергей
 
09.02.12
12:03
(14) остальные группировки обходить кто будет?
17 Mans
 
09.02.12
12:06
+16 три вложеных цикла, а вот уж там ТЗ.НоваяСтрока();
18 ЧеловекДуши
 
09.02.12
12:08
Отладчик, наверное, забанили :D
19 ololo9
 
09.02.12
12:54
в кон. итоге, первая группировка не выполняется и в отчете выводятся нули по всем изделиям (
20 Mans
 
09.02.12
12:56
№9 сделал?
21 ololo9
 
09.02.12
12:59
да, изделение попадает вот только одно и не понятно по какому принципу, а вот группировка не выполняется (((
22 Mans
 
09.02.12
13:02
только в запросе поменяй
|Наименование = Документ.Цена.Изделие.Наименование;
на
|Изделие = Документ.Цена.Изделие;
ну и группировку,
а потом
Пока Запрос.Группировка (1) = 1 Цикл
   Пока Запрос.Группировка (2) = 1 Цикл
       Пока Запрос.Группировка (3) = 1 Цикл
23 ololo9
 
09.02.12
13:11
хорошая новость, что цена эта подставляется, но почему по остальным изделиям, где отгрузка была строки обнулились?
сдается, что я условие расчета неверное прописываю (
24 Virtmon
 
09.02.12
13:19
Перебор строк в документе нельзя делать запросом. Если там фигурирует один и тот же товар несколько раз, то он берет последнее значение. и Во втором коде по моему 2 куска. Лучше сделай выборкой.
25 Mans
 
09.02.12
13:29
ИтОтг.ДО(3) откуда БИ знает по какой аналитике обороты снимать?
этот разговор надолго, сколько в твоем городе час приходящего 1С-ника стоит?
26 ololo9
 
09.02.12
13:51
это ведь прописано было
ИтОтг = СоздатьОбъект("БухгалтерскиеИтоги");
   ИтОтг.ИспользоватьПланСчетов(ОсновнойПланСчетов());
   ИтОтг.ИспользоватьСубконто(ВидыСубконто.Изделие,ТекИзделие, 1);  
   ИтОтг.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода,"Отг",,, 2,, "К");
27 ololo9
 
09.02.12
13:53
(24) да, берет только последние значения