Имя: Пароль:
1C
1С v8
Запрос - объединение Подобно/Склады/Цены
,
0 DaDe
 
20.12.14
22:02
Добрый день.

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

Номенклатура/ОстСклад1/ОстСклад2+ОстСклад3/Цена

Есть ли вариант упрощения чем у меня получилось.

ВЫБРАТЬ
    СпрНоменклатура.Наименование,
    СпрНоменклатура.Ссылка КАК Номенклатура,
    СпрНоменклатура.Родитель
ПОМЕСТИТЬ ТЗ
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
ГДЕ
    СпрНоменклатура.Наименование ПОДОБНО "%1132%"
;

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

ОБЪЕДИНИТЬ

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

ОБЪЕДИНИТЬ

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

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТЗО.Номенклатура,
    ТЗО.НоменклатураРодитель,
    СУММА(ТЗО.КоличествоОстаток1) КАК КоличествоОстаток1,
    СУММА(ТЗО.КоличествоОстаток2 + ТЗО.КоличествоОстаток3) КАК Поле1,
    ЦеныНоменклатурыСрезПоследних.ТипЦен,
    ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
    ТЗО КАК ТЗО
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
        ПО ТЗО.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
ГДЕ
    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен

СГРУППИРОВАТЬ ПО
    ТЗО.Номенклатура,
    ТЗО.НоменклатураРодитель,
    ЦеныНоменклатурыСрезПоследних.ТипЦен,
    ЦеныНоменклатурыСрезПоследних.Цена
1 exwill
 
20.12.14
22:52
(0) Можно обойтись без временных таблиц. Просто соединяй левым соединением справочник Номенклатура с регистрами.
2 alle68
 
21.12.14
06:27
(0) Есть. Н., ВТ имеют параметры, есть конструкция "ВЫБОР", "ИЛИ", etc.
(1) От первой тоже отказаться!?
3 DaDe
 
21.12.14
20:25
Может не совсем правильно написал. Имел ввиду упрощения с точки зрения скорости выполнения запроса.

(1) Пробовал вариант с левым соединением. Время выполнения оказалось больше, хотя и немного.

Причем больше всего времени примерно 50-70% занимает подключение ЦеныНоменклатурыСрезПоследних. Почему так много. Может я что-то делаю не так?

(2) Что такое Н.
4 vicof
 
21.12.14
20:44
(0)  Налицо неумение пользоваться виртуальными таблицами и наложение условия на правую таблицу при левом соединении
5 DaDe
 
21.12.14
21:21
(4) можно подсказать в какую сторону копать

ВЫБРАТЬ
    СпрНоменклатура.Наименование,
    СпрНоменклатура.Ссылка КАК Номенклатура,
    СпрНоменклатура.Родитель,
    ТоварыНаСкладахОстатки1.КоличествоОстаток,
    ТоварыНаСкладахОстатки2.КоличествоОстаток + ТоварыНаСкладахОстатки3.КоличествоОстаток КАК КоличествоОстаток2,
    ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки3
        ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки3.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки2
        ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки2.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки1
        ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки1.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
        ПО СпрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
ГДЕ
    СпрНоменклатура.Наименование ПОДОБНО "%1132%"
    И ТоварыНаСкладахОстатки1.Склад = &Склад1
    И ТоварыНаСкладахОстатки2.Склад = &Склад2
    И ТоварыНаСкладахОстатки3.Склад = &Склад3
    И ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
6 vicof
 
21.12.14
21:33
1. Выбрать нужную номенклатуру, поместить во временную таблицу
2. Выбрать остатки с отбором по складам и нужной номенклатуре. Здесь тебе нужно самому прочитать про параметры виртуальных таблиц.
3. То же самое с ценами
4. Соединить 1, 2 и 3
7 DaDe
 
21.12.14
22:01
(6) Спасибо, дельный совет. В общих чертах понял

Понятно что нужно ограничить набор данных и по нему уже получать дополнительные сведения. Просто не совсем было понятно как.
8 DaDe
 
21.12.14
23:08
(6) Типа того:

ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Наименование,
    Номенклатура.Родитель
ПОМЕСТИТЬ СписокТоваров
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка.Наименование ПОДОБНО "%1132%"

СГРУППИРОВАТЬ ПО
    Номенклатура.Ссылка,
    Номенклатура.Наименование,
    Номенклатура.Родитель
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СписокТоваров.Ссылка,
    СписокТоваров.Наименование,
    СписокТоваров.Родитель,
    ТоварыНаСкладахОстатки1.КоличествоОстаток,
    ТоварыНаСкладахОстатки2.КоличествоОстаток + ТоварыНаСкладахОстатки3.КоличествоОстаток КАК КоличествоОстаток2,
    ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
    СписокТоваров КАК СписокТоваров
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                &Дата,
                Номенклатура В
                    (ВЫБРАТЬ
                        СписокТоваров.Ссылка
                    ИЗ
                        СписокТоваров КАК СписокТоваров)) КАК ТоварыНаСкладахОстатки1
        ПО СписокТоваров.Ссылка = ТоварыНаСкладахОстатки1.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                &Дата,
                Номенклатура В
                    (ВЫБРАТЬ
                        СписокТоваров.Ссылка
                    ИЗ
                        СписокТоваров КАК СписокТоваров)) КАК ТоварыНаСкладахОстатки2
        ПО СписокТоваров.Ссылка = ТоварыНаСкладахОстатки2.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
                &Дата,
                Номенклатура В
                    (ВЫБРАТЬ
                        СписокТоваров.Ссылка
                    ИЗ
                        СписокТоваров КАК СписокТоваров)) КАК ТоварыНаСкладахОстатки3
        ПО СписокТоваров.Ссылка = ТоварыНаСкладахОстатки3.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,ТипЦен=&ТипЦен И
                Номенклатура В
                    (ВЫБРАТЬ
                        СписокТоваров.Ссылка
                    ИЗ
                        СписокТоваров КАК СписокТоваров)) КАК ЦеныНоменклатурыСрезПоследних
        ПО СписокТоваров.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
ГДЕ
    ТоварыНаСкладахОстатки1.Склад = &Склад1
    И ТоварыНаСкладахОстатки2.Склад = &Склад2
    И ТоварыНаСкладахОстатки3.Склад = &Склад3
9 vicof
 
21.12.14
23:41
и получилось у тебя внутренее соединение. Условие по складам тоже в параметры виртуальных таблиц запихай.

и естьнулл на количество поставь
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.