Имя: Пароль:
1C
1С v8
Вопрос по запросу
0 IVT_2009
 
07.07.20
10:54
Есть простой запрос , результат которого показывает остаток в магазине в разрезе характеристик товара , которому присвоен штрих код.

Если просто выполнить запрос:

ВЫБРАТЬ
        Штрихкоды.Владелец КАК Владелец,
        Штрихкоды.Характеристика КАК Характеристика
    ИЗ
        РегистрСведений.Штрихкоды КАК Штрихкоды
    ГДЕ
        Штрихкоды.Штрихкод = &Штрихкод

выдает три позиции товара с характеристиками. Хотим знать остаток:

ВЫБРАТЬ
    шкОтбор.Владелец КАК Владелец,
    шкОтбор.Характеристика КАК Характеристика,
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    (ВЫБРАТЬ
        Штрихкоды.Владелец КАК Владелец,
        Штрихкоды.Характеристика КАК Характеристика
    ИЗ
        РегистрСведений.Штрихкоды КАК Штрихкоды
    ГДЕ
        Штрихкоды.Штрихкод = &Штрихкод) КАК шкОтбор
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
        ПО (шкОтбор.Владелец = ТоварыНаСкладахОстатки.Номенклатура
                И шкОтбор.Характеристика = ТоварыНаСкладахОстатки.Характеристика)
ГДЕ
    ТоварыНаСкладахОстатки.Склад = &Склад

в запрос соединяем левым соединением отбор товара для данного штрих кода и регистр остатка
по полу товар и характеристика. В результате две позиции товара, должно показать три.
почему так?

Технически левое соединение главной таблицы с 3 мя записями и подчиненной с двумя должно дать на выходе три записи , но дает только две. Запрос для 1с розница
1 Джинн
 
07.07.20
10:57
Запрос к регистру накопления, а к нему левым соединением штрихкоды. И научитесь пользоваться виртуальными таблицами.
2 asady
 
07.07.20
10:59
(0)
ГДЕ
    ТоварыНаСкладахОстатки.Склад = &Склад
это перенеси в ПВТ
3 acht
 
07.07.20
10:59
(0) Вся магия здесь:

ГДЕ
    ТоварыНаСкладахОстатки.Склад = &Склад
4 unregistered
 
07.07.20
10:59
(0) Про условие забыли.

ГДЕ
     ТоварыНаСкладахОстатки.Склад = &Склад


Это условие отравляет всю логику Ваших рассуждений.
5 IVT_2009
 
07.07.20
11:00
(1) я специально не стал тут их использовать. Сейчас перепишу - посмотрю на результат.
Основной таблице должен быть отбор товара , так как интересны позиции без остатков так же.
6 unregistered
 
07.07.20
11:00
А вообще соглашусь с (1). Запрос - *авно.
7 IVT_2009
 
07.07.20
11:01
(4) оно отбирает две записи , которые связаны с тремя основной таблицы.
8 unregistered
 
07.07.20
11:02
(7) Совершенно верно. Но тогда почему вы ждёте три записи на выходе, если сами же ставите условие, что нужны только две?
9 Джинн
 
07.07.20
11:03
(5) Если интересны позиции без остатков, то запрос к справочнику номенклатуры. Зачем к остаткам тогда обращаться?
10 unregistered
 
07.07.20
11:04
Короче. Изучите что такое параметры виртуальных таблиц и разберитесь - где нужно ставить условия, где параметры, а где использовать временные таблицы.
11 IVT_2009
 
07.07.20
11:05
(9) нужны все позиции по заданному штрих коду , где есть остатки и где их нет.
Видится отбор этих позиций по РС штрих коду и потом связь с регистром остатков левым соединением
Остатки интересны по текущему магазину. Очевидно что их предварительно по магазину отобрать а потом связать результат то же не очень идея
12 IVT_2009
 
07.07.20
11:11
Такой запрос отработал правильно , но он мне честно говоря не нравится

ВЫБРАТЬ
    шкОтбор.Владелец КАК Владелец,
    шкОтбор.Характеристика КАК Характеристика
ПОМЕСТИТЬ втШк
ИЗ
    (ВЫБРАТЬ
        Штрихкоды.Владелец КАК Владелец,
        Штрихкоды.Характеристика КАК Характеристика
    ИЗ
        РегистрСведений.Штрихкоды КАК Штрихкоды
    ГДЕ
        Штрихкоды.Штрихкод = &Штрихкод) КАК шкОтбор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстатки.Характеристика КАК Характеристика
ПОМЕСТИТЬ выбОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
ГДЕ
    ТоварыНаСкладахОстатки.Склад = &Склад
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втШк.Владелец КАК Владелец,
    втШк.Характеристика КАК Характеристика,
    выбОстаток.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    втШк КАК втШк
        ЛЕВОЕ СОЕДИНЕНИЕ выбОстаток КАК выбОстаток
        ПО втШк.Владелец = выбОстаток.Номенклатура
            И втШк.Характеристика = выбОстаток.Характеристика

вопрос , чем подзапрос отличается от виртуальной таблицы в данном случае ?
(опыт написания SQL запросов с 1997 года)
13 asady
 
07.07.20
11:14
(12) после 97 года чему-нить еще научились?
тебе написали уже ПВТ - параметры виртуальной таблицы - заполни!
зачем временные таблицы насоздавал?
14 IVT_2009
 
07.07.20
11:19
Такой запрос , то же показал правильный результат

ВЫБРАТЬ
    шкОтбор.Владелец КАК Владелец,
    шкОтбор.Характеристика КАК Характеристика,
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    (ВЫБРАТЬ
        Штрихкоды.Владелец КАК Владелец,
        Штрихкоды.Характеристика КАК Характеристика
    ИЗ
        РегистрСведений.Штрихкоды КАК Штрихкоды
    ГДЕ
        Штрихкоды.Штрихкод = &Штрихкод) КАК шкОтбор
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&период, Склад = &склад) КАК ТоварыНаСкладахОстатки
        ПО (шкОтбор.Владелец = ТоварыНаСкладахОстатки.Номенклатура)
            И (шкОтбор.Характеристика = ТоварыНаСкладахОстатки.Характеристика)
15 IVT_2009
 
07.07.20
11:23
(13) понял. Спасибо! все заработало как надо.
AdBlock убивает бесплатный контент. 1Сергей