Имя: Пароль:
1C
 
Обсудим запрос, оптимизация
0 Маленький Вопросик
 
29.08.22
08:29
Предложение по оптимизации. Можно переписать другой запрос, главное, чтобы на выходе Да/Нет было

ВЫБРАТЬ
                    | ВЫБОР
                    |     КОГДА Номенклатура.Ссылка = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
                    |         ТОГДА ЛОЖЬ
                    |     ИНАЧЕ ИСТИНА
                    | КОНЕЦ КАК Разрешено
                    | ИЗ
                    |     Справочник.Номенклатура КАК Номенклатура
                    | ГДЕ
                    |     Номенклатура.ЭтоГруппа = ЛОЖЬ
                    |     И Номенклатура.Родитель В ИЕРАРХИИ
                    |             (ВЫБРАТЬ
                    |                 Конт1_ОбходБлокировки.Номенклатура КАК Номенклатура
                    |             ИЗ
                    |                 РегистрСведений.Конт1_ОбходБлокировки КАК Конт1_ОбходБлокировки
                    |             ГДЕ
                    |                 Конт1_ОбходБлокировки.Разрешено = ИСТИНА
                    |                 И Конт1_ОбходБлокировки.Номенклатура.ЭтоГруппа = ИСТИНА)
                    |     И Номенклатура.Ссылка = &Ссылка
1 Ёпрст
 
29.08.22
08:31
(0) всё в топку
2 Ёпрст
 
29.08.22
08:31
Феерический п..ц это все условия и в конце И Номенклатура.Ссылка = &Ссылка
3 Маленький Вопросик
 
29.08.22
08:33
(2) смысл запроса понял?
4 Ненавижу 1С
 
гуру
29.08.22
08:34
"В ИЕРАРХИИ" не умеет так, только с параметрами
5 Маленький Вопросик
 
29.08.22
08:36
(4) запрос рабочий 100% - все умеет "в иерархии"
6 Vaderonk
 
29.08.22
08:39
(0) доработка регистра добавив информацию об элементе номенклатуры, убери условие "Конт1_ОбходБлокировки.Номенклатура.ЭтоГруппа = ИСТИНА", проверь скорость выполнения.
7 Маленький Вопросик
 
29.08.22
08:42
(6) это нельзя убирать - иерархия должна выбирать из групп
8 Ёпрст
 
29.08.22
08:46
(5) Да ну ?? Вот эта дурь в case всегда будет Истина, там никогда не будет пустой ссылки
9 Ёпрст
 
29.08.22
08:48
Будет или пустая выборка или Истина в разрешено
10 Маленький Вопросик
 
29.08.22
08:48
(8) да, запрос возвращает либо истину, либо ничего не возвращает.

ты понял, но не до конца...
11 Маленький Вопросик
 
29.08.22
08:48
(9) есть идеи как переделать?
12 Ёпрст
 
29.08.22
08:49
(10) Да ? Серьезно ? И нахрена там case ?
Про нелепую в иерархии, опустим
13 Маленький Вопросик
 
29.08.22
08:50
(12) напиши свой вариант, если можешь - 17 лет тут штаны просиживаешь - судя по профилю
14 DEVIce
 
29.08.22
08:50
(8) +100500. Там должно быть левое соединение с регистром, а не в блоке ГДЕ.
15 Ёпрст
 
29.08.22
08:56
(13) Ну не 17, а побольше.. раньше не зареген был лет 5
16 Ненавижу 1С
 
гуру
29.08.22
08:56
(5) да, работает, подзапрос не коррелируемый потому что
17 Ёпрст
 
29.08.22
08:58
(13) сама идея хранения групп в РС порочна, ибо при переносе элемента из группы в группу - п...ц котёнку
18 Ненавижу 1С
 
гуру
29.08.22
09:00
(17) если подписка на события будет, то работает
19 Маленький Вопросик
 
29.08.22
09:05
(17) я не спрашиваю тебя про идею. мне нужно обсудить получение подобного результата исходя из условий.

я вообще по адресу обратился?
20 Маленький Вопросик
 
29.08.22
09:08
(17) нет, никакого п..ц не будет.
21 Ёпрст
 
29.08.22
09:09
(17) ну сделай юнион Ложь + максимум во внешнем запросе, чтоб всегда иметь свою выборку потом с истина\ложь
22 Ёпрст
 
29.08.22
09:09
(21) --->(19)
23 Маленький Вопросик
 
29.08.22
09:12
(22) зачем юнион, если я могу обернуть запрос в вирт таблицу и уже из нее получить истина/ложь

мне нужна кардинальный подход получения результата другим методом (но в запросе)
24 Ёпрст
 
29.08.22
09:12
+

Выбрать максимум(табличка.разрешено) из

( выбрать истина как разрешено из справочник.Номенклатура Где ....
Объединить все выбрать ложь) как табличка
25 Ёпрст
 
29.08.22
09:13
(23) дай угадаю, этот запрос еще и в цикле поди, раз ты условие на  Номенклатура.ЭтоГруппа = ЛОЖЬ пихаешь в текст запроса ?
26 Ёпрст
 
29.08.22
09:15
И да, если твоя номенклатура в корне валяется ( с пустым родителем), то в своём РС ты это учитываешь ?
27 Ryzeman
 
29.08.22
09:16
(23) развернуть вложенный запрос во временную таблицу разрешённых групп а потом по ним вязать родителя разве что. Работать это быстрее не будет. Кроме лишнего ВЫБОР у тебя остальное по-другому и не получишь, похоже.
28 Маленький Вопросик
 
29.08.22
09:17
(25) понимаешь?

&НаКлиенте
Процедура ТабИнвентВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    Если Поле.Имя = "ТабИнвентКоличествоФакт"  Тогда
                
        
        Если ПоискВРегистреБлокировок(Объект.ТабИнвент[ВыбраннаяСтрока].Номенклатура) Тогда
            
            Парам = ПолучимПараметрКалькулятора(Элемент.Имя, ВыбраннаяСтрока);
            ОткрытьФорму("ВнешняяОбработка.Инвентаризация.Форма.ФормаВводаЦифр",Парам,,,,,Новый ОписаниеОповещения("ПослеЗакрытияФормКоличества",ЭтаФорма,ВыбраннаяСтрока),РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
            
        КонецЕсли;    
            
    КонецЕсли;    
    
КонецПроцедуры
29 Ryzeman
 
29.08.22
09:17
(26) я так подозреваю что у него разрешённая номенклатура не будет в корне валяться. Типа специально задаётся ряд групп, на которых вешается свойство что там товары можно менять, а остальные нельзя. Очень такое себе, ИМХО, но если так захотели\сделали, то чаще лучше не трогать
30 Маленький Вопросик
 
29.08.22
09:18
(29) единственный человек, который догадался. но, и номенклатура в регистре так же может быть. тут проблем нет
31 Ryzeman
 
29.08.22
09:20
(30) Да я думаю все всё поняли, (а кто не понял - лень было разбираться), но общую кривость решения не отменяет :-D Если тебе данные надо получать быстро - нужно свойство у самой номенклатуры, которую уже можешь проставлять как угодно. Реализовать тоже можно как угодно - хоть доп реквизитом\сведением хоть нормальным. И работать это будет офигенно что через запрос что через точку в цикле, и интуитивно понятно.
32 alarm2020
 
29.08.22
09:23
(23) Можно использовать агрегатную функцию Количество()
33 Маленький Вопросик
 
29.08.22
09:23
(31)

1.никто не предложил рабочего варианта
2.про кривость решения - глаз режет, да, иначе бы не создавал тему
3.проставлять доп реквизит у 50 тыс позиций - выборочно????
34 alarm2020
 
29.08.22
09:24
(33) Я только что предложил
35 Маленький Вопросик
 
29.08.22
09:25
(32) типа выбор количество > 0 тогда 1, иначе 0...

ну да, это хороший момент
36 alarm2020
 
29.08.22
09:26
(35) ... тогда истина иначе ложь
37 СеменовСемен
 
29.08.22
09:26
(0) не может быть пустой ссылки в справочнике
38 Маленький Вопросик
 
29.08.22
09:26
(34) чем отличается от обертки в ВТ с явным выбором Истина/Ложь ?
39 Ryzeman
 
29.08.22
09:28
(33) >>проставлять доп реквизит у 50 тыс позиций - выборочно????
Вот этот момент как раз легко оптимизировать по тому же условию вхождения в группу у которой уже есть этот признак.
Вручную не надо, вот если разово понадобится все 50к или сколько у тебя там перезаписать - займёт ненулевое время. Но не так долго.
40 alarm2020
 
29.08.22
09:28
(38) Отсутствием обертки в ВТ
41 alarm2020
 
29.08.22
09:28
(37) В этом и вопрос у ТС
42 СеменовСемен
 
29.08.22
09:29
(41) нужно проверять пустоту результата запроса
43 alarm2020
 
29.08.22
09:30
(42) Пустоту надо проверять в запросе
44 СеменовСемен
 
29.08.22
09:31
В регистр доступ к группам?
По идее нужно рекурсивно делать.
Если нужно для многих номенклатур проверить, то можно через транзитивное замыкание группы собрать
45 Маленький Вопросик
 
29.08.22
09:32
(42) всю "не истину" можно пометить как ЛОЖЬ или 0, запросом "выше" - вот смысл этого
46 СеменовСемен
 
29.08.22
09:33
(43) можно объединить с Ложь и выбрать первые. Только нужно порядок правильный задать
47 Kassern
 
29.08.22
09:37
(0) Какой смысл от этой конструкции?
                    | ВЫБОР
                    |     КОГДА Номенклатура.Ссылка = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
                    |         ТОГДА ЛОЖЬ
                    |     ИНАЧЕ ИСТИНА
                    | КОНЕЦ КАК Разрешено
Если уж пошли этим путем, то почему не выбрать просто Истина?
48 Kassern
 
29.08.22
09:38
В данном запросе не будет пустой ссылки, она либо есть, либо ее нет.
49 ptiz
 
29.08.22
09:39
(23) Кардинально - это сделать отдельный РС, в котором хранить все группы, в т.ч. вложенные, и запрос делать к нему.
50 ptiz
 
29.08.22
09:40
+(49) Перезапись не будет очень тяжелой, если у вас всего несколько тысяч групп.
51 Маленький Вопросик
 
29.08.22
09:41
(48) ну это тут уже поняли. но если сделать "шаг вперед", можно исключить пустую выборку. мы тоже это уже поняли
52 Kassern
 
29.08.22
09:42
(51) Какая конфигурация? Есть сегменты номенклатуры? Можно по аналогии их сделать функционал проверки
53 Маленький Вопросик
 
29.08.22
09:45
(52) ЕРП. типовая бсп-шная. про "сегменты" отличная идея....
54 Kassern
 
29.08.22
09:47
(53) Ну вот, создайте нужные сегменты, заполните их по условию и уже к РС НоменклатураСегмента и делайте вашу проверку на вхождение.
55 Маленький Вопросик
 
29.08.22
09:50
ладно, всем спасибо за участие. троллить запросами вас пока не буду :)
56 Ёпрст
 
29.08.22
09:59
Эх, почитал бы что такое в иерархии, возможно выкинул бы всё к..е..ям
https://infostart.ru/1c/articles/1091745/
57 Ёпрст
 
29.08.22
09:59
Ильдарович, тоже неплохую статейку написал, про разные виды деревьев
https://infostart.ru/1c/articles/1105799/
58 Ёпрст
 
29.08.22
10:07
Ну и насчет оптимизации, разве что первым запросом получить список всех групп для выбранной номенклатуры и вторым запросом, уже проверка вхождения списка групп в РС и без "иерархии"
59 unenu
 
29.08.22
10:13
всегда избавляюсь от "В ИЕРАРХИИ" в запросах посредством временных таблиц.
к сожалению "В ИЕРАРХИИ" в 1С - это лишь глава(лапша) в методичках, а на практике причина неэффективности.
60 Kassern
 
29.08.22
10:14
(59) Так на уровне платформы "В ИЕРАРХИИ" выплевывается во временные таблицы.
61 unenu
 
29.08.22
11:00
(60) в том и соль, что "выплевывается" и все равно тормозит. а когда сам "защекотуришь" вт, то все ок.

запилите отчет по регистру себестоимости с кол-ом записей эдак в 80КК+ и убедитесь, что "плевки" такое себе - просто маркетинг.
62 Kassern
 
29.08.22
11:03
(61) И юзверам не даете возможности использовать ВГруппе и ВГруппеИзСписка?
63 Kassern
 
29.08.22
11:03
Я стараюсь писать логику так, чтобы по минимуму данную конструкцию исопльзовать в запросе, либо вообще не использовать.
64 Kassern
 
29.08.22
11:05
(61) Все зависит от того, какой уровень вложенности, если не большой, то не так страшно
65 unenu
 
29.08.22
11:26
(62) даем. посмотрите как в УТ(ЕРП) в типовых отчетах разарабы разрулили с сегментами.
если бы эта идея была перенесена на все таблицы (номеклатура, склады, клиенты, накладные), то в кнфах наступил бы локальный рай.

суть там в том, что первым пакетом идет тяжелый отбор по жирным таблицам(указал выше) со всеми грехами (в группе, в группе из списка), а затем в еще более тяжелых оборотных таблицам ни разраб не умничает, ни СКД не лепит свои дурацкие вставки В ИЕРАХИИ.

Пример отбора в первых "грешных" пакетах, которые дают пользовтелю свободу, а отчету кислород:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТаблТовары.Ссылка КАК ТоварОтбора
ПОМЕСТИТЬ ВтТовары
{ВЫБРАТЬ
    ТоварОтбора.*}
ИЗ
    Справочник.Номенклатура КАК ТаблТовары
ГДЕ
    НЕ ТаблТовары.ЭтоГруппа
{ГДЕ
    ТаблТовары.Ссылка.* КАК ТоварОтбора,
    ТаблТовары.Производитель.* КАК ПроизводительОтбора,
    ТаблТовары.Марка.* КАК МаркаОтбора,
    ТаблТовары.ТоварнаяКатегория.* КАК КатегорияОтбора}

ИНДЕКСИРОВАТЬ ПО
    ТоварОтбора
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТаблСклады.Ссылка КАК СкладОтбора
ПОМЕСТИТЬ ВтСкладыОтбора
{ВЫБРАТЬ
    СкладОтбора.*}
ИЗ
    Справочник.Склады КАК ТаблСклады
ГДЕ
    НЕ ТаблСклады.ЭтоГруппа
{ГДЕ
    ТаблСклады.Ссылка.* КАК СкладОтбора}

ИНДЕКСИРОВАТЬ ПО
    СкладОтбора
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТаблВидыЗапасов.Ссылка КАК ВидЗапасов
ПОМЕСТИТЬ ВтВидыЗапасов
{ВЫБРАТЬ
    ВидЗапасов.*}
ИЗ
    Справочник.ВидыЗапасов КАК ТаблВидыЗапасов
{ГДЕ
    ТаблВидыЗапасов.Ссылка.* КАК ВидЗапасов}

ИНДЕКСИРОВАТЬ ПО
    ВидЗапасов
;

... далее в жирных пакетах главное назначить полям синонимы отличные от имен полей (иначе СКД может лепить свои гроздья) и получим относительно быструю фильрацию жирных таблиц:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТаблАналитикаУчетаНоменклатуры.КлючАналитики КАК КлючАналитики,
    ТаблАналитикаУчетаНоменклатуры.Номенклатура КАК ТоварОтбора,
    ТаблАналитикаУчетаНоменклатуры.Склад КАК СкладОтбора
ПОМЕСТИТЬ ВтАналитикаУчетаНоменклатуры
ИЗ
    РегистрСведений.АналитикаУчетаНоменклатуры КАК ТаблАналитикаУчетаНоменклатуры
ГДЕ
    ТаблАналитикаУчетаНоменклатуры.Номенклатура В
            (ВЫБРАТЬ
                ВтТовары.ТоварОтбора
            ИЗ
                ВтТовары)
    И ТаблАналитикаУчетаНоменклатуры.Склад В
            (ВЫБРАТЬ
                ВтСклады.СкладОтбора
            ИЗ
                ВтСклады)

ИНДЕКСИРОВАТЬ ПО
    КлючАналитики
;

ВЫБРАТЬ
            ВиСпОбороты.Период КАК ДатаНачала,
            ВиСпОбороты.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
            ВиСпОбороты.ВидЗапасов КАК ВидЗапасов,
            ВиСпОбороты.КоличествоОборот КАК КоличествоПродаж,
            ВиСпОбороты.СебестоимостьОборот КАК СтоимостьПродаж,
            ВиСпОбороты.СуммаВыручкиОборот КАК СуммаВыручки,
            ВиСпОбороты.СуммаДополнительныхРасходовОборот КАК СуммаДопРасходов
        ИЗ
            РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(
                    &НачалоПериода,
                    &КонецПериода,
                    День,
                    &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.День)
                        И АналитикаУчетаНоменклатуры В
                            (ВЫБРАТЬ
                                ВтАналитикаУчетаНоменклатуры.КлючАналитики
                            ИЗ
                                ВтАналитикаУчетаНоменклатуры)
                        И ВидЗапасов В
                            (ВЫБРАТЬ
                                ВтВидыЗапасов.ВидЗапасов
                            ИЗ
                                ВтВидыЗапасов)
                        И Склад В
                            (ВЫБРАТЬ
                                ВтСклады.СкладОтбора
                            ИЗ
                                ВтСклады) {(ХозяйственнаяОперация) КАК ХозяйственнаяОперация}) КАК ВиСпОбороты