Имя: Пароль:
1C
 
Итоги по иерархии: как исключить верхний уровень?
0 Гений 1С
 
гуру
11.01.23
21:58
Есть иерархия:
Товары
- Пиво
- Водка
- Квас

И запрос с ИТОГИ по ИЕРАРХИЯ

Можно как-то на уровне запроса исключить Товары?
Чтобы выгружалось так:

- Пиво
- Водка
- Квас

А то на сайт выгружается именно таким запросом и выгружает верхнюю группу. (Розница)
1 НафНаф
 
11.01.23
22:15
Зачем на уровне запроса?
2 Быдло замкадное
 
11.01.23
23:20
Где не товары.родитель пустая ссылка
3 Гений 1С
 
гуру
12.01.23
07:39
(2) не думаю.
4 Гений 1С
 
гуру
12.01.23
07:39
(1) чтобы потом дерево не перебирать
5 НафНаф
 
12.01.23
08:15
тогда мучайся https://infostart.ru/1c/articles/242824/
6 Гений 1С
 
гуру
12.01.23
13:24
(5) там запрос, а не СКД
7 Гений 1С
 
гуру
12.01.23
13:32
(2)

Возьмем пример с ИТС

https://its.1c.ru/db/metod8dev/content/2659/hdoc


ВЫБРАТЬ
    Номенклатура.Код,
    Номенклатура.Наименование КАК Наименование,
    Номенклатура.ЗакупочнаяЦена

ИЗ Справочник.Номенклатура КАК Номенклатура

ГДЕ
    (Номенклатура.ЭтоГруппа = ЛОЖЬ)

УПОРЯДОЧИТЬ ПО Наименование

ИТОГИ ПО Номенклатура.Ссылка ТОЛЬКО ИЕРАРХИЯ


Вот так не работает, что и логично:

ВЫБРАТЬ
    Номенклатура.Код,
    Номенклатура.Наименование КАК Наименование

ИЗ Справочник.Номенклатура КАК Номенклатура

ГДЕ
    (Номенклатура.ЭтоГруппа = ЛОЖЬ)


И Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

УПОРЯДОЧИТЬ ПО Наименование


ИТОГИ ПО Номенклатура.Ссылка ТОЛЬКО ИЕРАРХИЯ



8 Быдло замкадное
 
12.01.23
13:37
(7) почему не работает то? Выведи поле Номенклатура.Родитель. Что у тебя там для элемента Товары?
9 mistеr
 
12.01.23
13:40
(4) Не ленись
10 Ivan_495
 
12.01.23
13:43
первый запрос во врем таблицу, во втором убираем строки = товары
11 Гений 1С
 
гуру
12.01.23
14:17
(10) у меня есть одна идея, счас попробую
12 Гений 1С
 
гуру
12.01.23
14:25
Идея не прокатила, а жаль:


ВЫБРАТЬ
    Номенклатура.Код КАК Код,
    Номенклатура.Наименование КАК Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа = ЛОЖЬ
    И Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

ИТОГИ ПО
    ВЫБОР
        КОГДА Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
            ТОГДА ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
        ИНАЧЕ Номенклатура.Ссылка
    КОНЕЦ ТОЛЬКО ИЕРАРХИЯ КАК Х
13 Гений 1С
 
гуру
12.01.23
14:36
(10) так не получится, потому что этот запрос обходится по итогам. а плоская таблица как будет обойдена? отож
14 mikecool
 
12.01.23
14:42
(4) так тебе надо дерево без дерева?
15 НафНаф
 
12.01.23
14:43
и не получится в запросе, только в СКД
потому что все условия в запросе применяются на уровне SQL к "плоским детальным записям", а ИЕРАРХИЯ уже достраивается движком 1С после получения SQL-запроса.
16 mistеr
 
12.01.23
14:44
(4) Вместо перебора дерева обходи выборку правильным способом.
17 НафНаф
 
12.01.23
14:45
(14) ему надо из дерева взять поддеревья, начиная со второго уровня, и построить из них новое дерево. В 1С библиотека коллекций так себе, поэтому много кодить придется.
18 mikecool
 
12.01.23
14:47
нет бы при выгрузке исключить первую выборку, так нет же - будем велокат изобретать...
19 Гений 1С
 
гуру
12.01.23
14:48
(16) там не мой код, не хочу глубоко вмешиваться. тогда проще убрать из дерева верхний уровень и протолкнуть дальше, я думал просто это как-то на уровне запроса можно сделать.
20 Гений 1С
 
гуру
12.01.23
14:48
(18) это как?
21 Гений 1С
 
гуру
12.01.23
14:49
(15) из обработки полученного дерева значений и применения СКД мне кажется проще через обработку ДЗ. Но я надеялся, что это как-то на уровне запроса можно сделать.
22 mistеr
 
12.01.23
14:50
(19) Понятно, см. (9)
23 mistеr
 
12.01.23
14:51
(21) Это делается на уровне выборки, читай СП.
24 Гений 1С
 
гуру
12.01.23
14:53
(23) что можно прописывать между ИТОГИ ПО ... ИЕРАРХИЯ на месте ... ?
Где это в СП?
25 НафНаф
 
12.01.23
15:15
(23) жги решение
26 mistеr
 
12.01.23
15:17
(24) Про Выбрать() и про выборку читай внимательно.
27 Ivan_495
 
12.01.23
15:32
когда данные через выбрать перебираешь первыми идут итоги
28 Гений 1С
 
гуру
12.01.23
15:38
(26) 0 бит
29 Сергиус
 
12.01.23
15:39
(0)Можно попробовать ГДЕ Уровень() > 0 или как-то так.
30 Гений 1С
 
гуру
12.01.23
15:50
(29) это детальные записи фильтранет, а не результат.

Вот запрос, который надо ковырять Розница, редакция 2.3 (2.3.14.18) модуль ОбменССайтом:


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

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

31 Ivan_495
 
12.01.23
16:02
классификатор перебирай и удаляй ненужное
32 Гений 1С
 
гуру
12.01.23
16:04
(31) там дерево значений не так-то просто перебирать.
ладно, в итоге не стал париться с запросом, обрабатываю уже дерево в итоге:


&Вместо("ЗаполнитьКлассификатор")
Процедура дор_ЗаполнитьКлассификатор(ДанныеДляВыгрузкиКаталога, Классификатор, ПрикладныеПараметры)
    ПродолжитьВызов(ДанныеДляВыгрузкиКаталога, Классификатор, ПрикладныеПараметры);  
    
    //Осипов 2023-01-12 убираем группу Товар
    //Классификатор - это ДеревоЗначений
    Если ТипЗнч(Классификатор) = Тип("ДеревоЗначений") Тогда
        Для Каждого Строка ИЗ Классификатор.Строки Цикл
            Если ВРЕГ(Строка.Номенклатура.Наименование) = ВРЕГ("Товары") Тогда
                Индекс = Классификатор.Строки.Индекс(Строка);
                //Для Каждого ПодчСтрока ИЗ Строка.Строки Цикл
                //    Классификатор.Строки.Вставить(Индекс);                    
                //КонецЦикла;  
                Для Каждого ПодчСтрока ИЗ Строка.Строки Цикл
                    Перенести(ПодчСтрока, Классификатор, Индекс);                    
                КонецЦикла;                            
                Классификатор.Строки.Удалить(Строка);
                Прервать;
                
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры


Процедура Перенести(Ветка,Куда, Индекс = Неопределено) Экспорт
    //v8: Как у строки дерева поменять родителя?
    Если Индекс = Неопределено Тогда
        НоваяВетка=Куда.Строки.Добавить();
    Иначе
        НоваяВетка=Куда.Строки.Вставить(Индекс);
    КонецЕсли;
    ЗаполнитьЗначенияСвойств(НоваяВетка,Ветка);
    Для каждого ПодСтрока из Ветка.Строки цикл Перенести(Подстрока,НоваяВетка); КонецЦикла;
    Ветка.Родитель.Строки.Удалить(Ветка);
КонецПроцедуры


Чутака доработал перемещение веток, чтобы порядок сохранялся.
33 НафНаф
 
12.01.23
16:11
Если ВРЕГ(Строка.Номенклатура.Наименование) = ВРЕГ("Товары") Тогда

ГЕНИАЛЬНО!
34 Kassern
 
12.01.23
16:26
(33) Ага, потом будет "Товары для сайта" и все, зовите Геню за доп плату)
35 Гений 1С
 
гуру
12.01.23
16:42
(34) ой, как смешно. гыгыгы
36 Гений 1С
 
гуру
12.01.23
16:43
(33) буквоед клюёт на главное (несомненно) в этом коде.
37 Kassern
 
12.01.23
16:53
(35) Думаете такое невозможно, или вы намерено так делаете?
38 Kassern
 
12.01.23
17:04
(35) Что мешало сделать на подобии такого?
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Ссылка В ИЕРАРХИИ(&Товары)
    |    И Номенклатура.ЭтоГруппа = ИСТИНА
    |    И Номенклатура.Ссылка <> &Товары
    |
    |УПОРЯДОЧИТЬ ПО
    |    Ссылка ИЕРАРХИЯ";
39 Kassern
 
12.01.23
17:11
А вообще использовать папки номенклатуры для структуры сайта - такое себе решение. Во-первых, менеджерам может быть не удобно работать, так как уже есть привычная для них структура, во-вторых нет возможности привязать один и тот же товар к разным группам (полезно для всяких новогодних групп, или вообще сезонных)
40 Гений 1С
 
гуру
12.01.23
17:38
(38) спроси об этом разработчиков 1це:РОзница
41 Гений 1С
 
гуру
12.01.23
17:38
(39) напиши об этом на Селезневку. Код не мой
42 Гений 1С
 
гуру
12.01.23
17:39
(38) и кстати, так ты Товары не исключишь
43 Kassern
 
12.01.23
17:39
(40) Так вы же костыли свои наяриваете, вот и спрашиваю, что вам мешало так сделать, а не привязываться к имени верхнего уровня?
44 Kassern
 
12.01.23
17:40
(42) Вы пробовали? Надеюсь заметили, что я сортировку использую, а не итоги?
45 Kassern
 
12.01.23
17:40
(41) " Код не мой" - "Если ВРЕГ(Строка.Номенклатура.Наименование) = ВРЕГ("Товары") Тогда" - а это чье?)
46 Kassern
 
12.01.23
17:43
Когда вы используете Итоги по элементу ТолькоИерархия, то он вам выведет все группы в иерархии, для всех элементов в таблице.
47 Гений 1С
 
гуру
12.01.23
18:11
(43) 1с породила религию людей, которые понтуются тем, что типа использовать наименование товара плохо. Не всегда. Практики ржут над вами, теоретики из франчей
48 mistеr
 
12.01.23
18:16
(32) >Если ВРЕГ(Строка.Номенклатура.Наименование) = ВРЕГ("Товары") Тогда

Классика Г-кода!
49 Гений 1С
 
гуру
12.01.23
19:03
(38) Посмотрел запрос. Он выгрузится в плоскую таблицу, а не дерево. Не годится
50 Гений 1С
 
гуру
12.01.23
19:03
(48) о, секта перфекционистов набирает членов.
51 Конструктор1С
 
12.01.23
19:19
(48) это чудо-юдо иначе и не умеет. Даже удивляюсь, столько лет проработать, и кодить на уровне тупого джуна...
52 Гений 1С
 
гуру
12.01.23
20:42
(51) я ждал этого комментария именно от вас. А что джунового вы увидели в этом коде? Перетасовку иерархий?
53 Kassern
 
13.01.23
09:15
(49) Так вам же для сайта надо, зачем ему дерево? Достаточно выгружать тег с родителем и все, сайт сам без проблем соберет дерево.
54 Гений 1С
 
гуру
13.01.23
09:45
(53) сходи посмотри, как в рознице устроена выгрузка на сайт. Я тебе даже типовой код выложил в (30)
55 Ботаник Гарден Меран
 
13.01.23
09:52
(54)
Точно проверял (38)?
56 Гений 1С
 
гуру
13.01.23
10:15
(55) я же по русски написал - там таблица а не дерево при выгрузке
57 Kassern
 
13.01.23
10:17
(56) А сайт на чем? Битрикс? Как потом это дерево на сайт идет, в каком виде? xml файлик в архиве?
58 Kassern
 
13.01.23
10:17
И типа многоуровневый блок с иерархией при выгрузке каталога?
59 Ботаник Гарден Меран
 
13.01.23
10:18
(56)
У мну дерево.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка
|ПОМЕСТИТЬ ВТ0
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.ЭтоГруппа
|    И Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка
|ПОМЕСТИТЬ ВТ
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.ЭтоГруппа
|    И Номенклатура.Родитель В
|            (ВЫБРАТЬ
|                Т.Ссылка
|            ИЗ
|                ВТ0 КАК Т)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.Ссылка В ИЕРАРХИИ
|            (ВЫБРАТЬ
|                Т.Ссылка
|            ИЗ
|                ВТ КАК Т)
|
|УПОРЯДОЧИТЬ ПО
|    Ссылка ИЕРАРХИЯ
|АВТОУПОРЯДОЧИВАНИЕ
|";

пДерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

ЗначениеВРеквизитФормы(пДерево, "Дерево");
60 Гений 1С
 
гуру
13.01.23
10:21
(59) а зачем так много промежуточных таблиц? У меня в консоли выгружает в таблицу. Скинь скрин полученного дерева.
61 Kassern
 
13.01.23
10:21
(60) тут все дело в Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
62 Ryzeman
 
13.01.23
10:24
(35) Но ведь и правда смешно)
63 Ботаник Гарден Меран
 
13.01.23
10:27
(60)
Найди правильную консоль.
64 Гений 1С
 
гуру
13.01.23
12:03
(62) Смешно тут в том, что обсуждается серьезная проблема, а люди цепляются к поиску по наименованию. Это классика буквоедства. Потому программистам и не дают бабы, что у них это в крови - заниматься буквоедством где не надо.
65 Kassern
 
13.01.23
12:05
(64) Смешно тут то, что человек с таким стажем, не может написать простой запрос, а привязывается к имени корневого справочника (ладно бы к параметру какому-нибудь, где передается ссылка на корень). Это ведь джунская тема так реализовывать.
66 Kassern
 
13.01.23
12:06
Если это для вас "серьезная проблема", то я умываю руки))
67 Kassern
 
13.01.23
12:10
(64) Ответьте еще раз на вопрос, чем вас не устроил вариант с  "УПОРЯДОЧИТЬ ПО    Ссылка ИЕРАРХИЯ" и ДЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); ?
68 Гений 1С
 
гуру
13.01.23
12:16
(65) там есть и другие корневые группы, которые удалять нельзя, например "Подарочные сертификаты", продолжаем смеяться, Сеньор Помидор? ггг... Потому человек с таким стажем так и пишет, что понимает, что клиенту нафиг не уперлась лишняя галочка в номенклатуре, лишь бы сделать "по понятиям".
69 Гений 1С
 
гуру
13.01.23
12:17
(67) если работает, то ОК, но проверять уже не имеет смысла - работа сдана. Вы опоздали со своим предложением чутка, но все равно за него спасибо.
70 Гений 1С
 
гуру
13.01.23
12:17
(66) склоняю голову перед Великим Гуру, но как видите, до вас никто ничего путного пару дней подсказать не смог, пришлось делать по наитию.
71 Гений 1С
 
гуру
13.01.23
12:18
Можете давать эту задачу на собеседовании на Сеньора, но есть риск, что многие Тру Сеньоры не пройдут
72 Kassern
 
13.01.23
12:29
(68) "там есть и другие корневые группы, которые удалять нельзя, например "Подарочные сертификаты"" - Так наверное задачу надо расписывать правильно с учетом бизнес-процессов компании.
Даже в этом случае, вариант с параметром будет куда лучше, чем ваша реализация по наименованию. К примеру, у вас есть массив исключаемых групп. Вы в цикле проверяете, если такая есть там, то не выгружаете ее, вместо Наименование="Товары". Это даст возможность юзверам самим управлять, что грузить, а что нет, не дергая вас каждый раз (а может на это и расчет).

Обычно заводят корневой каталог, к примеру Интернет-магазин. А внутри все его каталоги с нужной структурой. И делают это обычно через сегменты номенклатуры, а не через группы. И да, в рознице тоже есть сегменты, и вроде как для битрикса можно выбрать какую таблицу использовать для каталога сайта.
73 Гений 1С
 
гуру
13.01.23
12:47
(72) не усложняй. Это не такая большая компания.
74 НафНаф
 
13.01.23
13:30
(64) а я смотрю, у тебя тема недополученного секса постоянно наружу выплескивается
75 Конструктор1С
 
13.01.23
15:40
(52) чуть меньше чем всё