Имя: Пароль:
1C
1C 7.7
v7: Подскажите, что не так с запросом
0 bas28000
 
11.02.14
11:57
Вот этот кусок кода не выдает ни единого документа, а если убрать группировку по дате документа, то документы в запросе появляются. Даты, само собой, заданы одинаково и там и там и в них есть искомые документы:

    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "
    |Период с ДатаНачала по ДатаКонца;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Без итогов;
    |ЧекККМ = Документ.ЧекККМ.ТекущийДокумент;
    |ДатаДок = Документ.ЧекККМ.ДатаДок;
    |Касса = Документ.ЧекККМ.Касса;
    |ВидОперации = Документ.ЧекККМ.ВидОперации;
    |Фирма = Документ.ЧекККМ.Фирма;
    |ЮрЛицо = Документ.ЧекККМ.ЮрЛицо;
    |Группировка ЧекККМ упорядочить по ЧекККМ.ДатаДок;
    |Группировка ДатаДок;
    |Условие(ВидОперации = ВыбВидОперации);
    |Условие(Касса = ВыбКасса);
    |Условие(Фирма = ВыбФирма);
    |Условие(ЮрЛицо = ВыбЮрЛицо);
    |";
    
    Состояние("Обработка запроса...");
    Флаг = Запрос.Выполнить(ТекстЗапроса);
    Если Флаг = 0 Тогда
        Предупреждение("Запрос не выполнился!");
        Возврат;
    КонецЕсли;
    
    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("АналитикаПоКассе");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    
    Состояние("Обработка полученных данных...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка("ЧекККМ") = 1 Цикл
        Пока Запрос.Группировка("ДатаДок") = 1 Цикл
            Сообщить(Запрос.ЧекККМ);
        КонецЦикла;
    КонецЦикла;
1 1Сергей
 
11.02.14
12:06
местами поменяй группировки. Логично, что в одной дате может быть несколько документов, а не наоборот
2 1Сергей
 
11.02.14
12:10
//|Группировка ЧекККМ упорядочить по ЧекККМ.ДатаДок;
    |Группировка ДатаДок;
    |Группировка Документ;
3 Diter
 
11.02.14
12:11
дата док как и номер док в запросе НЕДОСТУПНЫ для группировок
4 Diter
 
11.02.14
12:12
аналогично и код справочника
5 Diter
 
11.02.14
12:12
высыпи запрос  в ТЗ и убедись что ДатаДок пустая колонка
6 1Сергей
 
11.02.14
12:14
(3) да ну?
7 Diter
 
11.02.14
12:16
(6) проверь
8 Diter
 
11.02.14
12:16
и уж точно от порядка группировки НИЧЕГО не зависит ;)
9 Ork
 
11.02.14
12:17
(0) Лажа видимо здесь :
"|Группировка ЧекККМ упорядочить по ЧекККМ.ДатаДок;
|Группировка ДатаДок;"

Зачем две группировки с одним и тем же смыслом?
Достаточно вот такого :
"|Группировка День;"
10 Diter
 
11.02.14
12:18
а если ему документы нужны?
11 Diter
 
11.02.14
12:19
а упорядычивать по датедок нет смысла. документы встанут по позиции, которая в себя и так дату включает
12 Ork
 
11.02.14
12:20
+ (9) Вообще все должно выглядеть примерно так :
"ТекстЗапроса = "
    |Период с ДатаНачала по ДатаКонца;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Без итогов;
    |Касса = Документ.ЧекККМ.Касса;
    |ВидОперации = Документ.ЧекККМ.ВидОперации;
    |Фирма = Документ.ЧекККМ.Фирма;
    |ЮрЛицо = Документ.ЧекККМ.ЮрЛицо;
    |
    |//************ Изменения здесь
    |Группировка День;
    |Группировка Документ;
    |//************ все будет сгруппировано по дням, внутри - по позиции документа.
    |Условие(ВидОперации = ВыбВидОперации);
    |Условие(Касса = ВыбКасса);
    |Условие(Фирма = ВыбФирма);
    |Условие(ЮрЛицо = ВыбЮрЛицо);
    |";
13 1Сергей
 
11.02.14
12:22
(7) проверил, группировка по датадок прекрасно работает
14 bas28000
 
11.02.14
12:23
Мне нужно вот что - есть документы, которые хотелось бы уже в запросе сгруппировать по дате, обсчитывать их суммы ТЧ и не париться с обработкой по дате в цикле.
15 Diter
 
11.02.14
12:24
(13) серьёзно? ну выложи текст. посмотрим
16 Diter
 
11.02.14
12:24
(14) замени группировку "ДатаДок" на День и наслаждайся. а вообще сделай как в 12 указано
17 bas28000
 
11.02.14
12:25
(14) В смысле, что я допустим хочу по документам получить средний чек за день. Для этого мне проще всего уже в запросе задать такую группировку, когда я сразу при обработке результатов запроса будут обходить все документы за день, считать свой средний чек, и потом переходить к следующему дню просто перейдя к очередной порции по группировке.
18 Diter
 
11.02.14
12:28
так и поставь вначале группировку "День" а потом "Док"
19 Diter
 
11.02.14
12:28
(13) прав. значит я забыл. но где то косяк с номером документа и датой точно был в запросе. что то не отрабатывало
20 bas28000
 
11.02.14
12:30
ОК, код стал таким:

    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "
    |Период с ДатаНачала по ДатаКонца;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Без итогов;
    |ЧекККМ = Документ.ЧекККМ.ТекущийДокумент;
    |Касса = Документ.ЧекККМ.Касса;
    |ВидОперации = Документ.ЧекККМ.ВидОперации;
    |Фирма = Документ.ЧекККМ.Фирма;
    |ЮрЛицо = Документ.ЧекККМ.ЮрЛицо;
    |Группировка День;
    |Группировка Документ;
    |Условие(ВидОперации = ВыбВидОперации);
    |Условие(Касса = ВыбКасса);
    |Условие(Фирма = ВыбФирма);
    |Условие(ЮрЛицо = ВыбЮрЛицо);
    |";
    
    Состояние("Обработка запроса...");
    Флаг = Запрос.Выполнить(ТекстЗапроса);
    Если Флаг = 0 Тогда
        Предупреждение("Запрос не выполнился!");
        Возврат;
    КонецЕсли;
    
    Состояние("Обработка полученных данных...");
    
    Пока Запрос.Группировка(1) = 1 Цикл
        Пока Запрос.Группировка(2) = 1 Цикл
            Сообщить(Запрос.ЧекККМ);
        КонецЦикла;
    КонецЦикла;


Теперь пишет вот что: Неверный номер упорядочивания
21 1Сергей
 
11.02.14
12:33
(15)

//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    
    НачДата = Дата("01.09.13");
    
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с НачДата;
    |ЗаказВцех = Документ.ЗаказВцех.ТекущийДокумент;
    |ДатаДок = Документ.ЗаказВцех.ДатаДок;
    |Клиент = Документ.ЗаказВцех.Клиент;
    |НомерДок = Документ.ЗаказВцех.НомерДок;
    |Группировка ЗаказВцех;
    |Группировка ДатаДок;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        // Заполнение полей ЗаказВцех
        Таб.ВывестиСекцию("ЗаказВцех");
        Пока Запрос.Группировка(2) = 1 Цикл
            // Заполнение полей ДатаДок
            Таб.ВывестиСекцию("ДатаДок");
        КонецЦикла;
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры
22 Diter
 
11.02.14
12:35
(21) ты писатель?
23 Diter
 
11.02.14
12:36
|Группировка ЧекККМ;

упс 22 не тебе ;)

это ТС
24 bas28000
 
11.02.14
12:40
(23) Поменял "Группировка Документ;" на "Группировка ЧекККМ;", история та же, то же сообщение выдает.
25 bas28000
 
11.02.14
13:01
(21) Проверил, у меня ничего не выходит :) Вот код:

    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "
    |Период с ДатаНачала по ДатаКонца;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Без итогов;
    |ЧекККМ = Документ.ЧекККМ.ТекущийДокумент;
    |ДатаДок = Документ.ЧекККМ.ДатаДок;
    |Касса = Документ.ЧекККМ.Касса;
    |ВидОперации = Документ.ЧекККМ.ВидОперации;
    |Фирма = Документ.ЧекККМ.Фирма;
    |ЮрЛицо = Документ.ЧекККМ.ЮрЛицо;
    |Группировка ЧекККМ;
    |Группировка ДатаДок;
    |Условие(ВидОперации = ВыбВидОперации);
    |Условие(Касса = ВыбКасса);
    |Условие(Фирма = ВыбФирма);
    |Условие(ЮрЛицо = ВыбЮрЛицо);
    |";
    
    Состояние("Обработка запроса...");
    Флаг = Запрос.Выполнить(ТекстЗапроса);
    Если Флаг = 0 Тогда
        Предупреждение("Запрос не выполнился!");
        Возврат;
    КонецЕсли;
    
    Состояние("Обработка полученных данных...");
    
    Пока Запрос.Группировка("ЧекККМ") = 1 Цикл
        Сообщить(Запрос.ДатаДок);
        Пока Запрос.Группировка("ДатаДок") = 1 Цикл
            Сообщить(Запрос.ЧекККМ);
        КонецЦикла;
    КонецЦикла;
26 Ork
 
11.02.14
13:10
(25) Нафига чушь пишешь?
"|Группировка ЧекККМ;
    |Группировка ДатаДок;"

Группировка ЧекККМ уже сгруппирует по позиции. Которая уже включает дату. Не будет НИКОГДА документов с одной позицией и разными датами.
27 1Сергей
 
11.02.14
13:11
(26) я ему про это ещё в (1) сказал
28 Ork
 
11.02.14
13:13
ТекстЗапроса = "
    |Период с ДатаНачала по ДатаКонца;
    |Обрабатывать НеПомеченныеНаУдаление;
    |//это убрать : Без итогов;
    |//это убрать : ЧекККМ = Документ.ЧекККМ.ТекущийДокумент;
    |//это убрать : ДатаДок = Документ.ЧекККМ.ДатаДок;
    |Касса = Документ.ЧекККМ.Касса;
    |ВидОперации = Документ.ЧекККМ.ВидОперации;
    |Фирма = Документ.ЧекККМ.Фирма;
    |ЮрЛицо = Документ.ЧекККМ.ЮрЛицо;
    |//это убрать : Группировка ЧекККМ;
    |//это убрать : Группировка ДатаДок;
    |Группировка День;
    |Группировка Документ;
    |//это все нужные группировки;
    |Условие(ВидОперации = ВыбВидОперации);
    |Условие(Касса = ВыбКасса);
    |Условие(Фирма = ВыбФирма);
    |Условие(ЮрЛицо = ВыбЮрЛицо);
    |";
    
    Состояние("Обработка запроса...");
    //Здесь - непринципиально. Но код более читаемый
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Предупреждение("Запрос не выполнился!");
        Возврат;
    КонецЕсли;
    
    Состояние("Обработка полученных данных...");
    
    Пока Запрос.Группировка("День") = 1 Цикл
        Сообщить(Запрос.День);
        Пока Запрос.Группировка("Документ") = 1 Цикл
            Сообщить(Запрос.Документ);
        КонецЦикла;
    КонецЦикла;
29 Builder
 
11.02.14
13:18
Я бы еще заменил во всех условиях = на В
|Условие(ВидОперации В ВыбВидОперации);
Ибо если условие не выбрано, то отберет пустые.
30 bas28000
 
11.02.14
14:09
(29) Можно, но только сначала надо понять, почему выше у товарища работает, а у меня не работает.
31 bas28000
 
11.02.14
14:10
(26) Отлично. А как тогда мне построить запрос таким образом, чтобы я группировкой выгребал все документы сначала одной даты, потом следующей, и так далее?
32 uno-group
 
11.02.14
14:22
(27) Ты не прав зависит от функций. тотоже счетчик выдаст разные значения с группировкой по документу и без. И как раз для среднего чека просто группировки даты ему не хватит.
(0) Чтот я у тебя функций не увидел ИМХО тут собака порылась. давай весь код
33 Ёпрст
 
11.02.14
14:23
(30) :)))))

в (0) в тексте  исправь на

//   Пока Запрос.Группировка("ЧекККМ") = 1 Цикл
//        Пока Запрос.Группировка("ДатаДок") = 1 Цикл
//            Сообщить(Запрос.ЧекККМ);
//        КонецЦикла;
//    КонецЦикла;

   Пока Запрос.Группировка() = 1 Цикл
            Сообщить(Запрос.ЧекККМ);
   КонецЦикла;

наслаждайся..
34 Ёпрст
 
11.02.14
14:24
+33 ну и у мужика в кепке в пофигураторе спроси заодно, что есть Без Итогов в тексте запроса. Если  че, твой код рабочий.
35 bas28000
 
11.02.14
14:24
(33) Так это и я так могу, но тогда придется самому кодом разделять документы по дате.
36 Ёпрст
 
11.02.14
14:26
(35) че ты можешь ? СП осилил, не ?
см (34).
37 Ёпрст
 
11.02.14
14:28
Можешь и оставить обход по двум группировкам, тогда просто выкини Без Итогов в тексте запроса + выкини упорядочивание + поменяй группировки местами : первая по дате, вторая по текущему документу

наслаждайся
38 bas28000
 
11.02.14
14:30
(37) Спасибо, помогло.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший