Имя: Пароль:
1C
1С v8
СКД, группировка с пустыми данными
0 QuestNew
 
12.05.15
07:58
Доброго дня, уважаемые.

Прошу помощи с простым концептуальным вопросом по СКД.
В наборах данных один запрос, во временную таблицу отбираю элементы справочника номенклатуры, затем левым соединением добавляю остатки по складам. Все работает.

НО! Когда пользователь накладывает фильтр по складу, в таблице остаются только номенклатурные позиции с остатками, а я хочу увидеть все номенклатурные позиции из временной таблицы своего запроса.

Подскажите, как решить проблему, заранее спасибо.
1 ЧеловекДуши
 
12.05.15
08:00
(0) Охарактеризуйте термин "пустыми данными"?
Как это понимать?
2 QuestNew
 
12.05.15
08:00
(1) Подразумеваю нулевые остатки номенклатуры.
3 QuestNew
 
12.05.15
08:05
Дополню огписание проблемы.
Пусть есть позиции товар1 и товар2, склады склад1 и склад2.
Остатки без фильтров выводятся так:
         склад1        склад2
товар1      1
товар2                     5

Когда пользователь накладываеь фильтр по складу, картина получается:
           склад2
товар2        5

А я хочу получить:
           склад2
товар1
товар2       5
4 MUXACb
 
12.05.15
08:19
(1) К сначала ко всей номенклатуре присоедини все склады, а потом ко всему этому присоединяй остатки по номенклатуре и складам
5 QuestNew
 
12.05.15
08:24
(4) А толку? Я так понимаю, что СКД накладывает фильтр на итоговую таблицу.

О!, идеи-вопросы:
1) получится ли решить проблему добавлением "ресурса", равного 1 для всех строк номенклатуры?

2) если сделать два набора данных, можно ли указать СКД, что фильтр следует применить к одному из наборов, а не итоговой таблице после объединения наборов данных?
6 fierylions
 
12.05.15
08:31
Нормально все отрабатывает:

ВЫБРАТЬ
    Товары.Ссылка
ПОМЕСТИТЬ Товары
ИЗ
    Справочник.Товары КАК Товары

;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Товары.Ссылка КАК Товар,
    ЕСТЬNULL(ОстаткиОстатки.колОстаток, 0) КАК Остаток
ИЗ
    Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки(
                ,
                Товар В
                        (ВЫБРАТЬ
                            Товары.Ссылка
                        ИЗ
                            Товары КАК Товары)
                    И Склад = &Склад) КАК ОстаткиОстатки
        ПО Товары.Ссылка = ОстаткиОстатки.Товар


Результат:
если отбор по Складу 1
Склад = Склад1 Товар = Товар1  Количество = 1
Склад = Null   Товар = Товар2  Количество = 0
7 QuestNew
 
12.05.15
08:41
(6) т.е. решением проблемы в вашем примере служит прямое прописание фильтра в запросе СКД, мысль понял, спасибо!

Если не найду универсального решения, придется прописывать возможные фильтры... Спасибо!

Остатки с фильтром по номенклатуре - вымышленный простейший пример, иллюстрирующий мою проблему. В реальности фильтры могут быть по множеству параметров, прописать все будет проблематично.
8 fierylions
 
12.05.15
08:48
(7) Что бы у вас работало да же без явного указания параметров вам нужно отключить галку в конструкторе "Автоупорядочивание". Тогда СКД будет работать именно указано в запросе.
9 MUXACb
 
12.05.15
10:04
(7) У меня все работает. Объяснять принцип работы СКД долго.
Да, у меня "Автоупорядочивание" тоже выключено. С включенным не пробовал
10 QuestNew
 
12.05.15
11:29
(8),(9) Уважаемые, прошу помочь, проскальзываю, где эта галка автоупорядочивания, которую нужно отключить?
11 1976vas
 
12.05.15
11:36
(10) Я так понимаю, про "Автозаполнение" речь.
12 MUXACb
 
12.05.15
11:52
(10) Пардон, "Автозаполнение"...
13 ИС-2
 
naïve
12.05.15
11:59
в запросе на закладке "Компоновка" можно выделить поле для фильтра.
Или просто переименовать его. Например, Клиент в КлиентИзВТ и отбторы делать по КлиентИзВТ
14 QuestNew
 
12.05.15
16:33
(13) Пробую реализовать ваш вариант.
1. Сделал промежуточную временную таблицу, в которой определил поле для фильтра по "складу".
2. В итоговой таблице делаю полное объединение временной таблицы "номенклатуры" с "остатками".

В итоге вижу, что добавленное поле для фильтра по "складу" работает (налагаемые фильтры влияют на группировку "складов"), но "номенклатура" остается усеченной - без позиций с нулевыми остатками.

Что-то делаю неправильно, что не пойму
15 1976vas
 
12.05.15
16:43
(14) А в консоли запросов работает? Пробуй сначала в консоли запросов запустить, потом с СКД сравнивай.
16 QuestNew
 
12.05.15
16:50
(15) В консоли я вижу нужный результат. Запрос висит долго, но в итоговой таблице выдает всю "номенклатуру".

СКД тоже висит долго, но в итоге выдает только позиции с остатками.
17 1976vas
 
12.05.15
16:53
(16) Сравни тогда запрос в консоли СКД исходный и после компоновки макета.
18 QuestNew
 
12.05.15
17:07
(17) Эх, не знаю как, буду изучать )  Спасибо за наводку!
19 1976vas
 
12.05.15
19:13
(18) Это не наводка, я и сам не силен в СКД, но есть хорошие курсы по СКД у Гилева, там сразу можно увидеть своеобразный отладчик - консоль СКД, там видно, как твой запрос преобразуется после компоновки макета, т.е. твой запрос + настройки пользователя, т.е. запрос + все параметры, передаваемые в СКД. Посмотрев, можно выявить причины расхождения.
20 1976vas
 
12.05.15
19:20
(19) + СКД изменяет постановку запроса, по сравнению с обычным запросом, он умеет оптимизировать, но иногда не в нашу пользу, поэтому надо знать особенности или просто сравнивая запросы исходные и преобразованные СКД, делать выводы.
21 QuestNew
 
13.05.15
10:58
Уважаемые, прошу помощи.

Правлю запрос для СКД. Получаю финальную таблицу с Х измерениями, У показателями, на которую СКД накладывает пользовательские фильтры.

Пусть в множестве измерений помимо прочих есть измерения "номенклатура" и "склад".
Необходимо получить отчетную форму по всем возможным значениям измерения "номенклатура" (по всему списку).
Рассмотрим случай, когда накладывается один фильтр на одно измерение - "склад" (при этом условием может быть не только равенство значению).

Изначально в финальной таблице есть записи только по "номенклатуре" с остатками.
Если я делаю новую таблицу - левое соединение остатков к справочнику "номенклатуры", получаю таблицу со всеми элементами "номенклатуры", но фильтр по "складу" обрезает "пустые" (без остатков) строки.

Т.е. мне нужно получить новую таблицу, в которой бы к имеющейся результирующей таблице добавились бы строки с нулевыми значениями ресурсов из множества У, но при этом были бы учтены все имеющиеся комбинации остальных измерений из множества ресурсов Х.

Не соображу, как это сделать.
22 MUXACb
 
13.05.15
13:33
(21) я в (4) написал.
1. Сделай 2 набора данных
2. В первом Номенклатура Левое соединение Склады - вся номенклатура по всем складам
3. Во втором остатки
4. Соединяй наборы (первый <- второй) по номенклатуре и складу
При необходимости отключи "Автозаполнение"
23 QuestNew
 
13.05.15
16:26
(22) Спасибо! Буду пробовать
24 QuestNew
 
15.05.15
11:12
(22) Почти получилось!
Последняя проблема - при наложении фильтра на измерение с типом "Не заполнено", тогда "номенклатура" все равно не попадает в отчет.
Дополнительное соединение со значением Справочник.ХХХ.ПустаяСсылка не помогает ((
25 QuestNew
 
15.05.15
11:16
(24) Проверил вариант с присоединением Null, тоже счастья не получил.
26 QuestNew
 
15.05.15
11:24
(24) Неопределено тоже не помогает.

Уважаемые, прошу помощи.
27 echo77
 
15.05.15
11:33
(25) Схему свою покажи.
При включенной галке Автозаполнение СКД добавляет поля Условий из измерений ВТ.
Если у тебя запрос простой и ты вручную не прописываешь в СКД, что необходимо наложить отбор на поле Склад - все должно работать.
28 QuestNew
 
15.05.15
11:43
(27) Как принято показывать схему? Выгрузить в xml, скрин, текст запроса?
29 echo77
 
15.05.15
11:43
(28) выложить на файловый ресурс XML-схему
30 QuestNew
 
15.05.15
11:45
(29) Если схема к отчету под доработку (отраслевое решение) - будет толк? Или без конфы схема окажется бесполезной?
31 echo77
 
15.05.15
11:47
(30) Схему покажи сначала, потом посмотрим
32 QuestNew
 
15.05.15
11:51
33 echo77
 
15.05.15
11:56
Вот это что такое?
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВЫБОР
        КОГДА &Периодичность = 6
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d)
        КОГДА &Периодичность = 7
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПериода, НЕДЕЛЯ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d)
        КОГДА &Периодичность = 8
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕКАДА, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d)
        КОГДА &Периодичность = 9
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПериода, МЕСЯЦ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d)
        КОГДА &Периодичность = 10
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПериода, КВАРТАЛ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d)
        КОГДА &Периодичность = 11
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПериода, ПОЛУГОДИЕ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d)
        КОГДА &Периодичность = 12
            ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПериода, ГОД, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d)
        ИНАЧЕ НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
    КОНЕЦ КАК Период
ПОМЕСТИТЬ ВтДень
ИЗ
    (ВЫБРАТЬ
        0 КАК a
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        1
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        2
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        3
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        4
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        5
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        6
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        7
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        8
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        9) КАК aa
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК b
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            1
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            9) КАК bb
        ПО (ИСТИНА)
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК c
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            1
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            9) КАК cc
        ПО (ИСТИНА)
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК d
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            1
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            9) КАК dd
        ПО (ИСТИНА)
ГДЕ
    ВЫБОР
            КОГДА &Периодичность = 6
                ТОГДА aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
            КОГДА &Периодичность = 7
                ТОГДА aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) / 7
            КОГДА &Периодичность = 8
                ТОГДА aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) / 10
            КОГДА &Периодичность = 9
                ТОГДА aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ)
            КОГДА &Периодичность = 10
                ТОГДА aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) / 3
            КОГДА &Периодичность = 11
                ТОГДА aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) / 6
            КОГДА &Периодичность = 12
                ТОГДА aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ГОД)
            ИНАЧЕ aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
        КОНЕЦ
;
34 QuestNew
 
15.05.15
11:58
Я дорабатываю отчет франча, за все не расскажу.
Мои изменения в запрос - ВТ "МнВоАналитик" и запросы 3,4 в итоговом запросе 8.
35 QuestNew
 
15.05.15
11:58
(33) Предполагаю, что так реализована группировка по периодам.
36 QuestNew
 
21.05.15
11:13
В итоге получилось, помогло выделение параметра для фильтра в закладке компоновки промежуточного отчета.
Всем спасибо за помощь.
2 + 2 = 3.9999999999999999999999999999999...