Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Помогите с запросом!

Помогите с запросом!
Я
   tciban
 
06.02.20 - 08:37
Давненько глупостей не спрашивал, а тут придется... Маленько переписанная УПП 1.2. Сделал регистрик ПланПоНГ (план по номенклатурным группам). 4 простых измерения: МесяцНачалаДействия (дата), ТорговаяТочка(ДоговорКонтрагента),НоменклатурнаяГруппа и Номенклатура.

Сделал в регистре для отладки 2 записи. одинаковая дата(начало января), одинаковая торговая точка и разные 2 номенклатурные группы с номенклатурой из них. По одной были продажи за январь, по второй - нет. Сделал простой, примитивный запрос!
ВЫБРАТЬ
    ПланПоНоменклатурнымГруппам.ТорговаяТочка КАК ТорговаяТочка,
    ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа,
    ПланПоНоменклатурнымГруппам.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА Продажи.Количество > 0
            ТОГДА Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
    КОНЕЦ КАК Отгрузка,
    ВЫБОР
        КОГДА Продажи.Количество < 0
            ТОГДА -Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
    КОНЕЦ КАК Возврат,
    ВЫБОР
        КОГДА Продажи.Стоимость > 0
            ТОГДА Продажи.Стоимость
    КОНЕЦ КАК Сумма
ИЗ
    РегистрНакопления.Продажи КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам
        ПО ПланПоНоменклатурнымГруппам.ТорговаяТочка = Продажи.ДоговорКонтрагента
            И ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа
            И ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура
ГДЕ
    ПланПоНоменклатурнымГруппам.МесяцНачалаДействия = &ДатаН
    И Продажи.Период МЕЖДУ &ДатаН И &ДатаК
    И Продажи.Контрагент.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель
    И ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель

Это ЛЕВОЕ соединение! Т.е. должны быть обе записи из регистра плана! А выдает только одну, по которой были продажи! Что я делаю не так?
Чет я отчаялсо, помогите!
   strange2007
 
1 - 06.02.20 - 08:40
Не умею читать и писать запросы, но вдруг поможет методика: Комментируешь обрезания по одному и как появится нужная картинка, так сразу анализируешь последний комментарий.
   craxx
 
2 - 06.02.20 - 08:40
При левом соединении условия на правую часть не работают так как ты хочешь, не используй их. Лучше сделай временную таблицу и в ней отбор сделай, а потом с ней связывай свой регистр
   ДенисЧ
 
3 - 06.02.20 - 08:53
Все условия перенеси в условия соединения, а не в группу ГДЕ.
   Ненавижу 1С
 
4 - 06.02.20 - 08:55
>>Это ЛЕВОЕ соединение! Т.е. должны быть обе записи из регистра плана! А выдает только одну, по которой были продажи!

Всё правильно оно делает, прочитай еще раз про левое и правое соединение
   tciban
 
5 - 06.02.20 - 09:04
(4) И как надо делать?
   tciban
 
6 - 06.02.20 - 09:05
(3) Попробовал - не дождался конца выполнения запроса даже...
ИЗ
    РегистрНакопления.Продажи КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам
        ПО (ПланПоНоменклатурнымГруппам.ТорговаяТочка = Продажи.ДоговорКонтрагента)
            И (ПланПоНоменклатурнымГруппам.МесяцНачалаДействия = &ДатаН)
            И (ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель)
            И (Продажи.Период МЕЖДУ &ДатаН И &ДатаК)
            И (Продажи.Контрагент.ОсновнойМенеджерПокупателя = &ТорговыйПредставительИ)
            И (ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа
                ИЛИ Продажи.Номенклатура.НоменклатурнаяГруппа ЕСТЬ NULL)
            И (ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура
                ИЛИ Продажи.Номенклатура ЕСТЬ NULL)
   tciban
 
7 - 06.02.20 - 09:10
(3) Малость ошибся в условиях, но да, результат прежний :(
   НЕА123
 
8 - 06.02.20 - 09:22
(6)
сделать первым
(ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура
                ИЛИ Продажи.Номенклатура ЕСТЬ NULL)

проверка на NULL нужна?
   tciban
 
9 - 06.02.20 - 09:26
(8) проверка на NULL это я уже извращался, не нужна по идее
   НЕА123
 
10 - 06.02.20 - 09:28
(4)+1
   tciban
 
11 - 06.02.20 - 09:31
(10) А как сделать то?
   breezee
 
12 - 06.02.20 - 09:36
(6) Не надо такие сложные связи. Отберите в 1 временной таблице нужные данные и во второй нужные данные и соединетесь в 3 запросе. В книгах по 1с, рекомендуется не связываться вирательной таблицей с физической или варитуальной таблицей. Так и отлаживать проще
   Василий Алибабаевич
 
13 - 06.02.20 - 09:42
(0) Почитай текст запроса "и здраво содрогнись".

ВЫБРАТЬ
  ПланПоНоменклатурнымГруппам.ТорговаяТочка КАК ТорговаяТочка,
  ....
ИЗ
  РегистрНакопления.Продажи КАК Продажи//Вот это слева.

 ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПланПоНоменклатурнымГруппам

Слева у тебя РегистрНакопления.Продажи а уже справа РегистрСведений.ПланПоНоменклатурнымГруппам
   НЕА123
 
14 - 06.02.20 - 09:43
(13)+1
из анекдота
"не нравится красная - заебньте зеленую"
   Said_We
 
15 - 06.02.20 - 09:43
(0) Не путай правое с левым. Условие в Где не должно быть совсем. Оно должно быть выполнено до соединения.
ИЗ 
    РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам 
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК Продажи 
        ПО ПланПоНоменклатурнымГруппам.ТорговаяТочка = Продажи.ДоговорКонтрагента 
            И ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа 
            И ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура
   vicof
 
16 - 06.02.20 - 09:44
Вот это (ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель
и вто это ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа сильно...будет тормозить.
   rphosts
 
17 - 06.02.20 - 09:44
(12) угу + ещё можно создать индекс по полям соединения, но с индексом нужно смотреть ускорится или нет
   Said_We
 
18 - 06.02.20 - 09:45
(0) к (15)
">>Это ЛЕВОЕ соединение! Т.е. должны быть обе записи из регистра плана!" - Если обе, то ПОЛНОЕ соединение и не правое и не левое.
   Said_We
 
19 - 06.02.20 - 09:51
(18) "Обе" - имеется ввиду все записи из обоих источников. Из написанного в (0) вообще не понятно, что в итоге необходимо и зачем это.
   tciban
 
20 - 06.02.20 - 09:59
(18) (19) Мне нужны все из первого источника а не из обоих
   Василий Алибабаевич
 
21 - 06.02.20 - 10:01
(20) Так и сделай первую выборку из ПланПоНоменклатурнымГруппам. У тебя почемуто из Продажи.
   Said_We
 
22 - 06.02.20 - 10:01
(20) тогда как в 15, но перепиши, что бы не тормозило сильно. Условия Где после соединения не должно быть совсем в твоем случае.
   tciban
 
23 - 06.02.20 - 10:05
(21) Ошибка была, но перемена мест не помогла...
   Said_We
 
24 - 06.02.20 - 10:07
(23) Условия в ГДЕ закомментируй и будет тебе счастье.
   tciban
 
25 - 06.02.20 - 10:07
Вот так работает, но монструазно, попробую через 2 ВТ
ВЫБРАТЬ
    ПланПоНоменклатурнымГруппам.ТорговаяТочка КАК ТорговаяТочка,
    ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа,
    ПланПоНоменклатурнымГруппам.Номенклатура КАК Номенклатура,
    0 КАК Отгрузка,
    0 КАК Возврат,
    0 КАК Сумма
поместить врем    
ИЗ
   РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам
ГДЕ    
   ПланПоНоменклатурнымГруппам.МесяцНачалаДействия = &ДатаН
   И ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель
    
 
объединить все
 
ВЫБРАТЬ
    ПланПоНоменклатурнымГруппам.ТорговаяТочка КАК ТорговаяТочка,
    ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа,
    ПланПоНоменклатурнымГруппам.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА Продажи.Количество > 0
            ТОГДА Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
    КОНЕЦ КАК Отгрузка,
    ВЫБОР
        КОГДА Продажи.Количество < 0
            ТОГДА -Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
    КОНЕЦ КАК Возврат,
    ВЫБОР
        КОГДА Продажи.Стоимость > 0
            ТОГДА Продажи.Стоимость
    КОНЕЦ КАК Сумма
ИЗ
    РегистрНакопления.Продажи КАК Продажи
        левое СОЕДИНЕНИЕ РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам
        ПО ПланПоНоменклатурнымГруппам.ТорговаяТочка = Продажи.ДоговорКонтрагента
            И ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа
            И ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура
ГДЕ
    ПланПоНоменклатурнымГруппам.МесяцНачалаДействия = &ДатаН
    И Продажи.Период МЕЖДУ &ДатаН И &ДатаК
    И Продажи.Контрагент.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель
    И ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель
;
ВЫБРАТЬ
    врем.ТорговаяТочка КАК ТорговаяТочка,
    врем.НоменклатурнаяГруппа,
    врем.Номенклатура КАК Номенклатура,
    Сумма(врем.Отгрузка) КАК Отгрузка,
    Сумма(врем.Возврат) КАК Возврат,
    Сумма(врем.Сумма) КАК Сумма
Из врем как врем 
Сгруппировать по
    врем.ТорговаяТочка,
    врем.НоменклатурнаяГруппа,
    врем.Номенклатура
   Said_We
 
26 - 06.02.20 - 10:09
Порядок выполнения операторов в SQL-выражениях:

FROM – выбирает таблицу из базы данных
WHERE – из таблицы выбираются записи, отвечающие условию поиска и отбрасываются все остальные
CROUP BY – создаются группы записей, каждая группа соответствует какому-нибудь значению столбца группирования
HAVING – обрабатывает каждую из созданных групп записей, оставляя только те из них, которые удовлетворяю условие поиска
SELECT – выбирает из результатной таблицы только указанные столбцы
ORDER BY – сортирует записи результатной таблицы
LIMIT
   Ненавижу 1С
 
27 - 06.02.20 - 10:12
(26) всё пытаетесь процедурно мыслить в функциональных подходах
   Said_We
 
28 - 06.02.20 - 10:16
(25) Использовать ВТ с индексами или не использовать, надо ещё смотреть. В твоем случае на 99% будет оправдано, так как вторая большая таблица с продажами берется за некий период и записей может быть совсем не много в такой таблице.

(27) Нет. Хотел скинуть другой порядок - более полный. В (0) не понимает что условие в ГДЕ, которое он рисует после соединения будет выполняться тоже уже после соединения. Мало того, что он пытался соединить не обрезанные заранее таблицы, что не оптимально, так ещё и условием в конце обрезает нужный ему результат и не видит этого.
   catena
 
29 - 06.02.20 - 10:23
(25)Т.е. не внял ни единому совету: ни соединение не поменял на правое, ни из ГДЕ ничего не убрал.
   tciban
 
30 - 06.02.20 - 10:24
(29) Соединение менял всеми возможными способами - не помогло.
Из где условия в условия соединения переносил - не помогло
 
 Рекламное место пустует
   tciban
 
31 - 06.02.20 - 10:27
(29) А вот применение обеих советов помогло! Работает.
ВЫБРАТЬ
    ПланПоНоменклатурнымГруппам.ТорговаяТочка КАК ТорговаяТочка,
    ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа,
    ПланПоНоменклатурнымГруппам.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА Продажи.Количество > 0
            ТОГДА Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
    КОНЕЦ КАК Отгрузка,
    ВЫБОР
        КОГДА Продажи.Количество < 0
            ТОГДА -Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
    КОНЕЦ КАК Возврат,
    ВЫБОР
        КОГДА Продажи.Стоимость > 0
            ТОГДА Продажи.Стоимость
    КОНЕЦ КАК Сумма
ИЗ
    РегистрСведений.ПланПоНоменклатурнымГруппам КАК ПланПоНоменклатурнымГруппам
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК Продажи
        ПО (ПланПоНоменклатурнымГруппам.МесяцНачалаДействия = &ДатаН)
            И (ПланПоНоменклатурнымГруппам.ТорговаяТочка.Владелец.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель)
            И (Продажи.Период МЕЖДУ &ДатаН И &ДатаК)
            И (Продажи.Контрагент.ОсновнойМенеджерПокупателя = &ТорговыйПредставитель)
            И ПланПоНоменклатурнымГруппам.ТорговаяТочка = Продажи.ДоговорКонтрагента
            И ПланПоНоменклатурнымГруппам.НоменклатурнаяГруппа = Продажи.Номенклатура.НоменклатурнаяГруппа
            И ПланПоНоменклатурнымГруппам.Номенклатура = Продажи.Номенклатура
   Василий Алибабаевич
 
32 - 06.02.20 - 10:27
(25) У регистра "продажи" должна же быть виртуальная таблица "Обороты"? Зачем выбирать все продажи с начала времен и фильтровать их в условии "Продажи.Период МЕЖДУ &ДатаН И &ДатаК"?
   tciban
 
33 - 06.02.20 - 10:29
(32) Возможно. Надо попробовать.
Теперь надо преодолеть еще одну проблему - если в плане будет указана только номенклатурная группа без номенклатуры, т.е. надо продать хоть что нибудь из номенклатурной группы, не важно что
   Василий Алибабаевич
 
34 - 06.02.20 - 10:32
(33) Птля... "Возможно. Надо попробовать."
Везде где возможно нужно юзать виртуальные таблицы с параметрами вместо фильтрации в ГДЕ.

"если в плане будет указана только номенклатурная группа без номенклатуры" И что? Вы в продажах не сможете отфитровать номенклатуру нужной группы?
   tciban
 
35 - 06.02.20 - 10:40
(34) Да смогу поди :)
   Василий Алибабаевич
 
36 - 06.02.20 - 10:42
(35) Мы в тебя верим )))
   tciban
 
37 - 06.02.20 - 10:43
(36) Спасибо! Век живи - век учись :)
   catena
 
38 - 06.02.20 - 10:45
(31)А что, предыдущие ораторы советовали их строго по очереди? О_о

(37)Так учись, За 11 лет хоть что-то про запросы нужно обязательно прочитать.
   ДенисЧ
 
39 - 06.02.20 - 10:48
ТС, смени ник на "Жираффо" )))
   Said_We
 
40 - 06.02.20 - 10:57
(31) Плохо....
Общий план следующий.
Выбрать Т.* ПОМЕСТИТЬ ВТ_1 из <источник1> КАК Т где <Все условия, которые относятся только к таблице Источник1> ИНДЕКСИРОВАТЬ <поля связи источника 1 и источника 2 в том же порядке что и в связи>;

Выбрать Т.* ПОМЕСТИТЬ ВТ_2 из <источник2> КАК Т где <Все условия, которые относятся только к таблице Источник2> ИНДЕКСИРОВАТЬ <поля связи источника 1 и источника 2 в том же порядке что и в связи>;

Выбрать ВТ_1.*, ВТ_2.* ИЗ ВТ_1 как ВТ_1 Левое соединение <условия связи> ГДЕ <ТУТ только то условие, которое выполняется в условии связи, но в итоговую выборку попасть не должно>
   tciban
 
41 - 06.02.20 - 11:12
Всем, кто участвовал в обсуждении огромное спасибо! Продолжаю работу в заданном направлении :)
   hhhh
 
42 - 06.02.20 - 15:34
(7) поменяй местами измерения, зачем ты месяц первым втулил?


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.