Имя: Пароль:
1C
1C 7.7
v7: Индексированная таблица
0 Asakra
 
17.10.13
07:53
Пишу такой код:

    Запрос = СоздатьОбъект("ПрямойЗапрос");
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ВложенныйЗапрос.Номенклатура        КАК [Номенклатура    :Справочник.Номенклатура],
    |    $СпрНоменклатура.ПолнНаименование    КАК [Представление    :Строка],
    |    
    |    ВЫБОР
    |        КОГДА :ЕстьАртикул = 1
    |            ТОГДА $СпрНоменклатура.Артикул
    |        ИНАЧЕ ''
    |    КОНЕЦ                                КАК [Артикул        :Строка],
    |
    |    $ЕдиницыИзмерений.ТекущийЭлемент    КАК [Единица        :Справочник.Единицы],
    |
    |    ВложенныйЗапрос.Количество            КАК [Количество        :Число.15.3],
    |    ВложенныйЗапрос.Цена                КАК [Цена            :Число.15.2],
    |    ВложенныйЗапрос.Сумма                КАК [Сумма            :Число.15.2],
    |    ВложенныйЗапрос.СуммаНДС            КАК [СуммаНДС        :Число.15.2],
    |
    |    ВложенныйЗапрос.Сумма +
    |    ВЫБОР
    |        КОГДА :СуммаВклНДС = 0
    |            ТОГДА ВложенныйЗапрос.СуммаНДС
    |        ИНАЧЕ 0
    |    КОНЕЦ                                КАК [Всего            :Число.15.2],
    |
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(ЕдиницыИзмерений.Коэффициент, 0) = 0
    |            ТОГДА 0
    |        ИНАЧЕ ВложенныйЗапрос.Количество/ЕдиницыИзмерений.Коэффициент
    |    КОНЕЦ                                КАК КолКоробок,
    |
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(ЕдиницыИзмерений.Коэффициент, 0) * ЕСТЬNULL(ЕдиницыИзмерений.Вес, 0) = 0
    |            ТОГДА 0
    |        ИНАЧЕ ВложенныйЗапрос.Количество/ЕдиницыИзмерений.Коэффициент * ЕдиницыИзмерений.Вес
    |    КОНЕЦ                                КАК Вес,
    |
    |    ВложенныйЗапрос.КоличествоЗаявки    КАК [КоличествоЗаявки    :Число.15.3],
    |    ВложенныйЗапрос.ЦенаЗаявки            КАК [ЦенаЗаявки            :Число.15.2],
    |    ВложенныйЗапрос.СуммаНДСЗаявки        КАК [СуммаНДСЗаявки        :Число.15.2],
    |    ВложенныйЗапрос.СуммаЗаявки            КАК СуммаЗаявки,
    |    ВложенныйЗапрос.ВсегоПоЗаявке        КАК [ВсегоПоЗаявке        :Число.15.2],
    |
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(ЕдиницыИзмерений.Коэффициент, 0) = 0
    |            ТОГДА 0
    |        ИНАЧЕ ВложенныйЗапрос.КоличествоЗаявки/ЕдиницыИзмерений.Коэффициент
    |    КОНЕЦ                                КАК КолКоробокЗаявки,
    |
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(ЕдиницыИзмерений.Коэффициент, 0) * ЕСТЬNULL(ЕдиницыИзмерений.Вес, 0) = 0
    |            ТОГДА 0
    |        ИНАЧЕ ВложенныйЗапрос.КоличествоЗаявки/ЕдиницыИзмерений.Коэффициент * ЕдиницыИзмерений.Вес
    |    КОНЕЦ                                КАК ВесЗаявки,
    |    
    |    ОстаткиТМЦ.КоличествоОстаток        КАК [ОстатокТМЦ            :Число.15.3],
    |
    |    ВЫБОР
    |        КОГДА ВЫРАЗИТЬ(ВложенныйЗапрос.Количество КАК NUMERIC(15,3)) = 0
    |            ТОГДА 1
    |        КОГДА ВЫРАЗИТЬ(ВложенныйЗапрос.КоличествоЗаявки КАК NUMERIC(15,3)) <> 0
    |            ТОГДА 1
    |        ИНАЧЕ 0
    |    КОНЕЦ                                КАК Недопоставка
    |
    |ИЗ
    |    (ВЫБРАТЬ
    |        ОсновнаяТаблица.Номенклатура            КАК Номенклатура,
    |        СУММА(ОсновнаяТаблица.Количество)        КАК Количество,
    |        СУММА(ОсновнаяТаблица.Цена)                КАК Цена,
    |        СУММА(ОсновнаяТаблица.Сумма)            КАК Сумма,
    |        СУММА(ОсновнаяТаблица.СуммаНДС)            КАК СуммаНДС,
    |        СУММА(ОсновнаяТаблица.КоличествоЗаявки)    КАК КоличествоЗаявки,
    |        СУММА(ОсновнаяТаблица.ЦенаЗаявки)        КАК ЦенаЗаявки,
    |        СУММА(ОсновнаяТаблица.СуммаЗаявки)        КАК СуммаЗаявки,
    |        СУММА(ОсновнаяТаблица.СуммаНДСЗаявки)    КАК СуммаНДСЗаявки,
    |        СУММА(ОсновнаяТаблица.ВсегоПоЗаявке)    КАК ВсегоПоЗаявке
    |
    |    ИЗ
    |        (ВЫБРАТЬ
    |            $ДокСтроки.Номенклатура    КАК Номенклатура,
    |            $ДокСтроки.Количество    КАК Количество,
    |            $ДокСтроки.Цена            КАК Цена,
    |            $ДокСтроки.Сумма        КАК Сумма,
    |            $ДокСтроки.СуммаНДС        КАК СуммаНДС,
    |            0                        КАК КоличествоЗаявки,
    |            0                        КАК ЦенаЗаявки,
    |            0                        КАК СуммаЗаявки,
    |            0                        КАК СуммаНДСЗаявки,
    |            0                        КАК ВсегоПоЗаявке
    |
    |        ИЗ
    |            ДокументСтроки.Реализация КАК ДокСтроки
    |
    |        ГДЕ
    |            $ДокСтроки.ТекущийДокумент = :Документ
    |
    |        ОБЪЕДИНИТЬ
    |
    |        ВЫБРАТЬ
    |            ОстаткиЗаявки.Номенклатура,
    |            0,
    |            0,
    |            0,
    |            0,
    |            ОстаткиЗаявки.КоличествоРасходОстаток,
    |            $Заявка.Цена,
    |            $Заявка.Сумма / ЕСТЬNULL($Заявка.Количество, 1) * ОстаткиЗаявки.КоличествоРасходОстаток,
    |            $Заявка.СуммаНДС,
    |            ОстаткиЗаявки.СтоимостьРасходОстаток
    |
    |        ИЗ
    |            $РегистрОстатки.Заявки(:Документ~, ЗаявкаПокупателя = :Заявка, Номенклатура, (КоличествоРасход,СтоимостьРасход)) КАК ОстаткиЗаявки
    |
    |        ЛЕВОЕ СОЕДИНЕНИЕ ДокументСтроки.ЗаявкаПокупателя КАК Заявка
    |            ПО $Заявка.Номенклатура = ОстаткиЗаявки.Номенклатура
    |
    |        ГДЕ
    |            $Заявка.ТекущийДокумент = :Заявка И ОстаткиЗаявки.КоличествоРасходОстаток > 0
    |
    |        ) КАК ОсновнаяТаблица
    |
    |    СГРУППИРОВАТЬ
    |        ОсновнаяТаблица.Номенклатура
    |
    |    ) КАК ВложенныйЗапрос
    |
    |    ЛЕВОЕ СОЕДИНЕНИЕ $РегистрОстатки.ОстаткиТМЦ(:Документ~, Склад = :Склад, Номенклатура, Количество) КАК ОстаткиТМЦ
    |        ПО ВложенныйЗапрос.Номенклатура = ОстаткиТМЦ.Номенклатура
    |
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
    |        ПО ВложенныйЗапрос.Номенклатура = $СпрНоменклатура.ТекущийЭлемент
    |
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Единицы КАК ЕдиницыИзмерений
    |        ПО $СпрНоменклатура.ОсновнаяЕдиница = $ЕдиницыИзмерений.ТекущийЭлемент
    |";
    
    Запрос.УстановитьТекстовыйПараметр("Документ"            , Докум);
    Запрос.УстановитьТекстовыйПараметр("Склад"                , Докум.Склад);
    Запрос.УстановитьТекстовыйПараметр("ЕстьАртикул"        , Константа.ПоказыватьАртикул);
    Запрос.УстановитьТекстовыйПараметр("СуммаВклНДС"        , ?((Докум.УчитыватьНДС = 1) И (Докум.СуммаВклНДС = 0), 0, 1));
    Запрос.УстановитьТекстовыйПараметр("Заявка"                , Заявка);
    
    // }
    
    Выборка = Запрос.Выполнить();
    
    Выборка.НоваяКолонка("Родитель");
    
    Выборка.ВыбратьСтроки();
    Пока Выборка.ПолучитьСтроку() = 1 Цикл
        ПолныйКод = Выборка.Номенклатура.ПолныйКод();
        Поз = Найти(ПолныйКод, "/");
        Если Поз > 0 Тогда
            Выборка.Родитель = Лев(ПолныйКод, Поз - 1);
        КонецЕсли;
    КонецЦикла;
    
    Выборка.Сортировать("Родитель,Представление");
    Выборка.Группировать("Недопоставка: Недопоставка", "Недопоставка");
    Выборка.Сортировать("Недопоставка");

После чего "выборка" не содержит колонку тзПотомки. Почему?

Пишу
    Запрос = СоздатьОбъект("ПрямойЗапрос");
    Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Номенклатура";
    Выборка = Запрос.Выполнить();
    Выборка.Группировать("ISFOLDER: ISFOLDER", );

Колонки тзПотомки опять нет

Открываю раннее написанный отчет, там "Группировать" работает так как надо.
1 Aleksey
 
17.10.13
07:56
(1) А что по твоему там должно быть?
2 Aleksey
 
17.10.13
07:58
Запрос = СоздатьОбъект("ПрямойЗапрос");
    Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник.Номенклатура";
    Выборка = Запрос.Выполнить();
    Выборка.Группировать("ISFOLDER: ISFOLDER", );

Колонки тзПотомки опять нет

Правильно и не будет


Выборка.Группировать("ISFOLDER: ISFOLDER, Код:Код", ); - а так будет
3 Aleksey
 
17.10.13
07:59
точнее
Выборка.Группировать("ISFOLDER: ISFOLDER, ID:ID", );
4 Chai Nic
 
17.10.13
08:01
Группировать удаляет все колонки, кроме группировочных и суммовых.
5 Mikeware
 
17.10.13
08:01
(2)(3) не будет :-)
6 Aleksey
 
17.10.13
08:02
(4) Это не ТЗ, а индексированная таблица, тут не удаляются колонки

(5) Почему?
7 Aleksey
 
17.10.13
08:03
Потому что ковычек нет после запятой?
8 Aleksey
 
17.10.13
08:03
или потому что запятая, вместо точки с запятой?
9 Aleksey
 
17.10.13
08:03
Выборка.Группировать("ISFOLDER: ISFOLDER; ID:ID","");
10 ADirks
 
17.10.13
08:04
Потому что документацию читать надо
11 Aleksey
 
17.10.13
08:05
(10) О великий гуру потянулся. Стена там ==>.
Нечего по теме написать - не пиши
12 ADirks
 
17.10.13
08:07
Рекомендация прочесть документацию - это как раз по теме.
13 Aleksey
 
17.10.13
08:09
(12) по теме это когда копипаст на текст документации. А рекомендация почитать - это из серии "я нехрена не знаю поэтому пошлю ТС читать документацию, чтобы выглядеть умнее"
14 Mikeware
 
17.10.13
08:09
(11) раз знаешь, где стена - или побейся :-)
------
Синтаксис: Группировать(стрГруппировки, стрКолонкиСумм, [чРасшифровкаПоследнегоУровня = 0])

Параметры:

        стрГруппировки - тип: Строка. Строка, описывающая требуемую структуру группировки. Задаётся в виде <ИмяИндекса1>: <ИндексноеВыражение1> [; <ИмяИндекса2>: <ИндексноеВыражение2> ... ]. ИндексноеВыражение - строка в том же формате, что и для метода ДобавитьИндекс(), с одним дополнением: если в списке модификаторов колонки присутствует символ '&', то по этой колонке будут посчитаны итоги по группам справочника. Колонка с таким модификатором может быть только одна на каждом уровне группировки.
        стрКолонкиСумм - тип: Строка. Строка с колонками, по которым нужно считать суммы.
        чРасшифровкаПоследнегоУровня - тип: Число. 1 - в каждой строке последнего уровня группировки будет таблица с расшифровкой, содержащая строки исходной таблицы в нетронутом виде. 0 - последний уровень будет свёрнут.

Описание: формирует таблицу с древовидной структурой в соответствии с группировками. На каждом уровне группировки остаются только уникальные значения по соответствующему индексу. В колонки сумм записываются суммы по всем строкам с совпадающим значением ключа. Строки с совпадающими значениями ключа записываются в таблицу, которая помещается в колонку тзПотомки - эта колонка создаётся в процессе группировки.
15 Mikeware
 
17.10.13
08:11
(13) пора бы уже привыкнуть читать документацию, если советуют...
16 ДенисЧ
 
17.10.13
08:13
(13) Кхм.... Возникать в адрес одного из разработчиков инструмента, который ты пытаешься использовать...
Это, минимум, неумно...
17 Asakra
 
17.10.13
08:13
(2) Спасибо за быстрый ответ. так оно есть. второй индекс кто будет добавлять? :)
18 Aleksey
 
17.10.13
08:13
(14) эээ я же поправил в(9)

(16) Они мне не подписаны, а фотки всех разработчиков мне не подвезли
19 Aleksey
 
17.10.13
08:16
(14) К тому же
"Строки с совпадающими значениями ключа записываются в таблицу, которая помещается в колонку тзПотомки"

Т.е. логично предположить что в выюорке Выборка.Группировать("ISFOLDER: ISFOLDER", ); есть повторяющиеся значения ключа, но при этом колонки тзПотомки нет,

Т.е. мне вот лично до сих пор непонятно почему нет, поэтому приходится вводить дополнительную группировку
20 ADirks
 
17.10.13
08:17
Документация - это не беллетристика. Её _внимательно_ читать надо.
21 Aleksey
 
17.10.13
08:20
(20) Ну уж простите, что есть в открытом доступе, тем и пользуемся. Это может у вас, у разработчиков, своя документация которая в голове. А вот всякие особенности которые может быть мимоходом и написаны в середине топика на 1000 сообщений в (14) не отражены
22 Aleksey
 
17.10.13
08:22
Ладно всем добра, а мне на работу пора.
Автор свою проблему решил, поэтому топик можно закрывать дабы не уйти в дикий оффтопик
23 Asakra
 
17.10.13
08:25
(19) уже натыкался на эти грабли, да видать всего не упомнишь... чиркнули бы разработчики в доку, что тзПотомки формируется минимум при двух индексах, потому что, потому... подобных глупых тем было б меньше
24 Salimbek
 
17.10.13
08:27
(23) Какие нафиг два индекса? что непонятного в этом?: "чРасшифровкаПоследнегоУровня - тип: Число. 1 - в каждой строке последнего уровня группировки будет таблица с расшифровкой, содержащая строки исходной таблицы в нетронутом виде. 0 - последний уровень будет свёрнут."
т.е. если не укажешь явно
Выборка.Группировать("ISFOLDER: ISFOLDER", "", 1);
то не будет у тебя никакой ТЗПотомки
25 Salimbek
 
17.10.13
08:31
и почему ищешь Родителя таким странным перебором?
Что мешает в запросе добавить: $СпрНоменклатура.ParentId        КАК [Родитель    :Справочник.Номенклатура],
26 Asakra
 
17.10.13
08:32
(24) Да так и есть. Спасибо. Будем учиться правильно читать доку :)
(25) т.к.самый верхний родитель нужен
27 Salimbek
 
17.10.13
08:38
(26) Ясно, не внимательно посмотрел.
Также не обратил внимания, что это "ПрямойЗапрос", а там не ".ParentId", а просто ".Родитель", так что пост (25) совсем мимо кассы.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.