Имя: Пароль:
1C
1С v8
Разъясните по ОБЪЕДИНИТЬ ВСЕ в запросе
,
0 ValeriTim
 
17.08.15
16:43
У меня запрос с временными таблицами, в которых формируются данные для последующего объединения. В итоге объединяются две таблицы с одинаковыми полями, но полученные из разных данных. В обеих таблицах есть (упрощенно) три поля: Контрагент, ДоговорКонтрагента и Сумма. Так вот проблема состоит в том, что если в первой таблице контрагент = NULL, то он не берется из второй, как я того ожидал ... Как быть?
1 NcSteel
 
17.08.15
16:44
А причем тут Объединение и "он не берется из второй".

Что бы брался из второй, то надо соединять
2 Попытка1С
 
17.08.15
16:45
"то он не берется из второй, как я того ожидал"

ну ты явно погорячился с ожиданиями..
3 Волшебник
 
модератор
17.08.15
16:45
ОБЪЕДИНИТЬ ВСЕ просто соединяет две таблицы с одинаковым количеством полей
4 18_plus
 
17.08.15
16:45
объединить все - это взять первую таблицу и прилепить снизу вторую, никаких если там быть не может.
5 Господин ПЖ
 
17.08.15
16:45
куда не берет?
6 Зеленый пень
 
17.08.15
16:45
Как быть? Почитать, как работает  ОБЪЕДИНИТЬ ВСЕ.
Лучше - в оригинальном виде sql: UNION ALL
7 ДенисЧ
 
17.08.15
16:46
(6) берём первую таблицу, дописываем к ней снизу вторую.
Всё.
8 ValeriTim
 
17.08.15
16:46
Понятно, что я не того ожидал ... Как быть ?
(5) никуда не берет :)
9 18_plus
 
17.08.15
16:46
(8) а что нужно-то?
10 Господин ПЖ
 
17.08.15
16:46
>Как быть ?

бросить пить для начала
11 Живой Ископаемый
 
17.08.15
16:47
2(8) полное соединение
12 Necessitudo
 
17.08.15
16:47
(8) Левое соединение, внутреннее соединение, полное соединение.
13 ValeriTim
 
17.08.15
16:48
Как дохрена тут всегда было юмористов ...
14 Живой Ископаемый
 
17.08.15
16:49
2(13) А сейчас уже все?
15 ValeriTim
 
17.08.15
16:49
(14) а ты сам то не видишь?
16 CHerypga
 
17.08.15
16:50
(0) вангую что нужно ОБЪЕДИНИТЬ ВСЕ сперва во временную таблицу, а затем сгруппировать
17 ValeriTim
 
17.08.15
16:52
(16) хреновая из тебя Ванга ... объединение то и не получается ...
18 organizm
 
17.08.15
16:58
может просто "ОБЪЕДИНИТЬ" ?
19 Господин ПЖ
 
17.08.15
16:59
юмористы давно кончились...

вокруг одни наркоманы
20 CHerypga
 
17.08.15
16:59
(17) объединение не может не получиться. если колонки не совпадают, то вообще не взлетит, а если совпадают, то объединится в любом случае.
21 itlikbez
 
17.08.15
17:00
(18) Не может. Автору не нужно "просто объединить". Да собственно практически никому такая операция не нужна.
22 ValeriTim
 
17.08.15
17:07
Все четыре поля есть в обеих таблицах

Таблица 1

Контрагент | Договор | Номенклатура | Сумма
Иванов | Дог 1 | Товар1 | 120
Петров | Дог 2 | NULL | NULL

Таблица 2

Контрагент | Договор | Номенклатура | Сумма
Иванов | Дог 1 | NULL | NULL
Петров | Дог 2 | Товар 2 | 230

Должно получиться:
Иванов | Дог 1 | Товар 1 | 120
Петров | Дог 2 | Товар 2 | 230
23 DS
 
17.08.15
17:10
Перед объединением убери записи с нуллами в обеих таблицах.
24 ValeriTim
 
17.08.15
17:11
(23) Как ?
25 DS
 
17.08.15
17:12
Вариантов есть. Но проще подправить имеющийся, чем выдумывать все возможные.
26 Господин ПЖ
 
17.08.15
17:13
>Должно получиться

от действия union all??

завязывай с грибами
27 Господин ПЖ
 
17.08.15
17:14
>Перед объединением убери записи с нуллами в обеих таблицах.

а смысл
28 sash-ml
 
17.08.15
17:14
как то так
имеющие не Товар ЕСТЬ NULL
29 Господин ПЖ
 
17.08.15
17:15
>имеющие не Товар ЕСТЬ NULL

убирай, Зина, водку...
30 Живой Ископаемый
 
17.08.15
17:16
это какой-то стремный мистец. человеку уже подсказали, а он продолжает тупить
31 ValeriTim
 
17.08.15
17:18
(30) Где, блин, где эта подсказка ?
32 DS
 
17.08.15
17:18
(27) Чтобы получить нужное:

Таблица 1:

Контрагент | Договор | Номенклатура | Сумма
Иванов | Дог 1 | Товар1 | 120

Таблица 2:

Контрагент | Договор | Номенклатура | Сумма
Петров | Дог 2 | Товар 2 | 230

Получим:

Иванов | Дог 1 | Товар 1 | 120
Петров | Дог 2 | Товар 2 | 230
33 Бубка Гоп
 
17.08.15
17:19
(29) имеющие? О_о
34 ValeriTim
 
17.08.15
17:20
(32) я не могу выборку построить так. Вопросов бы не было.
35 Бубка Гоп
 
17.08.15
17:21
(31) хоспади...
убери из результата нуллы и объедини все. чего непонятно то?
36 18_plus
 
17.08.15
17:21
можно и не убирать, а сгруппировать по договору и контрагенту. и написать СУММА(ЕСТЬNULL(ПолеСумма, 0))
37 Бубка Гоп
 
17.08.15
17:21
(34) Где НЕ Товар ЕСТЬ NULL
38 Господин ПЖ
 
17.08.15
17:22
(32) а...в  этом смысле

откуда вообще взялись

Петров | Дог 2 | NULL | NULL

Иванов | Дог 1 | NULL | NULL

почему товаров нет
39 Господин ПЖ
 
17.08.15
17:22
(36) а товар выкинуть?
40 Бубка Гоп
 
17.08.15
17:23
(36) он привел не все поля запроса. если их там много, заколебется формулки рисовать для группировки и суммирования
41 18_plus
 
17.08.15
17:25
(39) ну пропустил, чего придираешься?
(40) проблемы индейцев шерифа не волнуют.
42 DS
 
17.08.15
17:26
(34) Семен Семеныч...
ВЫБРАТЬ
    т1.Контра,
    т1.Дог,
    т1.Товар,
    т1.Сумма
ИЗ
    т1 КАК т1
ГДЕ
    НЕ т1.Сумма ЕСТЬ NULL

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

ВЫБРАТЬ
    т2.Контра,
    т2.Дог,
    т2.Товар,
    т2.Сумма
ИЗ
    т2 КАК т2
ГДЕ
    НЕ т2.Сумма ЕСТЬ NULL
43 ValeriTim
 
17.08.15
17:30
Вот выложу весь запрос. Не спрашивайте почему сделано так - это далеко не финальный его вариант - будет еще изменяться.

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПоступлениеТоваровУслуг.Ссылка,
    ПоступлениеТоваровУслуг.Контрагент,
    ПоступлениеТоваровУслуг.ДоговорКонтрагента,
    ПоступлениеТоваровУслугОбъектыСтроительства.ОбъектСтроительства,
    ПоступлениеТоваровУслугОбъектыСтроительства.СтатьяЗатрат,
    ПоступлениеТоваровУслугОбъектыСтроительства.ВидРабот,
    ПоступлениеТоваровУслугОбъектыСтроительства.Сумма,
    ПоступлениеТоваровУслугОбъектыСтроительства.СтавкаНДС,
    ПоступлениеТоваровУслугОбъектыСтроительства.СуммаНДС,
    ВЫБОР
        КОГДА ПоступлениеТоваровУслуг.СуммаВключаетНДС
            ТОГДА ПоступлениеТоваровУслугОбъектыСтроительства.Сумма
        ИНАЧЕ ПоступлениеТоваровУслугОбъектыСтроительства.Сумма + ПоступлениеТоваровУслугОбъектыСтроительства.СуммаНДС
    КОНЕЦ КАК СуммаВсего
ПОМЕСТИТЬ ПоступленияОбъектСтроительства
ИЗ
    Документ.ПоступлениеТоваровУслуг.ОбъектыСтроительства КАК ПоступлениеТоваровУслугОбъектыСтроительства
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
        ПО ПоступлениеТоваровУслугОбъектыСтроительства.Ссылка = ПоступлениеТоваровУслуг.Ссылка
ГДЕ
    ПоступлениеТоваровУслугОбъектыСтроительства.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
;

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

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Счет08ОбъектСтроительства.Контрагент,
    Счет08ОбъектСтроительства.ДоговорКонтрагента,
    Счет08ОбъектСтроительства.ОбъектСтроительства,
    Счет08ОбъектСтроительства.СтатьяЗатрат,
    Счет08ОбъектСтроительства.ВидРабот,
    Счет08ОбъектСтроительства.Затратра,
    Счет08ОбъектСтроительства.ДокументПоступления,
    Счет08ОбъектСтроительства.Регистратор,
    Счет08ОбъектСтроительства.Сумма,
    Счет08ОбъектСтроительства.СтавкаНДС,
    Счет08ОбъектСтроительства.СуммаНДС,
    Счет08ОбъектСтроительства.СуммаВсего
ИЗ
    Счет08ОбъектСтроительства КАК Счет08ОбъектСтроительства

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

ВЫБРАТЬ
    Счет08Товары.Контрагент,
    Счет08Товары.ДоговорКонтрагента,
    Счет08Товары.ОбъектСтроительства,
    Счет08Товары.СтатьяЗатрат,
    Счет08Товары.ВидРабот,
    Счет08Товары.Затратра,
    Счет08Товары.ДокументПоступления,
    Счет08Товары.Регистратор,
    Счет08Товары.Сумма,
    Счет08Товары.СтавкаНДС,
    Счет08Товары.СуммаНДС,
    Счет08Товары.СуммаВсего
ИЗ
    Счет08Товары КАК Счет08Товары
44 Бубка Гоп
 
17.08.15
17:31
(43) зачем ты это сюда вывалил? тебе уже разжевали как делать надо, неужели непонятно?
45 ValeriTim
 
17.08.15
17:35
(44) все дело в том, что нельзя опереться на сумму для отбрасывания полей NULL - она всегда заполнена - это пока оборот 08 счета, а вот остальные поля заполняются по разному - могут быть заполнены, а могут и нет, а оборот должен остаться верным. По этому не получится фишка с отбрасыванием строк с NULL
46 18_plus
 
17.08.15
17:37
скопируй условия с типами документов в ГДЕ, и нулов не будет.
47 ValeriTim
 
17.08.15
17:41
(46) да они должны быть - иначе оборот 08 счета не сойдется
48 Бубка Гоп
 
17.08.15
17:41
(45) можно нескромный вопрос, а какого фейхоа запрос по документам делаешь?
49 18_plus
 
17.08.15
17:45
(47) куда не сойдётся? если ты один фик от null избавляться собрался?
50 ValeriTim
 
17.08.15
17:45
(48) мне нужно НДС достать
51 ValeriTim
 
17.08.15
17:46
(49) это где я такое сказал?
52 18_plus
 
17.08.15
17:46
(49) ты хочешь, чтобы там где null система сама придумала какого контрагента поставить?
53 ValeriTim
 
17.08.15
17:51
нет - для этого я сформировал 1 запрос - заполняющий "основную" часть - эта часть для всех последующих одинакова
54 Mirnin
 
17.08.15
17:52
ну (12) же, нет?
55 DS
 
17.08.15
17:53
(45) Тогда меняй нуллы нулями и пустыми ссылками, а потом группируй (суммы по сумме, ссылки по максимуму). Но все это, конечно, копрокодинг...
56 ValeriTim
 
17.08.15
17:55
(54) думал ... но либо придется в многих местах писать ЕСТЬNULL()
(55) или так ...