Имя: Пароль:
1C
1C 7.7
v7: Не раскрывается группировка в запросе
,
0 Save
 
19.09.13
15:53
Подскажите, пожалуйста!
Есть запрос
ТекстЗапроса =
    "Период С ДатаНачала;//{{ЗАПРОС(Оборот)
    |Фирма = Регистр.Оборот.Фирма;
    |Товар = Регистр.Оборот.Товар;
    |Склад = Регистр.Оборот.Склад;
    |Партия = Регистр.Оборот.Партия;
    |Клиент = Регистр.Оборот.Клиент;
    |Регион = Регистр.Оборот.Клиент.Регион.Наименование;
    |Пост = Регистр.Оборот.Поставщик;
    |Произв = Регистр.Оборот.Производитель.Наименование;
    |ТекДок = Регистр.Оборот.ТекущийДокумент;
    |Прих = Регистр.Оборот.ТовПрих;
    |Расх = Регистр.Оборот.ТовРасх;
    |Ден = Регистр.Оборот.ОстатокДенСеб;
    |НСеб = Регистр.Оборот.НДССеб;
    |Роз = Регистр.Оборот.ОстатокДенРозн;
    |НРоз = Регистр.Оборот.НДСРозн;
    |Группировка Фирма упорядочить по Фирма.Наименование без групп;
    |Группировка Регион;
    |Группировка Произв;
    |Группировка Товар упорядочить по Товар.Наименование без групп;
    |Группировка Клиент упорядочить по Клиент.Наименование без групп;
    |Функция КоличПр = Сумма(Прих);
    |Функция КоличРа = Сумма(Расх);
    |Функция Себест = Сумма(Ден);
    |Функция НДС = Сумма(НСеб);
    |Функция Розн = Сумма(Роз);
    |Функция НДСР = Сумма(НРоз);
    |"//}}ЗАПРОС
    ;
При обходе не раскрывается группировка по клиенту, т.е. выводится только 1-й клиент, остальные - нет. А производитель выводится 2 раза. Такое впечатление, что мешает группировка по региону. Если ее убрать и заменить на другую (например, склад), то все в порядке.
1 KishMish
 
19.09.13
16:00
Группировка Регион;
Регион у тебя строка.
возможно в этом дело?
2 Chum
 
19.09.13
16:04
Попробуй убрать .Наименование
Пусть группируется по объектам Регион и Производитель, на не по строкам
3 Save
 
19.09.13
16:15
Ой, прошу прощения! Это не тот запрос. Вот он.

ТекстЗапроса =
    "Период С ДатаНачала;//{{ЗАПРОС(Оборот)
        |Фирма = Регистр.Оборот.Фирма;
        |Товар = Регистр.Оборот.Товар;
        |Склад = Регистр.Оборот.Склад;
        |Партия = Регистр.Оборот.Партия;
        |Клиент = Регистр.Оборот.Клиент;
        |Регион = Регистр.Оборот.Клиент.Регион;
        |Пост = Регистр.Оборот.Поставщик;
        |Произв = Регистр.Оборот.Производитель;
        |ТекДок = Регистр.Оборот.ТекущийДокумент;
        |Прих = Регистр.Оборот.ТовПрих;
        |Расх = Регистр.Оборот.ТовРасх;
        |Ден = Регистр.Оборот.ОстатокДенСеб;
        |НСеб = Регистр.Оборот.НДССеб;
        |Роз = Регистр.Оборот.ОстатокДенРозн;
        |НРоз = Регистр.Оборот.НДСРозн;
        |Группировка Фирма упорядочить по Фирма.Наименование без групп;
        |Группировка Регион упорядочить по Регион.Наименование без групп;;
        |Группировка Произв упорядочить по Регион.Наименование без групп;;
        |Группировка Товар упорядочить по Товар.Наименование без групп;
        |Группировка Клиент упорядочить по Клиент.Наименование без групп;
        |Функция КоличПр = Сумма(Прих);
        |Функция КоличРа = Сумма(Расх);
        |Функция Себест = Сумма(Ден);
        |Функция НДС = Сумма(НСеб);
        |Функция Розн = Сумма(Роз);
        |Функция НДСР = Сумма(НРоз);
        |"//}}ЗАПРОС
4 Стрелок
 
19.09.13
16:16
код обхода давай
5 Save
 
19.09.13
16:20
Не могу исправить верхний пост. Это можно как-то сделать?

Получается вот еще что. Производитель, Клиент - это все из одного справочника элементы. Да еще и Регион - реквизит Клиента.
Код обхода:
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    //// Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    Пока Запрос.Группировка(1)=1 Цикл
        Таб.ВывестиСекцию("Фирма");
        Пока Запрос.Группировка(2)=1 Цикл
            Таб.ВывестиСекцию("Регион");
            Пока Запрос.Группировка(3)=1 Цикл
                Таб.ВывестиСекцию("Производитель");
                Пока Запрос.Группировка(4)=1 Цикл
                    Таб.ВывестиСекцию("Товар");
                    Пока Запрос.Группировка(5)=1 Цикл
                        Таб.ВывестиСекцию("Строка");
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
        
    КонецЦикла;
6 Стрелок
 
19.09.13
16:23
косяков не вижу - высыпь в ТЗ и проанализируй что к чему
7 KishMish
 
19.09.13
16:33
|Группировка Произв упорядочить по Регион.Наименование без групп;;
8 Save
 
19.09.13
16:35
В ТЗ:
1-я строка: общий итог
2: Итог по фирме
3: Итог Фирма+Регион
4: Итог Фирма+Регион+Производитель+Товар+1-й клиент
5: Итог Фирма+Регион+Производитель
6: Итог Фирма+Регион+Производитель+Товар
7: Итог Фирма+Регион+Производитель+Товар+2-й клиент
Т.е. 4-я строка должна бы быть перед 7-й.
9 Стрелок
 
19.09.13
16:38
Производитель везде одинаковый? Точно или наименования совпадают?
10 Стрелок
 
19.09.13
16:38
проверь справочник "клиенты" на совпадение имён контрагентов
11 KishMish
 
19.09.13
16:39
(8) исправил ошибку в (7)
12 Стрелок
 
19.09.13
16:39
нафига "текдок" в запросе?
13 Стрелок
 
19.09.13
16:39
(11) это не ошибка
14 Franchiser
 
гуру
19.09.13
16:39
База SQL?
15 KishMish
 
19.09.13
16:42
(13) упорядочивание производителей по региону клиента? Это не ошибка?
16 Стрелок
 
19.09.13
16:43
(15) упс я думал ты про ";;" да ты прав это упорядочивание глупое
17 Save
 
19.09.13
16:45
KishMish, там нормально все, на самом деле там по производителю группировка стоит. Это универсальный отчет, в нем текст запроса формируется в зависимости от группировок, которые выбрал пользователь. И обход делается рекурсивной процедурой. Просто для проверки пришлось его вынести отдельно, т.к. иначе отладчик "выкидывает" из программы.
Поэтому и текдок в запросе, т.к. пользователь может запросить по документам.
18 Save
 
19.09.13
16:45
База SQL
19 Стрелок
 
19.09.13
16:46
(17) так ты можешь дать РЕАЛЬНЫЙ код РЕАЛЬНОГО запроса и обхода группировок?
20 Save
 
19.09.13
16:46
Упорядочивание, да, глупое, но это опечатка просто, т.к. старый текст не сохранился.
21 Save
 
19.09.13
16:47
Вот вроде все проверено, работает так же:

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

    
    //// Заполнение полей "Заголовок"
    //
    //Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
22 Franchiser
 
гуру
19.09.13
16:48
Возможно sql не корректно обрабатывает. Как то сравнивал с dbf: случай когда есть регистр в нем 2 измерения с типом одного справочника, запрос не всегда корректно выбирает реквизиты одного из измерений, где то даже писал про это. Поэтому попробуй проделать все то же самое на dbf.
23 Стрелок
 
19.09.13
16:49
а попробуй вообще убрать упорядочивание
24 Franchiser
 
гуру
19.09.13
16:52
и через 3 точки получать в запросе особенно sql это зло.
25 Save
 
19.09.13
16:53
(23) Не помогает. Без упорядочивания то же самое.
26 Franchiser
 
гуру
19.09.13
16:53
убери регион...
27 KishMish
 
19.09.13
16:53
исход из (22) для разделения одновидовых реквизитов все таки может тогда использовать наименование
типа
|Пост = Регистр.Оборот.Поставщик.Наименовапние;

и группировку соответно исправить
28 Franchiser
 
гуру
19.09.13
16:55
(27) У меня была ошибка в случае, например, если взять в запросе Регион из Клиента, а потом из производителя. Так вот во втором случае брался регион не производителя а клиента повторно.
29 Save
 
19.09.13
16:56
(24) И что же делать?
30 Стрелок
 
19.09.13
16:56
(24) да ладно.. вот реально работающий прекрасно запрос

ТекстЗапроса="
    |Период с ДатаНачала по ДатаКонца;
    |Фирма=Регистр.ПартииТоваров.Фирма;
    |ПричинаВозврата=Регистр.ПартииТоваров.ТекущийДокумент.ПриходнаяНакладная.ПричинаВозврата;
    |ТекДок=Регистр.ПартииТоваров.ТекущийДокумент;
    |Супер=Регистр.ПартииТоваров.ТекущийДокумент.ПриходнаяНакладная.Контрагент.Агент.Супервайзер;
    |ВозвратВДалах=Регистр.ПартииТоваров.ОстатокТовараДал;
    |Функция ВозвратДал=Расход(ВозвратВДалах) Когда (ТекДок.Вид()=""ПриходнаяНакладная"");
    |Группировка Супер без групп;
    |Группировка ПричинаВозврата;  
    |Группировка Неделя;
    //|Условие (Агент в СВ);  
    |Условие (Фирма=глПустаяФирма);
    |Без Итогов;";

скуль 27
31 Save
 
19.09.13
16:57
(26) Без региона все отлично.
32 Ёпрст
 
19.09.13
16:57
(0) Клиент  в регистре, измерение какого типа ?
<справочник> без вида поди еще , да ?
33 Стрелок
 
19.09.13
16:57
(29) регистр оборотный или остатков?
34 Franchiser
 
гуру
19.09.13
16:57
(29) ну я бы убрал все группировки выгрузил в тз без группировок, потом у меня есть рекурсивная функция которая позволяет вывести ТЗ с группировками. Может не очень красиво, но работает. Я пока не знаю проблема ли в sql или нет, попробовал бы на dbf.
35 Save
 
19.09.13
16:59
(32) Измерение Справочник.Клиенты
36 Save
 
19.09.13
16:59
(33) Оборотный
37 Franchiser
 
гуру
19.09.13
17:01
(30)1с против этого в 1с 7.7 и 1с 8.2 т.к. это приводит к неявному соединению таблицы в sql. А 7.7 еще и не до конца заточена под работу в таком режиме.
38 Ёпрст
 
19.09.13
17:01
выкини упорядочивание везде и покажи скриншот результата
39 Ёпрст
 
19.09.13
17:03
И покажи результат этого:

Запрос.Выгрузить(ТЗ,0,0);
ТЗ.ВыбратьСтроку();
40 Стрелок
 
19.09.13
17:03
(37) мне глубоко по.. (ну ты понял) против чего 1С. работает и прекрасно работает. всё остальное сказки от 1С для устрашения
41 Save
 
19.09.13
17:05
Попробую все, спасибо большое. Убегаю, завтра все выложу.
42 Save
 
20.09.13
11:32
(34) В dbf все работает правильно.
43 Ёпрст
 
20.09.13
11:38
запрос.ВключитьSQL(0) воткни, и в скуле заработаетт тогда.
правда, скорость маненько упадёт.. в разы.
44 Save
 
20.09.13
11:44
(43) Так работает. Спасибо!
45 Franchiser
 
гуру
23.09.13
10:45
(43) Удивил, я не знал об этой недокументированной функции, возьму на заметку)
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс