Имя: Пароль:
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) Удивил, я не знал об этой недокументированной функции, возьму на заметку)
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.