Имя: Пароль:
1C
1C 7.7
v7: Ещё раз запрос
0 ВежливаяТварь
 
28.10.11
11:04
Добрый день уважаемые форумчане. Есть запрос
Запрос=СоздатьОбъект ("Запрос");
   ТекстЗапроса =
   "Период с Дата1 по Дата2;
   |СсылкаНаСчет=Регистр.РезервыТоваров.ПоСчету;
   |Товар =Регистр.РезервыТоваров.Товар;
   |Количество = Регистр.РезервыТоваров.РезервТовара;
   |Функция КолПриход = Приход(Количество);
   |Группировка Товар;
   |";

В этот запрос должны входить только счета у которых четвёртая буква в номере "А"(например:SIMA, FEDA, YALA). Можно ли это условие указать в запросе? И если можно то как?
1 ДенисЧ
 
28.10.11
11:06
Функция МойНомер(док)
 Возврат ?(Сред(док.НомерДок, 4, 1)="А", 1, 0);
КонецФункции

Условие(МойНомер(Запрос.СсылкаНаСчет)=1);

Что-то вроде такого
2 ВежливаяТварь
 
28.10.11
11:13
Спасибо.Попробую.
3 ВежливаяТварь
 
28.10.11
11:27
Заработало. Огромное спасибо.
4 Злопчинский
 
28.10.11
11:30
но такая функция, по идее, напрочь "убивает" запрос... ничем от простой выборки отличаться не будет...?
5 viktor_vv
 
28.10.11
11:45
По идее вот так должно тоже работать, и  может быть даже быстрее, чем через функцию.

|СсылкаНаСчет=Регистр.РезервыТоваров.ПоСчету;
|НомерСчета = Регистр.РезервыТоваров.ПоСчету.НомерДок;
|Условие (Сред(НомерСчета, 4, 1)=""А"");
6 ДенисЧ
 
28.10.11
11:46
(5) Да тоже самое...
7 viktor_vv
 
28.10.11
11:54
(6) Не проверял. Просто есть надежда, что при наложении условия номер не дергает из базы каждый раз, а берет из сырого результата запроса . Хотя до конца не понятно как вот это получает НомерСчета = Регистр.РезервыТоваров.ПоСчету.НомерДок; . Джойнит журнал в запросе или опять же постфактум дергает.
Ну это так, чисто порассуждать :).
8 Cthulhu
 
28.10.11
11:55
перебором быстрее.
9 Sh1ko
 
28.10.11
12:22
Что быстро было, можно по счетам пробежаться, проставить какой-то реквизит, а в запросе условие по реквизиту.
10 viktor_vv
 
28.10.11
12:55
(7)+ Это я как-то слишком оптимистично :). Поглядел, согласен с (6), в профайлере там вообще мрак. Более того, если тип значения измерения ПоСчету документ общего вида, то (5) вообще не работает, ошибку не выдает, но НомерДок пустой получается.
11 ВежливаяТварь
 
28.10.11
16:47
Эщё один вопрос возник. Этот запрос вытаскивает и группирует все виды товаров и выводит товар и количество(СсылкаНаСчет не мешает группировке?). И как сделать так что бы запрос выдавал ещё и группировку по СсылкаНаСчет? можно дописать этот или лучше отдельный запрос?
12 Sh1ko
 
28.10.11
16:48
Лучше этот
13 ДенисЧ
 
28.10.11
16:48
(11) кто мешает сделать вторую группировку?
14 ВежливаяТварь
 
28.10.11
16:54
Попробовал выдаёт ошибку что нельзя обходить верхние группировки. А если одним запросом то У меня два одинаковых товара же не смогут сгруппироваться если у них разные ссылки на счет?
15 viktor_vv
 
28.10.11
16:55
Так ты как обходишь ?
16 ДенисЧ
 
28.10.11
16:56
Группировка Товар;
Группировка СсылкаНаСчет;


И обходить
Пока Запрос.Группировка("Товар") = 1
//здесь итоги по товару
 Пока Запрос.Группировка("ССылкаНаСчет") = 1
//здесь по товару и счету.
 КонецЦикла;
КонецЦикла;
17 ВежливаяТварь
 
28.10.11
17:02
А можно сделать так что бы сначала обойти вытащить все сгруппированные товары, а потом все сгруппированные ссылки на счет.
Глобальная задача у меня такая: Нужно за указанную дату обойти все счета, вытянуть только с четвертой буквой А и все товары которые в них находятся сгруппировать и поместить в одну расходную накладную. Потом все эти счета удалить

Сделал так но работает криво:
Запрос=СоздатьОбъект ("Запрос");
   ТекстЗапроса =
   "Период с Дата1 по Дата2;
   |СсылкаНаСчет=Регистр.РезервыТоваров.ПоСчету;
   |Товар =Регистр.РезервыТоваров.Товар;
   |Количество = Регистр.РезервыТоваров.РезервТовара;
   |Функция КолПриход = Приход(Количество);
   |Условие(МойНомер(Запрос.СсылкаНаСчет)=1);
   |Группировка Товар;
   |";    
....

Пока Запрос.Группировка("Товар")=1 Цикл  
       Если Запрос.Товар.ЭтоГруппа()=0 Тогда
           ДокСчет.НоваяСтрока();
           ДокСчет.Товар=Запрос.Товар;
           ДокСчет.Количество=Запрос.КолПриход;
           глПриИзмененииТовара(ДокСчет);
       КонецЕсли;
   КонецЦикла;  
   ДокСчет.Записать();    
   ДокСчет.Провести();
   ОткрытьФорму(ДокСчет.ТекущийДокумент());
     
   Запрос.вНачалоВыборки();
   Пока Запрос.Группировка()=1 Цикл
       Если ПустоеЗначение(Запрос.СсылкаНаСчет)=0 Тогда
           Сообщить (Запрос.СсылкаНаСчет);
           СсылкаНаДокумент=Запрос.СсылкаНаСчет;
           ДокСчет.НайтиДокумент(СсылкаНаДокумент);
           ДокСчет.ПравоНаУдаление=1;
           ДокСчет.Записать();
           ДокСчет.Удалить(0);  
       КонецЕсли;
   КонецЦикла;
18 ДенисЧ
 
28.10.11
17:04
ТОгда группируй в обратном порядке. Сначала счета, потом товары.
19 FN
 
28.10.11
17:07
(17) сначала сделай запрос к докам - результат загони в список
потом второй запрос к строкам доков (условие по списку из первого запроса) с группировкой товар и функциями Кол-во, Сумма и тп.
20 ВежливаяТварь
 
28.10.11
17:09
Ага понял. Спасибо. Сейчас попробую.
21 FN
 
28.10.11
17:11
(19)+ хотя первый запрос наверное лучше заменить на обычную выборку - быстрее должно быть.
22 FN
 
28.10.11
17:15
(20) и на будущее - не стоит кодировать в номере док-та информацию, по которой потом нужны отборы. Лучше отдельным реквизитом.
23 ВежливаяТварь
 
28.10.11
17:18
Спасибо. Учту.