Имя: Пароль:
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 мне очень помог, проблема решена.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn