Имя: Пароль:
1C
1С v8
Обход группировками, затык
0 Дурындина
 
21.03.14
16:24
у меня такая головная боль, помогите! Есть некий документ, в реквизитах номенклатура и количество! В табл части - техоперации обработки данной номенклатуры. Нужно вывести последовательно - номенклатуру, все документы, кот. относятся к ней с количеством по документу, и соответственно на каждый документ - операции.
Я делаю так:
Макет = ПолучитьМакет("Макет");

// очищаем табличный документ
ТабДок= Новый ТабличныйДокумент;
ТабДок.Очистить();    
Запрос = Новый Запрос;
Запрос.Текст =

"ВЫБРАТЬ
|    ЗаданиеОперации.Ссылка.Номер КАК Номер,
|    ЗаданиеОперации.Ссылка.Номенклатура КАК Номенклатура,
|    ЗаданиеОперации.Ссылка.Количество КАК Количество
|ИЗ
|    Документ.Задание.Операции КАК ЗаданиеОперации
|
|СГРУППИРОВАТЬ ПО
|    ЗаданиеОперации.Ссылка.Номенклатура,
|    ЗаданиеОперации.Ссылка.Номер,
|    ЗаданиеОперации.Ссылка.Количество
|ИТОГИ
|    СУММА(Количество)
|ПО
|    Номенклатура";    
ОбластьНоменклатура = Макет.ПолучитьОбласть("Номенклатура");
ОбластьНомер = Макет.ПолучитьОбласть("Номер");
ОбластьОперация = Макет.ПолучитьОбласть("Операция");
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
ОбластьНоменклатура.Параметры.Номенклатура=Выборка.Номенклатура;
ТабДок.Вывести(ОбластьНоменклатура);
Выборка2=Выборка.Выбрать();
Пока Выборка2.Следующий() Цикл
ОбластьНомер.Параметры.Номер=Выборка2.Номер;
ОбластьНомер.Параметры.Количество=Выборка2.Количество;
ТабДок.Вывести(ОбластьНомер);
КонецЦикла;
КонецЦикла;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.Автомасштаб = Истина;
ТабДок.Показать();


Получаю макет:
А хочу под каждым номером видеть соответствующие операции документу, если пытаюсь добавить третий уровень группировки в обходе, то количество не правильно выводится, как быть? Подскажите.
1 kumena
 
21.03.14
16:47
какой третий уровень?

|ИТОГИ
|  
|ПО
|    Номенклатура";  

это итоговая группировка, под ней у тебя детальная.
если надо еще группировки дописывай к номенклатуре, и обходи по ней.
2 Дурындина
 
24.03.14
00:09
Если добавляю тертий уровень группировки, и итоги, то выводится не првильно количество, почем?
3 Дурындина
 
24.03.14
00:09
я делаю так :
ТабДок= Новый ТабличныйДокумент;
    ТабДок.Очистить();    
         
        
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЗаданиеОперации.Ссылка.Номенклатура КАК Номенклатура,
    |    ЗаданиеОперации.Ссылка КАК Ссылка,
    |    ЗаданиеОперации.Ссылка.КолВыданных КАК КолВыданных,
    |    ЗаданиеОперации.ТехОперация
    |ИЗ
    |    Документ.Задание.Операции КАК ЗаданиеОперации
    |ИТОГИ
    |    СУММА(КолВыданных)
    |ПО
    |    Номенклатура,
    |    Ссылка"    ;
        
      Запрос.УстановитьПараметр("Подразделение", Подразделение);
      
    ОбластьНоменклатура = Макет.ПолучитьОбласть("Номенклатура");
    ОбластьНомер = Макет.ПолучитьОбласть("Номер");
    ОбластьОперация = Макет.ПолучитьОбласть("Операция");
     ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
        ТабДок.Вывести(ОбластьШапка);
    Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Пока Выборка.Следующий() Цикл
                 ОбластьНоменклатура.Параметры.Номенклатура=Выборка.Номенклатура;
                   ОбластьНоменклатура.Параметры.Кол=Выборка.КолВыданных;
                 ТабДок.Вывести(ОбластьНоменклатура);
                
                 Выборка2=Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                                      Пока Выборка2.Следующий() Цикл
                                            ОбластьНомер.Параметры.Номер=Выборка2.Ссылка.Номер;
                                            ОбластьНомер.Параметры.Количество=Выборка2.КолВыданных;
                                                               ТабДок.Вывести(ОбластьНомер);
                                                              
                                                              
                                 Выборка3=Выборка2.Выбрать();
                                      Пока Выборка3.Следующий() Цикл
                                            ОбластьОперация.Параметры.Операция=Выборка3.ТехОперация
;
                                         ТабДок.Вывести(ОбластьОперация);
                                                              
                                                                                   КонецЦикла;

                                                              
                                                              
                                                              
                                                                                   КонецЦикла;
       КонецЦикла;
4 Дурындина
 
24.03.14
00:10
Количество номенклатуры удваивается,! почему?
5 fgaabbb
 
24.03.14
04:29
потому что ссылка это тоже номенклатура =)
6 ИС-2
 
naïve
24.03.14
07:53
можно посмотреть что получается в каждом случае с помощью или заппросника или запрос.выполнить().выгрузить()
7 Дурындина
 
24.03.14
07:54
а как быть в такой ситуации? как выводить операции под каждым номером документа?  (под ссылкой)
8 ИС-2
 
naïve
24.03.14
07:59
(7) сделать на СКД - быстрее и проще
9 ИС-2
 
naïve
24.03.14
08:00
если добавляешь еще 1 группировку, то
Выборка2 = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
10 Дурындина
 
24.03.14
08:00
в скд та же фигня, и мне нужно все равно выводить на печать, в печатной форме
11 Дурындина
 
24.03.14
08:01
ИС-2, это понятно, у меня так и есть
12 ИС-2
 
naïve
24.03.14
08:12
что значит неправильно? В запросе нет ни какой операции. Да и группировка такая излишняя или ошибочная - количество должно быть в суммируемых полях, а не в группировке
Пример с принтсрином в студию :)
13 Дурындина
 
24.03.14
08:21
стесняюсь спросить а как сюда крепить изображение??)))
14 Любопытная
 
24.03.14
08:21
(13)никак. Выкладываешь в файло-помойку, сюда ссылку
15 Дурындина
 
24.03.14
08:23
Хотя и так не сложно изобразить, должно быть так:
Молоко      80
00001       50
варка
паковка
00002       30
варка
паковка
сыр         40
варка
резка
паковка
16 Дурындина
 
24.03.14
08:30
при этом есть документ задание - в реквизитах номенклатура и количество!!! а в табл части - операции!
17 Дурындина
 
24.03.14
08:31
а выводить нужно так - номенклатура, потом все номера документов, на каждый номер документа соответствующие операции
18 ИС-2
 
naïve
24.03.14
08:37
(15) сделать вложенный запрос, в котором будет вычисляться сумма "Количество" по группировке Номенлатура и соединить его с основной таблицей.
Но все должно быть проще...
19 Дурындина
 
24.03.14
08:53
а можно примерно набросать, почему то примерно не представляю себе
20 ИС-2
 
naïve
24.03.14
09:35
номенклатура должна браться из шапки?
операция из табличной части?
21 Дурындина
 
24.03.14
09:40
да!все так!
22 Дурындина
 
24.03.14
09:40
и количество тоже из шапки!
23 ИС-2
 
naïve
24.03.14
10:28
сейчас запрос накидаю...
24 Дурындина
 
24.03.14
10:28
Жду"
25 ИС-2
 
naïve
24.03.14
10:32
документа у меня такого нет, поэтому делал на РТиУ

ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Номенлатура,
    РеализацияТоваровУслугТовары.Ссылка.Номер КАК Номер,
    РеализацияТоваровУслугТовары.Склад КАК Операция,
    0 КАК СуммаДокумента
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Контрагент.ГоловнойКонтрагент = &Контрагент
    И НАЧАЛОПЕРИОДА(РеализацияТоваровУслугТовары.Ссылка.Дата, ДЕНЬ) = &Дата

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    РеализацияТоваровУслугТовары.Ссылка.Контрагент,
    РеализацияТоваровУслугТовары.Ссылка.Номер,
    РеализацияТоваровУслугТовары.Склад,
    РеализацияТоваровУслугТовары.Ссылка.СуммаДокумента
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Контрагент.ГоловнойКонтрагент = &Контрагент
    И НАЧАЛОПЕРИОДА(РеализацияТоваровУслугТовары.Ссылка.Дата, ДЕНЬ) = &Дата
ИТОГИ
    СУММА(СуммаДокумента)
ПО
    Номенлатура,
    Номер
26 ИС-2
 
naïve
24.03.14
10:33
в первом запросе я получаю только значения, во 2-м нужное количество и они накладываются друг на друга
27 Дурындина
 
24.03.14
10:58
Переписала как
"ВЫБРАТЬ
    |    ЗаданиеОперации.Ссылка.Номенклатура КАК Номенклатура,
    |    ЗаданиеОперации.Ссылка КАК Ссылка,
    |ЗаданиеОперации.ТехОперация,
    |    0 КАК  КолВыданных
    |ИЗ
    |    Документ.Задание.Операции КАК ЗаданиеОперации
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ЗаданиеОперации.Ссылка.Номенклатура,
    |    ЗаданиеОперации.Ссылка,
    |    ЗаданиеОперации.ТехОперация,
    |    ЗаданиеОперации.Ссылка.КолВыданных
    |ИЗ
    |    Документ.Задание.Операции КАК ЗаданиеОперации
    |ИТОГИ
    |    СУММА(КолВыданных)
    |ПО
    |    Номенклатура,
    |    Ссылка"    ;
28 Дурындина
 
24.03.14
11:00
однако выводит ненправильно
примерно так
молоко
001
варка
паковка
варка
паковка
002
варка
паковка
варка
паковка

и количество запредельное!
29 ИС-2
 
naïve
24.03.14
11:59
думаю из-за того, что у меня склад был одинаковый, а тут разный
30 ИС-2
 
naïve
24.03.14
11:59
ВЫБРАТЬ различные
    РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Номенлатура,
    РеализацияТоваровУслугТовары.Ссылка.Номер КАК Номер,
    РеализацияТоваровУслугТовары.Склад КАК Операция,
    0 КАК СуммаДокумента
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Контрагент.ГоловнойКонтрагент = &Контрагент
    И НАЧАЛОПЕРИОДА(РеализацияТоваровУслугТовары.Ссылка.Дата, ДЕНЬ) = &Дата

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    РеализацияТоваровУслугТовары.Ссылка.Контрагент,
    РеализацияТоваровУслугТовары.Ссылка.Номер,
    неопределено,
    РеализацияТоваровУслугТовары.Ссылка.СуммаДокумента
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Контрагент.ГоловнойКонтрагент = &Контрагент
    И НАЧАЛОПЕРИОДА(РеализацияТоваровУслугТовары.Ссылка.Дата, ДЕНЬ) = &Дата
ИТОГИ
    СУММА(СуммаДокумента)
ПО
    Номенлатура,
    Номер
31 Дурындина
 
24.03.14
12:33
ИС-2, Да все работает, спасибо, но какое то одно странное но
32 cw014
 
24.03.14
12:35
(30) Логично
33 ИС-2
 
naïve
24.03.14
12:38
(31) пустая строка? Ее просто исключите при выводе.

Эта задача достаточно часто встречается. Я ее решаю так. Но думаю есть более красивый способ. Я жду его от коллег...
34 cw014
 
24.03.14
12:42
(33) Можно вместо пустой строки сделать null и обрамить вложенным запросом, с выборкой всего, что "НЕ ЕСТЬ NULL" (но я могу и ошибаться)
35 Дурындина
 
24.03.14
12:42
Да, именно, пустая строка!
36 Дурындина
 
24.03.14
12:42
cw014, а нука! Удивите нас!
37 cw014
 
24.03.14
12:57
Ну я ошибся, сорри
38 ИС-2
 
naïve
24.03.14
13:30
(37) проблема в том, что в любом случае у детальных записей будут ресурсы будут просуммированы и данные будут некорректны. Фактически надо сумму ставить у 1-й записи, а в остальных 0. Реализация через соеднинение будет получаться слишком сложной (найти 1 запись).
Но должно же быть нормальное решение...
39 ИС-2
 
naïve
24.03.14
13:31
кстати пол надо сменить и повесить фотку - это правило форума.
Если бы была фотка, то в теме не я один работал, а весь мужской форум.
Посмотри темы девушек с фотками - там куча народу :)
40 Дурындина
 
24.03.14
14:19
Фотку поменяла, а никаких табунов мужиков что-то не наблюдается!)))
41 Дурындина
 
24.03.14
16:04
кстати, как в таком случае обойти в выводе эти пустые строки? :D
42 kumena
 
24.03.14
16:21
"ВЫБРАТЬ
|    ЗаданиеОперации.Ссылка.Номер КАК Номер,
|    ЗаданиеОперации.Ссылка.Номенклатура КАК Номенклатура,
|    ЗаданиеОперации.Ссылка.Количество КАК Количество
|ИЗ
|    Документ.Задание.Операции КАК ЗаданиеОперации
|
|СГРУППИРОВАТЬ ПО
|    ЗаданиеОперации.Ссылка.Номенклатура,
|    ЗаданиеОперации.Ссылка.Номер,
|    ЗаданиеОперации.Ссылка.Количество
|ИТОГИ
|    Максимум(Количество)
|ПО
|    Номенклатура, Номер";

первая выборка по группировке номенклатура
вторая по номерам из группировки, указываешь количество
третья выборка детальная, там будут операции
43 kumena
 
24.03.14
16:23
вторая по номерам из группировки, указываешь количество
-> по группировке номер,  +выводишь в макет количество.
44 kumena
 
24.03.14
16:25
а фотка твоя?
45 Дурындина
 
24.03.14
16:26
kumena, а про детальную выборку подробнее, это интересно
46 Дурындина
 
24.03.14
16:28
а фотка то и не моя
47 Дурындина
 
24.03.14
16:29
так это понятно, а вот про операции, операции мне интересно
48 kumena
 
24.03.14
16:33
что не понятно про операции?
49 kumena
 
24.03.14
16:33
(46) жаль!!!
50 Дурындина
 
24.03.14
16:34
Как выводить то их!
51 Дурындина
 
24.03.14
16:35
а че, понравилось? Так я это, ассоциативно выбрала похожую, тока сиськи меньше, это печально конечно
52 kumena
 
24.03.14
16:36
весьма! сиськи не главное!
53 Дурындина
 
24.03.14
16:36
а что главное?
54 kumena
 
24.03.14
16:37
53 это сложный вопрос, сложней чем про группировки. пока сказать не готов )
55 Дурындина
 
24.03.14
16:39
что же вы, до 40 лет дожили, а что в жизни главное, так и не определили для себя! Ай-яй!
56 kumena
 
24.03.14
16:41
про группировки.
вобщем сделай как у тебя в 0 посте, только
результат выбирай так
Номенклатура = Результат.Выбрать("ОбходПоГруппировкам", Номенклатура)
Номер = Номенклатура.Выбрать(Обход по группировке номер)

Детальная = Номер.Выбрать();
57 kumena
 
24.03.14
16:41
55, так вот, первым делом самолеты! )))
58 Дурындина
 
24.03.14
16:44
Так я же писала  
Выборка3=Выборка2.Выбрать();
                                      Пока Выборка3.Следующий() Цикл
                                            ОбластьОперация.Параметры.Операция=Выборка3.ТехОперация
;
                                         ТабДок.Вывести(ОбластьОперация);

Только где я возьму операцию для вывода?
59 kumena
 
24.03.14
16:46
>>Только где я возьму операцию для вывода?
отладчиком смотреть пробовала? в переменной третьей выборки все записи детальные, т.е. есть все что выбрано

"ВЫБРАТЬ
|    ЗаданиеОперации.Ссылка.Номер КАК Номер,
|    ЗаданиеОперации.Ссылка.Номенклатура КАК Номенклатура,
|    ЗаданиеОперации.Ссылка.Количество КАК Количество
|ИЗ
|    Документ.Задание.Операции КАК ЗаданиеОперации
|
|СГРУППИРОВАТЬ ПО
|    ЗаданиеОперации.Ссылка.Номенклатура,
|    ЗаданиеОперации.Ссылка.Номер,
|    ЗаданиеОперации.Ссылка.Количество
60 kumena
 
24.03.14
16:47
с учетом выбранных вышестоящих группировок
61 kumena
 
24.03.14
16:56
если что - пиши завтра!
62 Дурындина
 
25.03.14
08:42
хыыыы, я туплю, но не могу вывести в области нужные мне поля из третьей выборки
63 Дурындина
 
25.03.14
08:42
получается какая-то ересь
64 kumena
 
25.03.14
12:07
Документ.Задание.Операции
в этой табличной части реквизиты должны быть этой операции, вот и выбери в запрос их. третья выборка для них.
65 cw014
 
25.03.14
12:38
(64) Да
(38) Вот оно красивое решение
66 Дурындина
 
25.03.14
15:58
а можно кусочек кода, как выводить в детальной выборке)))
67 Дурындина
 
25.03.14
16:02
строчечку, заветную
68 kumena
 
25.03.14
17:24
"ВЫБРАТЬ
|    ЗаданиеОперации.Ссылка.Номер КАК Номер,
|    ЗаданиеОперации.Ссылка.Номенклатура КАК Номенклатура,
|    ЗаданиеОперации.Ссылка.Количество КАК Количество
|    ,ЗаданиеОперации.ТвойРеквизитОперации    
|ИЗ
|    Документ.Задание.Операции КАК ЗаданиеОперации
|
|СГРУППИРОВАТЬ ПО
|    ЗаданиеОперации.Ссылка.Номенклатура,
|    ЗаданиеОперации.Ссылка.Номер,
|    ЗаданиеОперации.Ссылка.Количество
|ИТОГИ
|    Максимум(Количество)
|ПО
|    Номенклатура, Номер";

//итоговая группировка по номенклатуре из итогов
Номенклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
Пока Номенклатура.Следующий() Цикл
//выводим номенклатуру

    // итоговая группировка по номерам из итогов
    НомераДокументов = Номенклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номер");
    Пока НомераДокументов.Следующий() Цикл
    //выводим номера (документы)

    //Детальная выборка
        Детали = НомераДокументов.Выбрать();
        Пока Детали.Следующий() Цикл
        // выводим детальные записи, в данном случае ТвойРеквизитОперации
        КонецЦикла;
    КонецЦикла;
КонецЦикла;
69 kumena
 
25.03.14
17:24
фройляйн, с вас причитается! )))
70 Дурындина
 
25.03.14
22:28
kumena? А почему Максимум(Количество)? Мне нужна сумма по верхней группировке, если использовать Максимум, то да, все выводится правильно, но в итоговой группировке максимальное количество по одному из документов, но это и логично.
Выводит примерно так
молоко      50
0001        30
варить
парить
паковать
0002         50
варить
парить
паковать
71 Дурындина
 
25.03.14
22:28
а должно быть в номенклатуре количество 80!
72 Дурындина
 
25.03.14
22:30
так что это хорошо, но получается ка бы и не совсем, хны хны
73 kumena
 
26.03.14
08:25
лови, для совсем правильного запроса еще представления можешь выбрать.

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

//итоговая группировка по номенклатуре из итогов
Номенклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
Пока Номенклатура.Следующий() Цикл
//выводим номенклатуру +НоменклатураКоличество

    // итоговая группировка по номерам из итогов
    НомераДокументов = Номенклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Документ");
    Пока НомераДокументов.Следующий() Цикл
    //выводим номера (документы) + ДокументКоличество

    //Детальная выборка
        Детали = НомераДокументов.Выбрать();
        Пока Детали.Следующий() Цикл
        // выводим детальные записи - т.е операция
        КонецЦикла;
    КонецЦикла;
КонецЦикла;
74 kumena
 
26.03.14
08:26
>> А почему Максимум(Количество)?

потому что сумма количества по детальным записям не должно сходиться с итоговыми группировками
75 kumena
 
26.03.14
08:28
>> Мне нужна сумма по верхней группировке,

это твое пожелание не указано в 0, там другие требования
, или я не заметил?
>> Нужно вывести последовательно - номенклатуру, все документы, кот. относятся к ней с количеством по документу, и соответственно на каждый документ - операции.
76 kumena
 
26.03.14
08:30
а блин, ошибочка
|ИТОГИ
|    Максимум(ДокументКоличество)

добавь еще
,|    Максимум(НоменклатураКоличество)
77 Дурындина
 
26.03.14
10:21
kumena, спасибо, буду пробовать, что то правда замудрено как то, а в 0 посте, да про итоговое кол-во по номенклатуре не упомянула*краснеет*, но потом приводила пример как отчет должен выводится