Имя: Пароль:
1C
1C 7.7
v7: Помогите чайнику по запросу
,
0 Jeema
 
16.10.12
04:21
Суть отчета, определение какой товар не продавался или продавалось менее заданного количества штук в заданный период.

У меня в таблице например если поставлю лог.выражение > 10, показывает только 10, а если >11 то только 11 товаров. Помогите плиз!!!

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

   
   //**************************************************************************************
   //конец блока формирования запроса
   
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       сообщить("запрос упал!!!");
       Возврат;
       
   КонецЕсли;                                                          
   
   //цикл обработки запроса
   //***********************************************************************

   //***********************************************************************
       СуммаВсегоПриход=0;
       НомСтроки=1;    
       сообщить(текстзапроса);
   пока Запрос.группировка(1)  =  1 цикл        
       Если запрос.количество <> 0 тогда
       Ценаприход = запрос.сумма/запрос.количество;                                  
       СуммаВсегоПриход=суммаВсегоПриход+Ценаприход;
       Таблица.ВывестиСекцию("Строка");
       НомСтроки=НомСтроки+1;
   иначеЕсли Запрос.Количество = 0 Тогда
       сообщить("Товар "+ запрос.номенклатура +" количество равно нулю!!! примите меры!!!");
   
КонецЕсли;
КонецЦикла;
   //***********************************************************************
   //конец цикла обработки запроса
   Таблица.Защита(0);    
   Если глПолучитьПолномочие("РазрешитьРедактироватьПечатнуюФорму") = 0 Тогда
   Таблица.Защита(1);    
КонецЕсли;
   Таблица.ВывестиСекцию("Строка");
   Таблица.ВывестиСекцию("Всего");
   Таблица.ВывестиСекцию("Подвал");
   Таблица.Показать("Отчет неликвидный товар","");
   
   
КонецПроцедуры

//******************************************************************************
  Процедура ПриОткрытии()
   ВыбЗнач.добавитьзначение("<",);
   ВыбЗнач.добавитьзначение(">",);                
   ВыбЗнач.добавитьзначение("=",);
   ВыбФирма = глЗначениеПоУмолчанию("Фирма");
   ВыбСклад= глзначениеПоУмолчанию("Склад");
   ДатаКонца   = ПолучитьДатуТА();
   ДатаНачала  = НачМесяца(ПолучитьДатуТА());  
   КонецПроцедуры

   //Если Условие <> "< Не выбран >" Тогда
   //    ТекстЗапроса = ТекстЗапроса +
   //    "Условие ("+Условие+"ЗначениеУсловия);";
   //КонецЕсли;    
                               
Процедура тст()
     сообщить(выбзнач.текущаястрока());    
конецпроцедуры
  Процедура выбзнач()
     сообщить(выбзнач.текущаястрока());    
конецпроцедуры
//******************************************************************************      


//********************************************************************************
3 Jeema
 
16.10.12
05:11
помогите!!!)))
4 maip1
 
16.10.12
05:21
видимо, надо не выбзнач.текущаястрока() = ">", а выбзнач.получитьзначение(выбзнач.текущаястрока()) = ">", и т.д.
5 Jeema
 
16.10.12
05:45
щас проверю
6 Jeema
 
16.10.12
06:03
спасибо, ребята получилось)))
7 Sserj
 
16.10.12
06:30
Вообще то если речь о "Торговля И Склад", а судя по всему о ней, то намного правильней использовать регист "Продажи", это регистр оборотов и выполняться все будет на много быстрее.
8 Jeema
 
16.10.12
06:37
SSerj - верно, спасибо! Ну если что спрошу ;)
9 Jeema
 
16.10.12
06:43
SSerj - простите, а где его использовать? подскажите где ставить "использовать регист "Продажи", это регистр оборотов и выполняться все будет на много быстрее." в моем коде?
10 Jeema
 
16.10.12
08:47
Подскажите где ставить "использовать регист "Продажи", это регистр оборотов и выполняться все будет на много быстрее." в моем коде? Плииз!!!
11 apl1978
 
16.10.12
09:05
(10) вот здесь
  |ПЕРИОД С ДатаНачала По ДатаКонца;
   |Фирма        = Регистр.ОстаткиНаСкладах.Склад.Фирма;
   |Склад        = Регистр.ОстаткиНаСкладах.Склад;
   |Номенклатура = Регистр.ОстаткиНаСкладах.Товар;
   |Сумма        = Регистр.ОстаткиНаСкладах.Сумма;

переписать все на регистр Продажи
12 dk
 
16.10.12
09:13
в продажах нет остатков
КонОст
13 Jeema
 
16.10.12
09:16
спасибо большое!
14 apl1978
 
16.10.12
09:17
(12) очевидно, для его задачи КонОст и не нужен
15 Jeema
 
16.10.12
09:26
хотя там стоит же |КодОперации  = Регистр.ОстаткиНаСкладах.КодОперации;  и походу будет конфликтовать
16 apl1978
 
16.10.12
09:29
(15) а ты весь запрос перепиши. посмотри, например, в типовом Анализе продаж как количество тянется из запроса. у регистров разного типа и фишки разные :)
|Количество  = Регистр.Продажи.Количество;
|Функция СуммаКоличество  = Сумма(Количество);
а потом эту СуммаКоличество и анализируй
17 apl1978
 
16.10.12
09:32
(15) А кстати да. Я че-то вообще это условие в твоем запросе не понял:
"Условие (КодОперации<>Перечисление.КодыОпераций.Продажа);"
то-есть ты берешь любое движение товаров кроме продажи? Тогда как это согласуется с " товар не продавался или продавалось менее заданного количества"?
18 viktor_vv
 
16.10.12
09:32
Вот это условие в искодном запросе работает совсем не так, как ты думаешь.

"Условие(количество>колво);";  

См. (16).
19 Jeema
 
16.10.12
09:43
Тогда мне надо переименовать на "Условие (КодОперации<>Перечисление.КодыОпераций.ПЕРЕМЕЩЕНИЕ);" - ?
20 Jeema
 
16.10.12
09:50
Вот это условие в искодном запросе работает совсем не так, как ты думаешь.

"Условие(количество>колво);";  

См. (16). - а как?
21 apl1978
 
16.10.12
09:51
(19) зачем? оно просто тебе не будет нужно
просто перепиши все на Продажи. в регистре продаж содержатся движения по всем проданным товарам. ну, правда, еще по возвратам, но по ним не стоит пока заморачиваться.
22 viktor_vv
 
16.10.12
10:01
(20) отбирает отдельные записи в регистре с количеством в движении удовлетворяющим условию. Так что в итоге в твоем запросе должна была получится полная фигня в функциях. На остатки это вроде не должно было повлиять, по крайней мере на начальные, но в оборотах точно фигня.
23 viktor_vv
 
16.10.12
10:03
И таки условие на результат функции не получится поставить в запросе, поэтому отбирай уже после, в обходе.
24 Jeema
 
16.10.12
10:08
походу вы не поняли... нужно так, чтоб табл. показывала остатки товара на складах не товары проданные, ну например, менее 10...или более 10, так же и товары проданные. А так код показывает весь ассортимент товаров в складе менее 10...или более 10 (по выбору лог.знака)
25 Jeema
 
16.10.12
10:09
хммм
26 apl1978
 
16.10.12
10:10
в (0) про остатки товара ни слова не написано. наоборот - написано про продажи
27 sidalexsandr
 
16.10.12
10:15
(0) Убери из группировка Количество;
Останется так |Группировка Номенклатура без групп;";
28 viktor_vv
 
16.10.12
10:15
Ты проверь свои результаты другим каким-нибудь отчетом, тупо выбрав из него руками подходящие под усоловие позиции.
29 Jeema
 
16.10.12
10:28
(0) Убери из группировка Количество;
Останется так |Группировка Номенклатура без групп;"; - уже убрал, тогда еще, сразу после выложения кода
30 Jeema
 
16.10.12
10:30
щас так:

Перем Запрос, ТекстЗапроса;
//*******************************************
Процедура Сформировать()                              
   //инициация таблицы
   Таблица = СоздатьОбъект("Таблица");
   Таблица.ИсходнаяТаблица("Таблица");
   Таблица.Опции(0,0,0,0);
   Таблица.ВывестиСекцию("Шапка");
   НомСтроки = 0;                                                  
   //конец инициации    
   
   //формирование запроса
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса="    
   |ПЕРИОД С ДатаНачала По ДатаКонца;
   |Фирма        = Регистр.ОстаткиНаСкладах.Склад.Фирма;
   |Склад        = Регистр.ОстаткиНаСкладах.Склад;
   |Номенклатура = Регистр.ОстаткиНаСкладах.Товар;
   |Сумма        = Регистр.ОстаткиНаСкладах.Сумма;
   |Количество   = Регистр.ОстаткиНаСкладах.Количество;
   |ЦенаПрод     = Регистр.ОстаткиНаСкладах.ЦенаПрод;
   |КодОперации  = Регистр.ОстаткиНаСкладах.КодОперации;                  
   |";
   //*****************************************************************    

   //*****************************************************************
       ТекстЗапроса = ТекстЗапроса + "
                 
       |Группировка Номенклатура без групп;";                                                                    
                                 
       ТекстЗапроса = ТекстЗапроса +      
       
       "Функция НачКоличество     = НачОст(Количество);"
       "Функция ПрихКоличество  = Приход(Количество);"
       "Функция РасхКоличество  = Расход(Количество);"
       "Функция КонКоличество     = КонОст(Количество);"
       "Условие (КодОперации<>Перечисление.КодыОпераций.Продажа);"
       "Условие (КодОперации<>Перечисление.КодыОпераций.Перемещение);"
       "";
   //********************************************************************    
     
   //********************************************************************    
   Если ВыбСклад.Выбран() = 1 Тогда        
       ТекстЗапроса = ТекстЗапроса +        
       "Условие (Склад = ВыбСклад);";
   КонецЕсли;
   
   Если ВыбНом.Выбран() = 1 Тогда
       ТекстЗапроса = ТекстЗапроса +        
       "Условие (Номенклатура = ВыбНом);";
   КонецЕсли;
   
   Если ВыбФирма.Выбран() = 1 Тогда
       ТекстЗапроса = ТекстЗапроса +
       "Условие (Фирма = ВыбФирма);";                                  
   
   КонецЕсли;
   
   //*****************************************************************************************      
         
        Если колво>0 тогда
                                                                       
           если выбзнач.получитьзначение(выбзнач.текущаястрока()) = ">" тогда  
               ТекстЗапроса = ТекстЗапроса +
               "Условие(количество>колво);";           //оператор1
                                                       
           Иначеесли   выбзнач.получитьзначение(выбзнач.текущаястрока()) = "<" тогда  
               ТекстЗапроса = ТекстЗапроса +
               "Условие(количество<колво);";            //оператор2
               иначеесли   выбзнач.получитьзначение(выбзнач.текущаястрока()) = "=" тогда  
               ТекстЗапроса = ТекстЗапроса +
               "Условие(количество=колво);";        //оператор3
           конецесли
               
       Конецесли;

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

//******************************************************************************
  Процедура ПриОткрытии()
   ВыбЗнач.добавитьзначение("<",);
   ВыбЗнач.добавитьзначение(">",);                
   ВыбЗнач.добавитьзначение("=",);
   ВыбФирма = глЗначениеПоУмолчанию("Фирма");
   ВыбСклад= глзначениеПоУмолчанию("Склад");
   ДатаКонца   = ПолучитьДатуТА();
   ДатаНачала  = НачМесяца(ПолучитьДатуТА());  
   КонецПроцедуры

   //Если Условие <> "< Не выбран >" Тогда
   //    ТекстЗапроса = ТекстЗапроса +
   //    "Условие ("+Условие+"ЗначениеУсловия);";
   //КонецЕсли;    
                               
Процедура тст()
     сообщить(выбзнач.текущаястрока());    
конецпроцедуры
  Процедура выбзнач()
     сообщить(выбзнач.текущаястрока());    
конецпроцедуры
//******************************************************************************      


//********************************************************************************
31 sidalexsandr
 
16.10.12
10:38
(0) Для того чтобы тебе было понятнее что какие данные получил запрос выгрузи весь запрос в таблицу значений. Дальше ты сможеш просмотреть все данные в запроса таблице значений и уже осмысленно выводить данные которые выбрал запрос.

Вот так можно выгрузить весь запрос в ТаблицуЗначений и просмотреть ТаблицуЗначений:

ТЗ = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗ);
ТЗ.ВыбратьСтроку(1);
32 Jeema
 
16.10.12
10:45
ок
33 Cthulhu
 
16.10.12
11:59
Выкинь кусловия на к-во из запроса к едрене фене, анализируй и фильтруй при обработке результатов запроса.
(блин, ну что за какая-то необъяснимая тяга к запихиванию в запросы причудливых фильтров и внешних функций, ну не будет оно в итоге(!) обрабатываться быстрее, не-бу-дет!.. запрос должен отработать быстро и дать все необходимое в результате, чтобы потом в этом необходимом копаться как будда на душу положит и вытаскивать что душе угодно и как ей же угодно!.. упор на максимальную фильтрацию дает выигрыш по итоговым(!) скоростям только при использовании прямых запросов, да и то не всегда)