Имя: Пароль:
1C
1C 7.7
v7: условие в запросе
, ,
0 Bahon
 
14.09.12
11:51
|Товар = Регистр.ОстаткиТоваров.Товар;
   |Каталог = Регистр.ОстаткиТоваров.Товар.Каталог;
   |Склад = Регистр.ОстаткиТоваров.Склад;
   |Кол = Регистр.ОстаткиТоваров.ОстатокТовара;
       |Функция КонКол = КонОст(Кол);
как взять только те товары, в которых КонКол>0

условие типа Запрос.конкол>0 не правильно выводит...
без условия выводит все товары, а мне надо те товары которые конечный остаток больше нуля
1 Bahon
 
14.09.12
13:21
Неужели никто не может помочь?
2 1Сергей
 
14.09.12
13:32
он и так покажет только не нулевые
3 Bahon
 
14.09.12
13:43
если бы так...
4 expertus
 
14.09.12
13:46
(3) либо это так, либо ты не весь запрос скопипастил.
5 1Сергей
 
14.09.12
13:46
(3) ну, дык покажи весь запрос
6 1Сергей
 
14.09.12
13:47
Блин, Баха. Не узнал тебя, привет! :)
7 Bahon
 
14.09.12
13:49
Привет

       |Период С ДатаОтчета По ДатаОтчета;
   |Обрабатывать НеПомеченныеНаУдаление;
   |Товар = Регистр.ОстаткиТоваров.Товар;
   |НомерОрдина = Регистр.ОстаткиТоваров.Ордин;
   |Каталог = Регистр.ОстаткиТоваров.Товар.Каталог;
   |Склад = Регистр.ОстаткиТоваров.Склад;
   |КодИБ = Регистр.ОстаткиТоваров.Склад.КодПерБазы;
   |Кол = Регистр.ОстаткиТоваров.ОстатокТовара;
   |"+?(((флТенге=0)И(флВалюта=0))или(РежЦ>1),"","
   |БазСто = Регистр.ОстаткиТоваров.БазоваяСтоимость;
   |ВалСто = Регистр.ОстаткиТоваров.ВалютнаяСтоимость;
   |Функция БазСто1 = КонОст(БазСто);
   |Функция ВалСто1 = КонОст(ВалСто);")+"
   |Функция КонКол = КонОст(Кол);";


         Если ВыбФирма.Выбран()=1 Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |Фирма = Регистр.ОстаткиТоваров.Фирма;
       |Условие (Фирма в ВыбФирма);";
   КонецЕсли;
   Если ТекРежимВыбора=1 Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |Условие (Товар в ВыбТовар2);
       |Условие (Склад в ВыбСклад2);";
   Иначе
       ТекстЗапроса=ТекстЗапроса+"
       |Условие (Товар в ВыбТовар);
       |Условие (Склад в ВыбСклад);";  
   КонецЕсли;    
   ТекстЗапроса=ТекстЗапроса+"    
   |Условие (Каталог в ВыбКаталог);
   |Условие (НомерОрдина в ВыбПартии);
   |Группировка Товар упорядочить по Товар.Наименование;
   |Группировка НомерОрдина упорядочить по НомерОрдина.Наименование;
   |Группировка Склад упорядочить по Склад.Код Все ВошедшиеВЗапрос;
8 expertus
 
14.09.12
13:51
Дай угадаю. Задача найти товары, у которых списано количество, но не списана себестоимость?
9 Bahon
 
14.09.12
13:52
я в отчете хочу лишние товары без остатков убрать...
10 1Сергей
 
14.09.12
13:52
(8) нет, там дело куда серьёзнее
11 expertus
 
14.09.12
13:54
(9) в базе есть косяки с себестоимостью, и ты условием хочешь эти косяки замаскировать?
12 Bahon
 
14.09.12
14:00
(11)дело в количестве, отчет выводит все товары с регистра, я хочу отфильтровать и нулевые товары убрать, зачем они в отчете
13 Boroda
 
14.09.12
14:06
Тут наверное в строке с нулевым количеством или БазСто1, или ВалСто1 не равны нулю. Вот и выводит..
14 Bahon
 
14.09.12
14:07
пробовал в ТЗ выгрузить, но там все перелопатить надо, лучше конечно изначально в запросе сразу ненулевые выбрать
15 1Сергей
 
14.09.12
14:08
(13) там при определённых условиях

   |"+?(((флТенге=0)И(флВалюта=0))или(РежЦ>1),"","
   |БазСто = Регистр.ОстаткиТоваров.БазоваяСтоимость;
   |ВалСто = Регистр.ОстаткиТоваров.ВалютнаяСтоимость;
   |Функция БазСто1 = КонОст(БазСто);
   |Функция ВалСто1 = КонОст(ВалСто);")+"

вообще не вставляется в запрос, но всё-равно выходят строки с количеством = 0

  |Функция КонКол = КонОст(Кол);";
16 1Сергей
 
14.09.12
14:09
(14) попробуй поудалять всё лишнее из текста запроса.


   |Каталог = Регистр.ОстаткиТоваров.Товар.Каталог;

   |КодИБ = Регистр.ОстаткиТоваров.Склад.КодПерБазы;

вот это не нужно
17 Boroda
 
14.09.12
14:11
Попробуй уберать вот это:
...Все ВошедшиеВЗапрос;
и чтобы не попадали в запрос строки
|Функция БазСто1 = КонОст(БазСто);
|Функция ВалСто1 = КонОст(ВалСто);")+"
18 Bahon
 
14.09.12
14:20
не получается, дело не в них...
|Функция БазСто1 = КонОст(БазСто);
|Функция ВалСто1 = КонОст(ВалСто);
они действуют если галочки на стоимости, да и колонку выводят...
а я без галочек
19 Boroda
 
14.09.12
14:25
А "Все ВошедшиеВЗапрос" пробовал убирать?
20 Bahon
 
14.09.12
14:26
пробовал... безрезультатно
21 Boroda
 
14.09.12
14:29
Ну тогда убери "|Обрабатывать НеПомеченныеНаУдаление;" - для регистра это неактуально.
22 Bahon
 
14.09.12
14:31
удалил, хотя вряд ли это поможет
23 Boroda
 
14.09.12
14:33
Просто выполни сперва вот такой запрос:
ТекстЗапроса = "
|Товар = Регистр.ОстаткиТоваров.Товар;
|Кол = Регистр.ОстаткиТоваров.ОстатокТовара;
|Функция КонКол = КонОст(Кол);
|Группировка Товар";

100% не должен нулевые остатки показывать. Ну а дальше добавляй потихоньку строки... :)
24 Boroda
 
14.09.12
14:36
Чтоб быстрее работало период, пока на этапе тестирования, не задавай.
Я обычно прямо на форму временно кладу тз и делаю выгрузку результатов в него. Ну а потом уже "рюшечки" :)
25 Bahon
 
14.09.12
14:38
а как быть с этим

   Запрос.ВНачалоВыборки();    

   Пока Запрос.Группировка(1)=1 Цикл        //* по товарам
       Если Запрос.Товар.ЭтоГруппа()=1 Тогда
           ОВывестиСекцию("Группа","Основная",Запрос,Таб);
           Если (РежЦ=2)И((флТенге<>0)ИЛИ(флВалюта<>0)) Тогда
               ОВывестиСекцию("Группа","Цены",Запрос,Таб);
           КонецЕсли;
       КонецЕсли;
       Пока Запрос.Группировка(2)=1 Цикл    //* по ординам        
           Если Запрос.НомерОрдина.ЭтоГруппа()=1 Тогда
               Продолжить;
           КонецЕсли;
           КолСкладов=0;
           ТекСклад=0;
           Если Запрос.Товар.ЭтоГруппа()=0 Тогда
               Резерв = Регистр.РезервыТоваров.СводныйОстаток(Запрос.Товар, Запрос.НомерОрдина, , , "РезервТовара");
               ОВывестиСекцию("Товар","Основная",Запрос,Таб);
               Если (РежЦ=2)И((флТенге<>0)ИЛИ(флВалюта<>0)) Тогда
                   ЦенВал=ЦенаПоОрдину(Запрос.Товар,Запрос.НомерОрдина,ДатаОтчета);
                   //ЦенВал2=ЦенВал-Скидка(Запрос.Товар,Запрос.НомерОрдина,ЦенВал);
                   //* получим скидку
                   СкидкаМакс=0;
                   СкидкаМаксСум=0;
                   глСкидка(Контекст,,Запрос.Товар,Запрос.НомерОрдина,,1,,,,ДатаОтчета,Константа.ОсновнаяВалюта,ТекущаяДата(),Константа.ОснВидАкции.Получить(ДатаОтчета),0,,СкидкаМакс,СкидкаМаксСум,,,,);
                   Если (СкидкаМакс=0)И(СкидкаМаксСум<>0) Тогда
                       // в данной ситуации скидка задана в денежном эквиваленте
                       ЦенВал2=ЦенВал-СкидкаМаксСум;
                   Иначе
                       // в данной ситуации скидка задана в процентах
                       ЦенВал2=ЦенВал*(100-СкидкаМакс)/100;
                   КонецЕсли;
                   ОВывестиСекцию("Товар","Цены",Запрос,Таб);
               КонецЕсли;
           КонецЕсли;
           Пока Запрос.Группировка(3)=1 Цикл    //* по складам
       
               Если Запрос.Склад.ЭтоГруппа()=1 Тогда
                   Продолжить;
               КонецЕсли;
               КолСкладов = КолСкладов + 1;
               Если Запрос.Товар.ЭтоГруппа()=1 Тогда
                   ОВывестиСекцию("Группа","Склад",Запрос,Таб);
               Иначе
                   Если Запрос.КонКол=0  Тогда    
                       
                   Иначе                          
                         //Сообщить("Товар -"+ТЗ.Товар +", Остаток - "+ ТЗ.КонКол);
                       НС=0;                        
                       Если ТаблицаИтогов.НайтиЗначение(Запрос.Склад,НС,"Склад")=1 Тогда
                           ТаблицаИтогов.ПолучитьСтрокуПоНомеру(НС);
                           ТаблицаИтогов.Количество = ТаблицаИтогов.Количество + Запрос.КонКол;
                       КонецЕсли;
                       Если флТенге=1 Тогда
                           Если РежЦ=1 Тогда
                               СумТен=Формат(Запрос.БазСто1*КоэфНДС,"Ч017.2.,");
                               ТаблицаИтогов.СумТен = ТаблицаИтогов.СумТен + Запрос.БазСто1*КоэфНДС;
                           ИначеЕсли РежЦ=2 Тогда
                               СумТен=Формат(ЦенВал*Запрос.КонКол*КоэфНДС*КурсЕвро,"Ч017.2.,");
                               ТаблицаИтогов.СумТен = ТаблицаИтогов.СумТен + ЦенВал*Запрос.КонКол*КоэфНДС*КурсЕвро;
                           КонецЕсли;
                       КонецЕсли;
                       Если флВалюта=1 Тогда
                           Если РежЦ=1 Тогда
                               СумВал=Формат(Запрос.ВалСто1*КоэфНДС,"Ч017.2.,");
                               ТаблицаИтогов.СумВал = ТаблицаИтогов.СумВал + Запрос.ВалСто1*КоэфНДС;
                           ИначеЕсли РежЦ=2 Тогда
                               СумВал=Формат(ЦенВал*Запрос.КонКол*КоэфНДС,"Ч017.2.,");
                               ТаблицаИтогов.СумВал = ТаблицаИтогов.СумВал + ЦенВал*Запрос.КонКол*КоэфНДС;
                           КонецЕсли;
                       КонецЕсли;                        
                   КонецЕсли;
                   ОВывестиСекцию("Товар","Склад",Запрос,Таб);
               КонецЕсли;
           КонецЦикла;
           Если флСостав=1 Тогда
               Если Найти(Врег(Запрос.НомерОрдина.Наименование),"ZKC")>0 Тогда
                   Состав=глПолучитьСоставПродукции(Запрос.НомерОрдина,Запрос.Товар,ДатаОтчета);
                   //Состав.ВыбратьСтроку();
                   Состав.ВыбратьСтроки();
                   Пока Состав.ПолучитьСтроку()=1 Цикл
                       ОВывестиСекцию("Комплектующее","Основная",Запрос,Таб);
                       Если (РежЦ=2)И((флТенге<>0)ИЛИ(флВалюта<>0)) Тогда
                           ЦенВал=Состав.Сумма/Состав.Количество;
                           ЦенВал2=(Состав.Сумма-Состав.Скидка)/Состав.Количество;
                           ОВывестиСекцию("Комплектующее","Цены",Запрос,Таб);
                       КонецЕсли;
                       Для Идн=1 По КолСкладов Цикл
                           Если Идн=ТекСклад Тогда
                               КолКомплектующих=Состав.Количество;
                               Если РежЦ>1 Тогда
                                   СумТен=Формат(Состав.Сумма*Константа.ОсновнаяВалюта.Текущ_курс.Получить(ДатаОтчета),"Ч017.2.,");
                                   СумВал=Формат(Состав.Сумма,"Ч017.2.,");
                               Иначе
                                   СумТен=Формат(Состав.СебестоимостьБаз,"Ч017.2.,");
                                   СумВал=Формат(Состав.СебестоимостьВал,"Ч017.2.,");
                               КонецЕсли;
                           Иначе
                               КолКомплектующих=0;
                               СумТен="";
                               СумВал="";
                           КонецЕсли;
                           ОВывестиСекцию("Комплектующее","Склад",Запрос,Таб);
                       КонецЦикла;
                   КонецЦикла;
               КонецЕсли;
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
26 Bahon
 
14.09.12
14:41
я пробовал конечно, после запроса ненулевые отшлифовать, но надо именно в запросе как то ненулевые товары взять
27 Boroda
 
14.09.12
14:44
Ну ты сделал запрос из (23)?
Если сделал и нулей нет, то дальше добавляем след.группировку: "Ордин"
Опять смотрим тз и должны видеть что нулей нет!
28 Bahon
 
14.09.12
14:50
хотя на конец месяца нули исчезают
29 Bahon
 
14.09.12
14:52
(28) это я к тому что может не надо(27) а то в табличке хватает колонок и строк, начнет щя ругаться...
30 Boroda
 
14.09.12
14:54
Табличка "ругаться" не будет - ей положено выводить колонки.
31 Cthulhu
 
14.09.12
14:55
пихать в запрос то, что можно отшелушивать при выборке результатов, следует только в случаях, когда в результате впихивания время выполнения запроса существенно не увеличится при существенном снижении объемов получаемых запросом данных.
это - не тот случай.
32 Ochkarito
 
14.09.12
14:57
|Функция КонКол = КонОст(Кол) Когда (Кол > 0);
33 Cthulhu
 
14.09.12
15:01
(32): и в группировке, в которой участвуют Кол +5,-7,+3 вместо +1 получишь +8... оно тебе надо?..
34 Boroda
 
14.09.12
15:07
Действительно, при выставлении периода появляются товары с нулевыми строками...
Ну тогда, может, просто проигнорировать эти строки в момент вывода в печать?
35 Cthulhu
 
14.09.12
15:08
(34): именно. см.(31).
36 Bahon
 
14.09.12
15:08
вот теперь начинаете понимать...
37 1Сергей
 
14.09.12
15:09
(35) там лишние группы выводятся тогда
38 Bahon
 
14.09.12
15:10
(29)
39 1Сергей
 
14.09.12
15:11
(31) ты объясни лучше, почему туда вообще нулевые попадают. По идее не должны
40 Bahon
 
14.09.12
15:17
(34) Как? там же группировки стоят
41 Bahon
 
14.09.12
15:26
(39)по идее да, потому что нулевые списанные. Их вообще в регистре не должно быть....
42 Bahon
 
14.09.12
15:41
(33) и условие запрос.конкол>0 также работает как и кол>0, почему?
43 Boroda
 
14.09.12
17:18
В общем, посмотрел я прямым запросом свой итоговый регистр "ОстакиТМЦ" , структура такая же как и в типовой.
Пример: У меня нулевые остатки появляются по Товару1.
Анализ записей итогового регистра по этому товару дал следующие записи:
Фирма1 Товар1 Склад1 ЦенаПрод1 180
Фирма2 Товар1 Склад1 ЦенаПрод1 -180
т.е. пересорт по фирме - некорректное закрытие регистра по данному товару.
Посмотри вот этим запросом остатки по товару по которым нулевые остатки, но выводятяся в результат запроса.
   РегОбщ = СоздатьОбъект("Регистры");
   РегОстатки = РегОбщ.ОстаткиТМЦ;
   РегОстатки.УстановитьЗначениеФильтра("Номенклатура", ВыбНоменклатура, 1);
   РегОстатки.ВыгрузитьИтоги(тз,1,1);
Возможно, по какому то измерению идет пересорт.