Имя: Пароль:
1C
1С v8
Как через СКД выполнить вывод незаполненных строк
0 a2a4
 
17.09.19
08:29
Есть несколько регистров. Общее у них всех - номенклатура. Но остатки могут различаться (из-за любви бухгалтеров переодически править документом корректировка записей регистров). Хочу через СКД вывести данные о всех регистрах с группировкой по номенклатуре. Как сделать вывод строки для регистров по которым нет остатков?

По факту через все имеющиеся остатки по всем регистрам я формирую список Номенклатуры и к ней цепляю остатки по разным регистрам. Одна из колонок - в текстовом виде наименование регистра. Если остатков по какому-то регистру нет, то должна выводиться пустая строка у которой заполнен только столбец с наименование регистра.

зы. да, знаю как сделать обычным отчетом, но интересно именно СКД, так как там значительный функционал по всяким отборам и прочему.
1 FIXXXL
 
17.09.19
08:50
(0) тебе весь справочник Номенклатура нужен? или только номенклатура, которая фигурирует в любом из интересующих регистров?
2 a2a4
 
17.09.19
08:53
(1) только номенклатура которая присутсвует в любом из регистров. Получить список номенклатуры не проблема.
3 FIXXXL
 
17.09.19
08:55
(2) ну и? собираешь ВТ номенклатур, к ней левым соединением остатки (что не есть хорошо, но отчет админский)
4 a2a4
 
17.09.19
08:56
(3) Есть регистр1, регистр2, регистр3. По регистрам 1 и 2 остатков нет. Прицепи его.
5 FIXXXL
 
17.09.19
08:58
(4) товар же есть в регистре3? прицепится с NULL ;)
6 FIXXXL
 
17.09.19
08:59
(5) + но сначала - ВТ товаров по всем трем регистрам
7 тарам пам пам
 
17.09.19
09:13
(3) такое лучше делать не соединением, а объединением:


ВЫБРАТЬ
    ВложенныйЗапрос.Номенклатура КАК Номенклатура,
    СУММА(ВложенныйЗапрос.Количество1) КАК Количество1,
    СУММА(ВложенныйЗапрос.Количество2) КАК Количество2
ИЗ (ВЫБРАТЬ
        Регистр1.Номенклатура КАК Номенклатура,
        Регистр1.Количество КАК Количество1,
        NULL КАК Количество2
    ИЗ РегистрыНакопления.Регистр1.Остатки() КАК Регистр1

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

    ВЫБРАТЬ
        Регистр2.Номенклатура,
        NULL,
        Регистр2.Количество
    ИЗ РегистрыНакопления.Регистр2.Остатки() КАК Регистр2) КАК ВложенныйЗапрос
8 FIXXXL
 
17.09.19
10:05
(7) соединение с ВТ - на каждый регистр, а потом все в кучу объединить конечно
ну или один запрос с кучей левых и вывод каждого регистра в свою колонку... тут уж от задачи
9 a2a4
 
17.09.19
10:08
Вижу народ вообще не врубается в проблему.

Регистров НЕСКОЛЬКО.
По факту от всех соединений и объединений будет таблица вида

номенклатура1 регистр1
номенклатура1 регистр2
номенклатура1 регистр3
номенклатура2 регистр2
(по номенклатуре2 больше нет остатков)

Это все группируется по номенклатуре, КАК ВЫВЕСТИ СТРОКИ по номенклатуре2 и регистрам 1 и 3?
10 FIXXXL
 
17.09.19
10:53
(9) вижу ты читаешь невнимательно :)

Регистр1.Номенклатура
ПОМЕСТИТЬ ВТНоменклатура
ОБЪЕДИНИТЬ
Регистр2.Номенклатура
ОБЪЕДИНИТЬ
Регистр3.Номенклатура

и вот эту ВТ всех номенклатур с хоть каким то остатком по любому регистру соединяй уже с каждой таблицей остатков
11 a2a4
 
17.09.19
12:29
(10) как я прикреплю остаток которого нет? Не надо путать эту ситуацию с случаем когда у вас ДВЕ таблицы с левым соединением - вот здесь вы получите NULL. Если таблиц несколько, то никогда не получите NULL если есть хоть один остаток.
Если внимательно прочитать (0), то там написано - для регистра без остатка выводить пустую строку (только колонка с наименованием регистра должна быть заполнена).
Кроме того, почему то решили что я все данные по регистрам хочу запихать в одну строку - так нет. Каждому регистру отдельная строка.
12 FIXXXL
 
17.09.19
12:40
(11) я не путаю, я пытаюсь донести про ДВЕ таблицы
1.полная таблица всех номенклатур, хоть с каким остатком, предварительно собранная по всем регистрам остатков
2.таблица остатков по регистрN
3.ОБЪЕДИНИТЬ, повторить по количеству регистров
13 FIXXXL
 
17.09.19
12:50
держи

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТНоменклатура
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки

ОБЪЕДИНИТЬ

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ТоварыОрганизацийОстатки.АналитикаУчетаНоменклатуры.Номенклатура
ИЗ
    РегистрНакопления.ТоварыОрганизаций.Остатки КАК ТоварыОрганизацийОстатки
;

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

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

ВЫБРАТЬ
    ВТНоменклатура.Номенклатура,
    "НаОрганизациях",
    ТоварыОрганизацийОстатки.КоличествоОстаток
ИЗ
    ВТНоменклатура КАК ВТНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.Остатки КАК ТоварыОрганизацийОстатки
        ПО ВТНоменклатура.Номенклатура = ТоварыОрганизацийОстатки.АналитикаУчетаНоменклатуры.Номенклатура
14 a2a4
 
17.09.19
12:51
Выбрать
  "Рег1" КАК НаимРег,
  рег1.Номенклатура,
  рег1.ОстатокКоличество,
  рег1.ОстатокСумма,
  рег1.Реквизит1 КАК рег1Реквизит1 ,
  NULL КАК рег2Реквизит1
Поместить ВТОстатки
ИЗ
  РегистрНакопления.рег1 КАК рег1

Объединить ВСЕ

Выбрать
  "Рег2",
  рег2.Номенклатура,
  рег2.ОстатокКоличество,
  рег2.ОстатокСумма,
  NULL,
  рег2.Реквизит1
ИЗ
  РегистрНакопления.рег2 КАК рег2
;
ВЫБРАТЬ РАЗЛИЧНЫЕ
  ВТОстатки.Номенклатура
Поместить СписокНоменклатуры
ИЗ ВТОстатки КАК ВТОстатки
;
Выбрать
  "Рег1" КАК НаимРег
Поместить СписокРегистров
ОБЪЕДИНИТЬ
Выбрать
  "Рег2"
;
Выбрать
  СписокНоменклатуры.Номенклатуры Как Номенклатура,
  СписокРегистров.НаимРег КАК НаимРег
Поместить НомИСписокРег
Из
  СписокНоменклатуры КАК СписокНоменклатуры
    ПОЛНОЕ СОЕДИНЕНИЕ СписокРегистров КАК СписокРегистров
    ПО ИСТИНА
;
ВЫБРАТЬ
  НомИСписокРег.Номенклатура,
  НомИСписокРег.НаимРег,
  ВТОстатки.ОстатокКоличество,
  ВТОстатки.ОстатокСумма,
  ВТОстатки.рег1Реквизит1,
  ВТОстатки.рег2Реквизит1
ИЗ
  НомИСписокРег КАК НомИСписокРег
    ЛЕВОЕ СОЕДИНЕНИЕ ВТОстатки КАК ВТОстатки
    ПО НомИСписокРег.Номенклатура = ВТОстатки.Номенклатура
      И НомИСписокРег.НаимРег = ВТОстатки.НаимРег



проверено рабочее. только сокращенное. у меня 4 регистра и порядка 16 полей
15 тарам пам пам
 
17.09.19
13:26
(14) Какая-то дичь, если честно. Нафига вообще нужна вся вторая половина запроса? Достаточно только самого первого запроса из пакета (который с объединением).
16 тарам пам пам
 
17.09.19
13:35
а если нужны строки с нулевыми остатками (т. е. чтобы гарантированно были записи по всем 4 регистрам), то нужно просто в то же объединение их и добавить:


Выбрать
  "Рег1" КАК НаимРег,
  рег1.Номенклатура,
  рег1.ОстатокКоличество,
  рег1.ОстатокСумма,
  рег1.Реквизит1 КАК рег1Реквизит1 ,
  NULL КАК рег2Реквизит1
ИЗ
  РегистрНакопления.рег1 КАК рег1

Объединить ВСЕ

Выбрать
  "Рег1" КАК НаимРег,
  NULL,
  0,
  0,
  NULL,
  NULL

Объединить ВСЕ

<аналогично остальные регистры>
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой