Имя: Пароль:
1C
1С v8
Запрос, запустался с СОЕДИНЕНИЯМИ
,
0 Skom
 
01.02.13
12:42
Есть две таблицы, и возможны следующие их варианты
Таб1 A,B,C,D
Таб2 A,B,C,D,F
и
Таб1 A,B,C,D,F
Таб2 A,B,C,D

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

Запрос такого вида

ВЫБРАТЬ Таб1.Поле1, Таб2.Поле1 Из Таб1
ЛЕВОЕ СОЕДИНЕНИЕ Таб2 ПО Таб2.Поле1 = Таб1.Поле1

как сделать что бы всегда набор записей возвращал и значение F (из данного примера)
1 cw014
 
01.02.13
12:43
ПОЛНОЕ СОЕДИНЕНИЕ
2 Skom
 
01.02.13
12:43
а то в первом варианте таблицы в результате запрос возвращает  4 строки
3 Ёпрст
 
01.02.13
12:43
(0) Выкинуть левое соединение, использовать Объединить все или Полное Соединение
4 Skom
 
01.02.13
12:48
ПОЛНОЕ не прокатило
5 Skom
 
01.02.13
12:48
вот сам запрос

ВЫБРАТЬ
   Продажи.Регистратор КАК Чек
   ,Продажи.Регистратор.СуммаДокумента КАК Сумма
   ,Продажи.Номенклатура КАК Номенклатура
   ,СУММА(isnull(Продажи.СтоимостьОборот,0)) КАК СуммаСтроки
   ,СУММА(isnull(ПродажиСебестоимость.СтоимостьОборот,0)) КАК Себестоимость
ИЗ
  РегистрНакопления.Продажи.Обороты(,,Регистратор,) КАК Продажи
ПОЛНОЕ СОЕДИНЕНИЕ
   РегистрНакопления.ПродажиСебестоимость.Обороты(,,Регистратор,) КАК ПродажиСебестоимость
                                           ПО ПродажиСебестоимость.Регистратор = Продажи.Регистратор И ПродажиСебестоимость.Номенклатура = Продажи.Номенклатура
ГДЕ
   
   Продажи.Регистратор В (&Док)
СГРУППИРОВАТЬ ПО
   Продажи.Регистратор,
   Продажи.Номенклатура,
   Продажи.Регистратор.СуммаДокумента
АВТОУПОРЯДОЧИВАНИЕ
6 Skom
 
01.02.13
12:49
в моем примере
Продажи - 6 строк
ПродажиСебестоимость - 7 строк

ЛЕВОЕ меняю на ПОЛНОЕ = 6 строк
7 cw014
 
01.02.13
12:49
ГДЕ
   
   Продажи.Регистратор В (&Док)

Вот потому и не прокатило
8 Skom
 
01.02.13
12:51
(7) не понял, если честно.

Продажи.Регистратор = ПродажиСебестоимость.Регистратор
9 Skom
 
01.02.13
12:51
+8 это в моем случае. регистратор у них один и тот же
10 Ёпрст
 
01.02.13
12:51
+7 этим условием ты сделал inner join
11 Fragster
 
гуру
01.02.13
12:51
(6) это потому что Продажи.Регистратор это NULL. вообще очень жестокий запрос.
12 Fragster
 
гуру
01.02.13
12:52
(10) нет, только левое. но вообще запрос надо выкинуть.
13 Skom
 
01.02.13
12:52
(12) предложи другой вариант?
14 Fragster
 
гуру
01.02.13
12:53
(13) выкинуть таблицы оборотов
15 Fragster
 
гуру
01.02.13
12:53
заменить на объединение 2-х запросов и сворачивание.
16 Skom
 
01.02.13
12:56
Не хотелось изначально так делать, потому что вместо

ГДЕ
   
   Продажи.Регистратор В (&Док)
там вот такой подзапрос))

ГДЕ
   
   Продажи.Регистратор В
   (
      ВЫБРАТЬ РАЗЛИЧНЫЕ
           Док.Документ КАК Чек
       ИЗ        
               (ВЫБРАТЬ
                   МАКСИМУМ(ВзаиморасчетыОбороты.Регистратор.Дата) КАК ДатаОплаты,
                   ВзаиморасчетыОбороты.Организация,
                   ВзаиморасчетыОбороты.ДокументРасчетовСКонтрагентом.Менеджер КАК Менеджер,
                   ВзаиморасчетыОбороты.ДокументРасчетовСКонтрагентом КАК Документ,
                   СУММА(ВзаиморасчетыОбороты.СуммаВзаиморасчетовРасход+ВзаиморасчетыОбороты.СуммаВзаиморасчетовПриход*-1),
                   ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток
               ИЗ
                   РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Обороты(&НачДата, &КонДата,Регистратор,Организация В (&СписокОрганизаций)) КАК ВзаиморасчетыОбороты
               ЛЕВОЕ СОЕДИНЕНИЕ
                   РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&КонДата) КАК ВзаиморасчетыОстатки ПО
                       ВзаиморасчетыОстатки.ДокументРасчетовСКонтрагентом = ВзаиморасчетыОбороты.ДокументРасчетовСКонтрагентом
               ГДЕ
                   ВзаиморасчетыОбороты.ДокументРасчетовСКонтрагентом.Контрагент  В (&Контрагенты) И
                   ТипЗначения(ВзаиморасчетыОбороты.ДокументРасчетовСКонтрагентом) = ТИП(Документ.РеализацияТоваровУслуг)
                   И ТипЗначения(ВзаиморасчетыОбороты.Регистратор) <> ТИП(Документ.РеализацияТоваровУслуг)
                   И ЕСТЬNULL(ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток,0) <= 0
               СГРУППИРОВАТЬ ПО
                   ВзаиморасчетыОбороты.Организация,
                   ВзаиморасчетыОбороты.ДокументРасчетовСКонтрагентом.Менеджер,
                   ВзаиморасчетыОбороты.ДокументРасчетовСКонтрагентом,
                   ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток
       
               ОБЪЕДИНИТЬ ВСЕ
           
               ВЫБРАТЬ
                   МАКСИМУМ(ВзаиморасчетыОбороты.ДокументРасчетовСКонтрагентом.Дата) КАК ДатаОплаты,
                   ВзаиморасчетыОбороты.Организация,
                   ВзаиморасчетыОбороты.Регистратор.Менеджер КАК Менеджер,
                   ВзаиморасчетыОбороты.Регистратор КАК Документ,
                   СУММА(ВзаиморасчетыОбороты.СуммаВзаиморасчетовПриход),
                   0 КАК СуммаВзаиморасчетовОстаток
               ИЗ
                   РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Обороты(&НачДата, &КонДата,Регистратор,Организация В (&СписокОрганизаций)) КАК ВзаиморасчетыОбороты
                   ЛЕВОЕ СОЕДИНЕНИЕ
                       РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(&КонДата) КАК ВзаиморасчетыОстатки ПО
                       ВзаиморасчетыОстатки.ДокументРасчетовСКонтрагентом = ВзаиморасчетыОбороты.Регистратор
               ГДЕ
                   ВзаиморасчетыОбороты.Регистратор.Контрагент  В (&Контрагенты) И
                   ТипЗначения(ВзаиморасчетыОбороты.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
                   И ТипЗначения(ВзаиморасчетыОбороты.ДокументРасчетовСКонтрагентом) <> ТИП(Документ.РеализацияТоваровУслуг)
                   И ЕСТЬNULL(ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток,0) <= 0
               СГРУППИРОВАТЬ ПО
                   ВзаиморасчетыОбороты.Организация,
                   ВзаиморасчетыОбороты.Регистратор.Менеджер,
                   ВзаиморасчетыОбороты.Регистратор,
                   0                              
               ) КАК Док
   )
17 НафНаф
 
01.02.13
12:57
объединение в ВТ
выбрать различные из ВТ
18 Fragster
 
гуру
01.02.13
12:58
(16) выкинь все нафиг
19 acsent
 
01.02.13
12:58
а почему в продажах нет одной номенклатуры?
20 Skom
 
01.02.13
12:59
(19) там стоит 0 цена, поэтому он в продажи не попадает а в себестоимости отражается.
PS Особенности национального учета)
21 Skom
 
01.02.13
12:59
+19 привет, земляк!))
22 Ёпрст
 
01.02.13
13:00
(16) забавный запрос, особенно в части фильтрации оборотов по конкретным видам доков
23 Skom
 
01.02.13
13:01
(18) особенности учета оплаченной реализации.
24 Skom
 
01.02.13
13:05
Смысл запроса из (5)

В табличной части документа "Реализация" например 10 строк.
Номенклатура в 2 строках повторяется (например списание одной со склада а второй из резерва)

Надо получить данные из регистра ПРОДАЖИ + ПРОДАЖИСЕБЕСТОИМОСТЬ

А по факту в этих регистрах может получиться разное количество строк.
25 cw014
 
01.02.13
13:06
(23)

ВЫБРАТЬ
   ВложенныйЗапрос.Чек,
   ВложенныйЗапрос.Сумма,
   ВложенныйЗапрос.Номенклатура,
   СУММА(ВложенныйЗапрос.СуммаСтроки) КАК СуммаСтроки,
   СУММА(ВложенныйЗапрос.Себестоимость) КАК Себестоимость
ИЗ
(ВЫБРАТЬ
   Продажи.Регистратор КАК Чек,
   Продажи.Регистратор.СуммаДокумента КАК Сумма
   Продажи.Номенклатура КАК Номенклатура,
   Продажи.СтоимостьОборот КАК СуммаСтроки,
   0 КАК Себестоимость
ИЗ
  РегистрНакопления.Продажи.Обороты(,,Регистратор,) КАК Продажи
ГДЕ
   Продажи.Регистратор В (&Док)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   ПродажиСебестоимость.Регистратор,
   ПродажиСебестоимость.Регистратор.СуммаДокумента
   ПродажиСебестоимость.Номенклатура,
   0,
   ПродажиСебестоимость.СтоимостьОборот
ИЗ
РегистрНакопления.ПродажиСебестоимость.Обороты(,,Регистратор,) КАК ПродажиСебестоимость
ГДЕ
ПродажиСебестоимость.Регистратор В (&Док)) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Чек,
   ВложенныйЗапрос.Сумма,
   ВложенныйЗапрос.Номенклатура
26 Skom
 
01.02.13
13:13
+25 такая реализация не очень красивая в моем случае из за слишком большого условия &Док
27 Skom
 
01.02.13
13:13
но рабочая, признаю
28 Skom
 
01.02.13
13:23
О, нашел выход, вот так надо сделать))

ВЫБРАТЬ РАЗЛИЧНЫЕ
   Д.Номенклатура
   ,Продажи.Регистратор КАК Чек
   ,Продажи.Регистратор.СуммаДокумента КАК Сумма
   //,Продажи.Номенклатура КАК Номенклатура
   ,СУММА(isnull(Продажи.СтоимостьОборот,0)) КАК СуммаСтроки
   ,СУММА(isnull(ПродажиСебестоимость.СтоимостьОборот,0)) КАК Себестоимость
ИЗ
   Документ.РеализацияТоваровУслуг.Товары КАК Д
ЛЕВОЕ СОЕДИНЕНИЕ
  РегистрНакопления.Продажи.Обороты(,,Регистратор,) КАК Продажи ПО Продажи.Регистратор = Д.Ссылка И Продажи.Номенклатура = Д.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ
   РегистрНакопления.ПродажиСебестоимость.Обороты(,,Регистратор,) КАК ПродажиСебестоимость
                                           ПО ПродажиСебестоимость.Регистратор = Д.Ссылка И ПродажиСебестоимость.Номенклатура = Д.Номенклатура
ГДЕ
   
   Д.Ссылка В (&Док)
СГРУППИРОВАТЬ ПО
   Продажи.Регистратор,
   Д.Номенклатура,
   Продажи.Регистратор.СуммаДокумента
АВТОУПОРЯДОЧИВАНИЕ
2 + 2 = 3.9999999999999999999999999999999...