Имя: Пароль:
1C
 
Запрос на выборку уникальных записей
0 yegorka
 
14.07.10
09:07
Подскажите как сделать чтобы в запросе выбирались только уникальные записи?
Запрос такой:
=====================================================================
   ТекстЗапроса =
       "//{{ЗАПРОС(ВыбратьДоки)
       |Период с ДатаНачала по ДатаКонца;
       |Контр = Документ.Реализация.Получатель;
       |Регион = Документ.Реализация.Получатель.Город;
       |Подгруппа = Документ.Реализация.Получатель.Родитель;
       |Функция Счётчик = Счётчик();
       |Группировка Регион;";  

       УсловиеЗапроса = "
               |Условие(Подгруппа = Кат);
               |ОбрабатыватьДокументы Проведенные;
               |"//}}ЗАПРОС
               ;

=====================================================================
Смысл в том, что нужно по документам посчитать сколько клиентов отоварились с группировкой по региону. Естественно, в эту выборку попадает один клиент столько раз сколько он отгружался. Как выбрать уникальных клиентов ("Контр")?
Пожелания: не предлагать ввести вторую группировку по "Контр"
1 chelentano
 
14.07.10
09:08
(0) считай количество потом
2 yegorka
 
14.07.10
09:09
Поподробнее, плиз. Выгружать в ТЗ???
3 chelentano
 
14.07.10
09:12
(2) можно и в ТЗ
4 DrZombi
 
гуру
14.07.10
09:13
(0)Прямой запрос не предлагать ;) (?)
5 yegorka
 
14.07.10
09:14
Предлагать
6 Ёпрст
 
гуру
14.07.10
09:15
(0) добавить группировку по Контр и выкинуть нелепую переменную Подгруппа из текста запроса
7 yegorka
 
14.07.10
09:16
Она на нелепая, очень нужная мне -- мне нужно в отчете группы справочника. И иерархия должна соблюдаться.
8 yegorka
 
14.07.10
09:17
Т.е. фактически это еще одна "не лепая" группировка. Но так справочник организовали.
9 PaulBC
 
14.07.10
09:18
(7) Условие(Контр В Кат);
10 yegorka
 
14.07.10
09:20
2 PaulBC: не понял, это чтоб выбрать уникальные, или чтоб избавиться от нелепой переменной??
11 Ёпрст
 
гуру
14.07.10
09:23
(7) они и так будут:

 ТекстЗапроса =
       "//{{ЗАПРОС(ВыбратьДоки)
       |Период с ДатаНачала по ДатаКонца;
       |Контр = Документ.Реализация.Получатель;
       |Регион = Документ.Реализация.Получатель.Город;
       |Функция Счётчик = Счётчик();
       |Группировка Регион;
       |Группировка Контр;
       |Условие(Подгруппа = Кат);
       |"//}}ЗАПРОС
12 Ёпрст
 
гуру
14.07.10
09:23
ТекстЗапроса =
       "//{{ЗАПРОС(ВыбратьДоки)
       |Период с ДатаНачала по ДатаКонца;
       |Контр = Документ.Реализация.Получатель;
       |Регион = Документ.Реализация.Получатель.Город;
       |Функция Счётчик = Счётчик();
       |Группировка Регион;
       |Группировка Контр;
       |Условие(Контр в Кат);
       |"//}}ЗАПРОС
13 Ёпрст
 
гуру
14.07.10
09:24
копи-пасте сгубит..
14 yegorka
 
14.07.10
09:26
Сейчас проверю
15 yegorka
 
14.07.10
09:36
Дело в том что при второй группировке запрос орет "не было обращения к старшим уровням выборки". А мне как бы и не нужно к уровню "Контр" обращаться. Как обойти?
16 yegorka
 
14.07.10
09:39
Да и к тому же результаты моего первого и вашего предложенного не отличаются. Значит опять не уникальные попадают в выборку
17 Ёпрст
 
гуру
14.07.10
09:39
(15)

...
Запрос.Выполнить("ТекстЗапроса");
Пока Запрос.Группировка(1) = 1 Цикл
  Сообщить("Запрос.Регион");  
  Пока Запрос.Группировка(2) =1 Цикл
        Сообщить("Запрос.Контр");
                   ..........
18 yegorka
 
14.07.10
09:49
С двуми группировками фигня в результатах запроса.
Мне нужен отчет такого вида:
==========================================================================
ЭлементГруппыСправочника01
  ЗначениеГруппировкиПоРегиону01_УникальныеПолучатели
  ЗначениеГруппировкиПоРегиону02_УникальныеПолучатели
  ...
ЭлементГруппыСправочника02
  ЗначениеГруппировкиПоРегиону01_УникальныеПолучатели
  ЗначениеГруппировкиПоРегиону02_УникальныеПолучатели
  ...
...
19 Ёпрст
 
гуру
14.07.10
09:55
(18)  Это как ?

сейчас, ежели как в (17) у тебя так:

регион - Васюки
  группа Клиентосы
        Вася
        Федя
  группа Прочие клиентосы
        Маша
        Таня
регион - Ебунёво        
  группа Клиентосы
       Семён
       Евлампий
  группа Поставщики
       Ромашка


Ежели поменяешь группировки местами, будет

  группа Клиентосы
        Вася
           регион - Васюки
        Федя
           регион - Васюки
        Семён
           регион - Ебунёво        
        Евлампий
           регион - Ебунёво        
  группа Прочие клиентосы
        Маша
           регион - Васюки
        Таня
           регион - Васюки
  группа Поставщики
       Ромашка
           регион - Ебунёво        


а что тебе нужно - хз.
20 yegorka
 
14.07.10
09:56
Вот запрос:
================================================================================
   ТекстЗапроса =
       "//{{ЗАПРОС(ВыбратьДоки)
       |Период с ДатаНачала по ДатаКонца;
       |Контр = Документ.Реализация.Получатель;
       |Регион = Документ.Реализация.Получатель.Город;
       |Функция Счётчик = Счётчик();
       |Группировка Регион;";  

       УсловиеЗапроса = "
               |Условие(Контр В Кат);
               |ОбрабатыватьДокументы Проведенные;
               |"//}}ЗАПРОС
               ;

================================================================================


Вот отчет:
================================================================================
   Магазины (Область)                            
       Вичуга                80        
       Волгореченск            18        
       Гаврилов Посад            2        
       Заволжск            38        
       Кинешма                148        
       Комсомольск            74        
       Лежнево                76        
       Наволоки            32        
       Палех                35        
       Писцово                33        
       Плёс                13        
       Приволжск            117        
       Пучеж                34        
       Родники                90        
       Савино                27        
       Тейково                158        
       Фурманов            128        
       Шуя                77        
       Южа                70        
       Юрьевец                16        
   Магазины (г. Иваново)                            
       Иваново                918        
   Общепиты (HoReCa)                            
       Иваново                38        
       Наволоки            3        
       Приволжск            3        
       Тейково                3        
   Оптовики (Область)                            
       Кинешма                15        
       Приволжск            2        
       Родники                2        
       Тейково                2        
       Фурманов            2        
       Шуя                6        
       Южа                1        
================================================================================


В этом отчете мусор. Потому-что попадают клиенты столько раз сколько они встречаются в документах. Как избежать дублирования?
21 Ёпрст
 
гуру
14.07.10
09:59
(20) да уж..Мусор в чем ? Где дубли в этом отчете ?
22 yegorka
 
14.07.10
10:07
Ну к примеру клиент "А" из группы справочника "Магазины (Область)" из города "Вичуга" отгружался за период N раз. Он в эту выборку и посчитается N раз. Мне нужно, чтобы от 1 раз считался.
23 ДенисЧ
 
14.07.10
10:08
Группировка Регион;
Группировка Контр;

и убрать счётчик()
24 yegorka
 
14.07.10
10:09
Если счетчик убрать, откуда я цифры возьму?
25 Ёпрст
 
гуру
14.07.10
10:09
(22) Ты хочешь чтоб у тебя в отчете везде 1-ки стояли напротив клиентоса, или что ?
Или ты хочешь подсчитать количество клиентосов по каждому региону ?
Дык функция Счётчик считает не количество записей в группировке, если что, а количество записей, участвующих в выборке.
26 yegorka
 
14.07.10
10:12
2 Ёпрст3: Нет, конечно. В этом отчете и нет клиентосов. Есть регионы откуда клиентосы.
Нужно знать, сколько клиентов из региона отоварилось (а не сколько было отгрузок в регион) за период, в разрезе групп справочника.
27 Ёпрст
 
гуру
14.07.10
10:13
(26)

Магазины (Область)
Магазины (г. Иваново)
...
Это что ?

Гаврилов Посад            2        
Заволжск            38        
Кинешма                148        
Комсомольск            74        
Лежнево    

А это что ?
28 yegorka
 
14.07.10
10:15
Магазины (Область)
Магазины (г. Иваново)

Это -- группы справочника Получатели.

Гаврилов Посад            2        
Заволжск            38        
Кинешма                148        
Комсомольск            74        
Лежнево

Это -- регионы
29 yegorka
 
14.07.10
10:16
Регионы это поле справочника получатели
30 Ёпрст
 
гуру
14.07.10
10:16
(28) и ка ты ЭТО получил при запросе в (20) ??????????????
31 Ёпрст
 
гуру
14.07.10
10:17
+ и видишь ли, если это ГРуппы справочника Получатели, то в 1 группе могут быть клиентосы с РАЗНЫМИ регионами, что очевидно..
32 yegorka
 
14.07.10
10:19
2 Ёпрст3: я же и запрос и отчет представил. Вот тогда еще кусочек, как строю отчет:
=========================================================================
   СчетчикЦикла = 0;
   Для СчетчикЦикла = 1 По Категории.РазмерСписка() Цикл
       //
       Кат = Категории.ПолучитьЗначение (СчетчикЦикла);
       //
       УсловиеЗапроса = "
               |Условие(Контр В Кат);
               |ОбрабатыватьДокументы Проведенные;
               |"//}}ЗАПРОС
               ;

       
       Если Запрос.Выполнить(ТекстЗапроса+УсловиеЗапроса)=0 Тогда
           Возврат;;
       КонецЕсли;
       //
       Таб.ВывестиСекцию ("Категории");    
       //
       //          
       Пока Запрос.Группировка(1) = 1 Цикл
           Таб.ВывестиСекцию ("Точки");
       КонецЦикла;        

   КонецЦикла;

=========================================================================

на (31) -- очевидно. Это отчет и отражает, вообще-то.
33 Ёпрст
 
гуру
14.07.10
10:22
(32) да.. это полный ПЭ..

выполнение запроса в цикле..ппц.

ЗЫ: так и не вкурил, что  ты хочешь на самом деле.
34 yegorka
 
14.07.10
10:23
Блин, а всего-то не хватает в этом языке запросов DISTINCT как в SQL.
35 Ёпрст
 
гуру
14.07.10
10:24
(34) ну и пиши на SQL, кто мешает ?

А так, на примере (20) напиши руками, какая должна быть табличка на выходе..
36 yegorka
 
14.07.10
10:25
на (34) я не умею на SQL писать под 1С. А так умею.
37 Ёпрст
 
гуру
14.07.10
10:27
(36) а чего там уметь то?
но для начала, выложи результирующую табличку, какая должна быть, а то хрен поймешь, что ты хочешь в итоге.
38 yegorka
 
14.07.10
10:28
на (36) так как в (20) и должна быть на выходе табличка.
Только в:
   Магазины (Область)                            
       Вичуга                80        
       Волгореченск            18        
       Гаврилов Посад            2        
       Заволжск            38        
       Кинешма                148        
       Комсомольск            74        
       Лежнево                76        
       Наволоки            32        
       Палех                35        
       Писцово                33        
       Плёс                13        
       Приволжск            117        
       Пучеж                34        
       Родники                90        
       Савино                27        

каждом регионе сейчас фактически количество отгрузок за период в данный регион. а нужно количество уникальных отгрузок.
39 Ёпрст
 
гуру
14.07.10
10:29
(38) "уникальных" отгрузок, это как ?
40 yegorka
 
14.07.10
10:34
на (39): Клиент "А" из региона "Вичуга" отгрузился за период Н раз. В отчет он попадает Н раз. Клиент "Б" из региона "Вичуга" отгрузился за период М раз. В отчет он попадает М раз. Клиент "С" из региона "Вичуга" отгрузился за период К раз. В отчет он попадает К раз.
В итоге я получаю в отчете цифру по региону Н+М+К равную количеству _ВСЕХ_ отгрузок в регион "Вичуга". А мне нужно, только показать цифру 3, Так как это количество уникальных отгрузок.
41 Ёпрст
 
гуру
14.07.10
10:42
(40) ну тупо так:

Перем СписокКлиентосов;
Функция ПроверитьКлиентоса(Клиентос)
  Если СписокКлиентосов.НайтиЗначение(Клиентос)=0 Тогда
       СписокКлиентосов.ДобавитьЗначение(Клиентос);
       Возврат 1;
  КонецЕсли;
  Возврат 0;
КонецФункции
..........

СписокЗначений = СоздатьОбъект("СписокЗначений");

ТекстЗапроса = "
  |Период с ДатаНачала по ДатаКонца;
  |Контр = Документ.Реализация.Получатель;
  |Регион = Документ.Реализация.Получатель.Город;
  |Функция Счётчик = Счётчик()Когда(ПроверитьКлиентоса(Контр)=1);
  |Группировка Контр;
  |Группировка Регион;  
  |Условие(Контр в ВыбКонтрагент);
42 PaulBC
 
14.07.10
10:44
(40)
СчетчикУникальныхОтгрузок = 0;
Пока Запрос.Группировка("Контр")=1 Цикл
 СчетчикУникальныхОтгрузок = СчетчикУникальныхОтгрузок+1;

(32) Условие(Контр В Категории); // это вместо запроса в цикле
43 yegorka
 
14.07.10
10:54
на (40): так группировка по Контр уже выбирает уникальных Контр.
44 Ёпрст
 
гуру
14.07.10
11:01
(43) эта функция не для счётчика, если что.