Имя: Пароль:
1C
1С v8
Запрос: как вывести в результат дополнительные строки?
0 jyupiter
 
22.11.17
05:59
УТ 10.3, Обычные формы, хотя это, наверное, неважно.

Есть задача: проанализировать ассортимент покупок контрагента за период, вывести его в отчёт. Если ассортимент меньше 4 позиций, тогда вывести дополнительно пустые строки с номером. Если больше/равно, то вывести в отчёт весь ассортимент, без дополнительных строк.

Начал писать запрос, и встал в тупик. Как связать таблицу из 4 строк (временная таблица ВТ_4) и таблицу регистра накопления, чтобы левые строки выходили только когда не хватает

Кажется, что решение простое и где-то на поверхности, но чё-то не даётся.

ВЫБРАТЬ
    ВЫБОР
        КОГДА ПОДСТРОКА(Контрагенты.Код, 8, 1) = "1"
            ТОГДА "1"
        КОГДА ПОДСТРОКА(Контрагенты.Код, 8, 1) = "2"
            ТОГДА "2"
        КОГДА ПОДСТРОКА(Контрагенты.Код, 8, 1) = "3"
            ТОГДА "3"
        ИНАЧЕ "4"
    КОНЕЦ КАК ПустаяНоменклатура
ПОМЕСТИТЬ ВТ_4
ИЗ
    Справочник.Контрагенты КАК Контрагенты
;

/////////////////////////
ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Контрагент,
    Продажи.Количество,
    Продажи.Стоимость
ИЗ
    ВТ_4 КАК ВТ_4,
    РегистрНакопления.Продажи КАК Продажи
1 Fram
 
22.11.17
06:22
Интересно что заставляет тебя думать что твоя ВТ_4 состоит из 4 строк?!
2 VladZ
 
22.11.17
06:30
(0) Не понял, как связано "Если ассортимент меньше 4 позиций" и "ПОДСТРОКА(Контрагенты.Код, 8, 1) = "1""
3 VladZ
 
22.11.17
06:35
(0) Информатика опирается на математические законы. А математика, в свою очередь - точная наука. И здесь "кажется..." неуместно. Либо есть решение, либо его нет.
4 Рэйв
 
22.11.17
06:42
(0)СКД?
5 jyupiter
 
22.11.17
07:17
(1) У меня там на самом деле "ВЫБРАТЬ РАЗЛИЧНЫЕ", и я точно знаю, что строк там 4 (через консоль запросов)

(2) Подстрока из кода контрагента -- это просто первый пришедший в голову способ получить 4 разных значения

(4) Просто запрос для построителя отчёта
6 VladZ
 
22.11.17
07:21
(5) ну и зачем такие сложности?
Выбрать различные 4...
7 VladZ
 
22.11.17
07:22
+6 упс: ВЫБРАТЬ ПЕРВЫЕ 4
8 jyupiter
 
22.11.17
07:23
(3) Есть разные мнения насчёт того, наука ли математика, или же язык науки. Но программирование -- это не столько наука, сколько ремесло, а местами искусство, и бывают приёмы, которые знают опытные товарищи, но которые не приходят в голову новичку.

Мне здесь уже не раз дарили идеи, отталкиваясь от которых я доходил до нужного результата. Мне КАЖЕТСЯ, что задача эта неединичная, что разные люди могли её решать какими-то способами, и один из них мне подойдёт.

(5) Главное, что он даёт таблицу из 4 значений: {"1", "2", "3","4"}. Как её связать с таблицей продаж, чтобы вместо недостающих товаров выходили цифры?
9 Redkiy
 
22.11.17
07:28
(0) Дичь какая-то.
Как ассортимент покупок клиента за период связан с кодом элемента справочника Контрагенты?
10 jyupiter
 
22.11.17
07:36
(9) Ассортимент покупок клиента связан с регистром Продажи.
А из кода контрагентов просто набирается временная таблица из 4 значений (этот кусок меня устраивает, непонятка начинается ниже, в итоговом запросе).

Я не утверждаю, что это единственно возможный способ и буду рад любой другой идее, как в результате запроса получить дополнительные колонки
11 Redkiy
 
22.11.17
07:51
Добавь к основной таблице продаж

ВЫБРАТЬ
    1 КАК Поле1
ПОМЕСТИТЬ ПустыеСтроки

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

ВЫБРАТЬ
    2

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

ВЫБРАТЬ
    3

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

ВЫБРАТЬ
    4
;

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

СГРУППИРОВАТЬ ПО
    Продажи.Контрагент

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Номенклатура) < 4
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    NULL КАК Номенклатура,
    ХеровыеПокупатели.Контрагент,
    NULL КАК Количество,
    NULL КАК Стоимость
ИЗ
    ХеровыеПокупатели КАК ХеровыеПокупатели
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПустыеСтроки КАК ПустыеСтроки
        ПО ХеровыеПокупатели.Сделка <= ПустыеСтроки.Поле1
12 Сти
 
22.11.17
08:11
(0) Легко. Даже с нумерацией строк прямо в запросе. Правда на больших объемах работать долго будет )
(8) Таблица из {1..4} чаще получают другим способом:
ВЫБРАТЬ    1 КАК Цифра ПОМЕСТИТЬ ВТ_Цифры
ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4

Но она тут скорее всего бесполезна, если хочешь добавить строки с отсутствием номенклатуры для каждого контрагента.
13 Сти
 
22.11.17
08:30
(12) Подтверждение, что легко. Опровержение, что {1..4}бесполезна. Ну и готовый запрос:
ВЫБРАТЬ    1 КАК Цифра ПОМЕСТИТЬ ВТ_Цифры ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиОбороты.Контрагент КАК Контрагент,
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот,
    ПродажиОбороты.СтоимостьОборот
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
    РегистрНакопления.Продажи.Обороты(&Дата1, &Дата2, , ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Т1.НомерСтроки КАК НомерСтроки,
    Т1.Контрагент КАК Контрагент,
    Т1.Номенклатура,
    ВТ_Продажи.КоличествоОборот,
    ВТ_Продажи.СтоимостьОборот
ИЗ
    (ВЫБРАТЬ
        ЕСТЬNULL(ВТ_ПронумерованныеКонтрагентыНоменклатура.НомерСтроки, От1до4.Цифра) КАК НомерСтроки,
        ЕСТЬNULL(ВТ_ПронумерованныеКонтрагентыНоменклатура.Контрагент, От1до4.Контрагент) КАК Контрагент,
        ВТ_ПронумерованныеКонтрагентыНоменклатура.Номенклатура КАК Номенклатура
    ИЗ
        (ВЫБРАТЬ
            Продажи1.Контрагент КАК Контрагент,
            Продажи1.Номенклатура КАК Номенклатура,
            СУММА(1) КАК НомерСтроки
        ИЗ
            ВТ_Продажи КАК Продажи1
                ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Продажи КАК Продажи2
                ПО Продажи1.Контрагент = Продажи2.Контрагент
                    И Продажи1.Номенклатура >= Продажи2.Номенклатура
        
        СГРУППИРОВАТЬ ПО
            Продажи1.Контрагент,
            Продажи1.Номенклатура) КАК ВТ_ПронумерованныеКонтрагентыНоменклатура
            ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
                ВТ_Продажи.Контрагент КАК Контрагент,
                ВТ_Цифры.Цифра КАК Цифра
            ИЗ
                ВТ_Продажи КАК ВТ_Продажи,
                ВТ_Цифры КАК ВТ_Цифры) КАК От1до4
            ПО ВТ_ПронумерованныеКонтрагентыНоменклатура.Контрагент = От1до4.Контрагент
                И ВТ_ПронумерованныеКонтрагентыНоменклатура.НомерСтроки = От1до4.Цифра) КАК Т1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Продажи КАК ВТ_Продажи
        ПО Т1.Контрагент = ВТ_Продажи.Контрагент
            И Т1.Номенклатура = ВТ_Продажи.Номенклатура

УПОРЯДОЧИТЬ ПО
    Контрагент,
    НомерСтроки
14 wondkind
 
22.11.17
08:38
Надеюсь ТС будет и дальше мучаться с таким умением программировать
15 jyupiter
 
22.11.17
08:58
(14) Спасибо на добром слове. Надеюсь, оно к вам не раз ещё вернётся.

(13) Получилось немного не то. Потому что номер строки нужен был в поле, где пустая номенклатура. Но я переделал

        ЕСТЬNULL(ВТ_ПронумерованныеКонтрагентыНоменклатура.НомерСтроки, От1до4.Цифра) КАК НомерСтроки,
        ЕСТЬNULL(ВТ_ПронумерованныеКонтрагентыНоменклатура.Контрагент, От1до4.Контрагент) КАК Контрагент,
        ВТ_ПронумерованныеКонтрагентыНоменклатура.Номенклатура КАК Номенклатура

на
        ЕСТЬNULL(ВТ_ПронумерованныеКонтрагентыНоменклатура.НомерСтроки, От1до4.Цифра) КАК НомерСтроки,
        ЕСТЬNULL(ВТ_ПронумерованныеКонтрагентыНоменклатура.Контрагент, От1до4.Контрагент) КАК Контрагент,
        ЕСТЬNULL(ВТ_ПронумерованныеКонтрагентыНоменклатура.Номенклатура, От1до4.Цифра) КАК Номенклатура

и всё срослось. Громадное спасибо.

(11) Спасибо, я попробовал, но не получилось, потому что при взятии итогов несколько строк с пустой номенклатурой сворачивались в одну. Мне поэтому и нужны были различные значения для пустых строк. Но 13 мне очень помог, проблема решена.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн