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

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

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

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

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

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

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

объединить все

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

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

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

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

(37)Так учись, За 11 лет хоть что-то про запросы нужно обязательно прочитать.
39 ДенисЧ
 
06.02.20
10:48
ТС, смени ник на "Жираффо" )))
40 Said_We
 
06.02.20
10:57
(31) Плохо....
Общий план следующий.

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

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

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