Имя: Пароль:
1C
1С v8
Выборка первой и единственной строки из нескольких ТЧ документа
0 vdeemer
 
20.10.15
16:22
Доброго времени суток, уважаемые!
УПП.ЗаказПокупателя, необходимо выбрать первую строку из ТЧ Товары либо ТЧ Услуги, приоритет у товаров. Т.е. если в товарах есть строка, то из услуг выбирать уже ничего не надо. Сделал запрос с выборкой первой строки из ТЧ Товары, потом выборкой из ТЧ Услуги и НЕвыборкой из тех документов, которые есть в первой выборке, объединил все.

ВЫБРАТЬ
    ЗаказПокупателя.ДатаОтгрузки,
    ЗаказПокупателя.Ссылка,
    НАЧАЛОПЕРИОДА(ЗаказПокупателя.ДатаОтгрузки, МЕСЯЦ) КАК МесяцОтгрузки
ПОМЕСТИТЬ Заказы
ИЗ
    Документ.ЗаказПокупателя КАК ЗаказПокупателя
ГДЕ
    ЗаказПокупателя.Проведен = ИСТИНА
    И НЕ ЗаказПокупателя.ДатаОтгрузки ЕСТЬ NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗаказПокупателяТовары.Количество,
    ЗаказПокупателяТовары.Номенклатура,
    ПРЕДСТАВЛЕНИЕ(ЗаказПокупателяТовары.Номенклатура),
    Заказы.ДатаОтгрузки,
    Заказы.Ссылка,
    ПРЕДСТАВЛЕНИЕ(Заказы.Ссылка),
    Заказы.МесяцОтгрузки
ПОМЕСТИТЬ ЗаказыТовары
ИЗ
    Заказы КАК Заказы
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
        ПО Заказы.Ссылка = ЗаказПокупателяТовары.Ссылка
ГДЕ
    ЗаказПокупателяТовары.НомерСтроки = 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗаказПокупателяУслуги.Количество,
    ЗаказПокупателяУслуги.Номенклатура,
    ПРЕДСТАВЛЕНИЕ(ЗаказПокупателяУслуги.Номенклатура),
    Заказы.ДатаОтгрузки,
    Заказы.Ссылка,
    ПРЕДСТАВЛЕНИЕ(Заказы.Ссылка),
    Заказы.МесяцОтгрузки
ПОМЕСТИТЬ ЗаказыУслуги
ИЗ
    Заказы КАК Заказы
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.Услуги КАК ЗаказПокупателяУслуги
        ПО Заказы.Ссылка = ЗаказПокупателяУслуги.Ссылка
ГДЕ
    ЗаказПокупателяУслуги.НомерСтроки = 1
    И НЕ Заказы.Ссылка В
                (ВЫБРАТЬ
                    ЗаказыТовары.Ссылка
                ИЗ
                    ЗаказыТовары)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗаказыТовары.Количество,
    ЗаказыТовары.Номенклатура,
    ПРЕДСТАВЛЕНИЕ(ЗаказыТовары.Номенклатура),
    ЗаказыТовары.ДатаОтгрузки,
    ЗаказыТовары.Ссылка,
    ПРЕДСТАВЛЕНИЕ(ЗаказыТовары.Ссылка),
    ЗаказыТовары.МесяцОтгрузки
ИЗ
    ЗаказыТовары КАК ЗаказыТовары

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЗаказыУслуги.Количество,
    ЗаказыУслуги.Номенклатура,
    ПРЕДСТАВЛЕНИЕ(ЗаказыУслуги.Номенклатура),
    ЗаказыУслуги.ДатаОтгрузки,
    ЗаказыУслуги.Ссылка,
    ПРЕДСТАВЛЕНИЕ(ЗаказыУслуги.Ссылка),
    ЗаказыУслуги.МесяцОтгрузки
ИЗ
    ЗаказыУслуги КАК ЗаказыУслуги




Нельзя ли сделать короче?
1 Cyberhawk
 
20.10.15
16:31
ВЫБРАТЬ
    ВЫБОР
        КОГДА ЕСТЬNULL(ЗаказПокупателяТовары.Номенклатура, 0) = 0
            ТОГДА ЗаказПокупателяУслуги.Номенклатура
        ИНАЧЕ ЗаказПокупателяТовары.Номенклатура
    КОНЕЦ КАК ТоварУслуга
ИЗ
    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
        ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.Услуги КАК ЗаказПокупателяУслуги
        ПО ЗаказПокупателяТовары.Ссылка = ЗаказПокупателяУслуги.Ссылка
ГДЕ
    (ЗаказПокупателяТовары.НомерСтроки < 2
            ИЛИ ЗаказПокупателяУслуги.НомерСтроки < 2)
2 vdeemer
 
20.10.15
16:48
"Чем выше ум, тем тень длиннее ляжет, отброшенная им на дольний мир" (с)
Спасибо!
3 katc
 
20.10.15
16:49
КОГДА ЕСТЬNULL(ЗаказПокупателяТовары.Номенклатура, 0) = 0
            ТОГДА ЗаказПокупателяУслуги.Номенклатура

шедеврально, учитывая что ЗаказПокупателяТовары основная таблица
4 mikecool
 
20.10.15
16:49
(1) + добавить сортировку по доп полю + первые 1 видимо еще
5 katc
 
20.10.15
16:51
(3) сорри, там полное соединение.
но ЕСТЬNULL(ЗаказПокупателяТовары.Номенклатура, 0) = 0 просто как
Если Истина = Не Ложь Тогда
...
КонецЕсли
6 Cyberhawk
 
20.10.15
16:52
(5) ты не понял... это на случай, когда в заказе покупателя вообще нет товаров, но есть услуги
7 DexterMorgan
 
20.10.15
16:53
(1) ЕСТЬNULL(ЗаказПокупателяТовары.Номенклатура, 0) = 0

открой для себя "IS NULL":

"ВЫБОР КОГДА ЗаказПокупателяТовары.Номенклатура ЕСТЬ NULL"
8 rozer76
 
20.10.15
16:54
(1) просто но элегантно
9 DexterMorgan
 
20.10.15
16:56
(1) или лучше даже так:

ЕСТЬNULL(ЗаказПокупателяТовары.Номенклатура, ЗаказПокупателяУслуги.Номенклатура) КАК ТоварУслуга
10 Cyberhawk
 
20.10.15
16:56
(4) не надо - иначе выведется только один заказ, а надо-то по всем; про сортировку не понял - у нас одна таблица на выходе...
(7) Я так пробовал в начале, но не взлетело, поэтому и заменил. Потом уже понял, что не взлетело не из-за этого, но исправлять не стал :)
11 Cyberhawk
 
20.10.15
16:57
По замечаниям DexterMorgan сокращенный вариант:

ВЫБРАТЬ
    ЕСТЬNULL(ЗаказПокупателяТовары.Номенклатура, ЗаказПокупателяУслуги.Номенклатура) КАК ТоварУслуга
ИЗ
    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
        ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.Услуги КАК ЗаказПокупателяУслуги
        ПО ЗаказПокупателяТовары.Ссылка = ЗаказПокупателяУслуги.Ссылка
ГДЕ
    (ЗаказПокупателяТовары.НомерСтроки < 2
            ИЛИ ЗаказПокупателяУслуги.НомерСтроки < 2)
12 DexterMorgan
 
20.10.15
16:59
(11) =)
13 Лефмихалыч
 
20.10.15
16:59
ВЫБРАТЬ Ссылка, НомерСтроки, "Товары"
ИЗ Документ.ЗаказПокупателя.Товары
ГДЕ НомерСтроки = 1
// остальные отборы по ссылке
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Ссылка, НомерСтроки, "Услуги"
ИЗ Документ.ЗаказПокупателя.Услуги как У
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя.Товары как Т
ПО У.Ссылка = Т.Ссылка И Т.НомерСтроки = 1
ГДЕ НомерСтроки = 1 и Т.Ссылка есть NULL
// остальные отборы по ссылке
14 Лефмихалыч
 
20.10.15
17:00
сначала выгрести всё из товаров, потом пристегнуть из услуг, но только по тем документам, у которых товары пустые
15 vdeemer
 
20.10.15
17:14
Очень наглядно, спасибо!