Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Отбор в Построителе Отчета и левое соединение

Отбор в Построителе Отчета и левое соединение
Я
   МастерВопросов
 
26.12.12 - 15:22
Подскажите, пожалуйста, как сделать отбор средствами ПостроителяОтчета по полю СкладПродаж.
СкладПродаж - это Склад либо в регистраторе ОтчетОРозничныхПродажах, либо в регистраторе ОтчетОРозничныхПродажах.


ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.ХарактеристикаНоменклатуры,
    Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / Продажи.Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК ПроданоВСЕГО
ИЗ
    РегистрНакопления.Продажи КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО Продажи.Регистратор = РеализацияТоваровУслуг.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
        ПО Продажи.Регистратор = ОтчетОРозничныхПродажах.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
        ПО Продажи.Регистратор = ВозвратТоваровОтПокупателя.Ссылка
ГДЕ
    Продажи.Период >= &ДатаНачПродаж
    И Продажи.Период <= &ДатаКонПродаж
    И Продажи.ЗаказПокупателя = НЕОПРЕДЕЛЕНО
    И ВозвратТоваровОтПокупателя.Ссылка ЕСТЬ NULL 
{ГДЕ
    Продажи.Номенклатура.* КАК Номенклатура,
    РеализацияТоваровУслуг.Склад КАК СкладПродаж,
    ОтчетОРозничныхПродажах.Склад КАК СкладПродаж}
 
 
   МастерВопросов
 
1 - 26.12.12 - 15:22
Подскажите, пожалуйста, как сделать отбор средствами ПостроителяОтчета по полю СкладПродаж.
СкладПродаж - это Склад либо в регистраторе РеализацияТоваровУслуг, либо в регистраторе ОтчетОРозничныхПродажах.
   kumena
 
2 - 26.12.12 - 15:27
предположу что через "Выбор Когда ...
   kabanoff
 
3 - 26.12.12 - 15:39
Уродский запрос, ну да ладно.

Программный отбор можно сделать так:
ЭлементОтбора = Построитель.Отбор.Добавить("СкладПродаж");
        ЭлементОтбора.ВидСравнения    = ВидСравнения.Равно;
        ЭлементОтбора.Значение        = ЗначениеРеквизита;
        ЭлементОтбора.Использование    = Истина;

   kumena
 
4 - 26.12.12 - 15:45
(3) наверное чтобы использовать поле "СкладПродаж", нужно сначала его выбрать, а в исходном запросе его нет.
   kabanoff
 
5 - 26.12.12 - 15:54
(4) Не обязательно. В отборе поле есть.
   МастерВопросов
 
6 - 26.12.12 - 16:12
(3) я не спрашивал как мне програмно добавить отбор, это я и сам знаю. Мне нужно сформулировать условие в запросе по полю "СкладПродаж". То, что я привел в (0) не рабочее.
   Axel2009
 
7 - 26.12.12 - 16:15
{ГДЕ
    Продажи.Номенклатура.* КАК Номенклатура,
    ЕСТЬNULL(РеализацияТоваровУслуг.Склад, ОтчетОРозничныхПродажах.Склад) КАК СкладПродаж}
   МастерВопросов
 
8 - 26.12.12 - 16:21
(3) " Уродский запрос, ну да ладно."
===============================

Если подскажите как по Складу отфильтровать данные в регистре Продажи, буду благодарен. Нужны данные именно из этого регистра. В (0) только маленький фрагмент.

//Естественно измерения "Склад" в нем нет.
   МастерВопросов
 
9 - 26.12.12 - 16:22
(7) спасибо.
Завтра попробую, думаю то что надо.
   kabanoff
 
10 - 26.12.12 - 16:36
(8) {ГДЕ (ВЫБОР 
КОГДА Регистратор ССЫЛКА Документ.РеализацияТоваровИУслуг 
ТОГДА ВЫРАЗИТЬ(Регистратор КАК Документ.РеализацияТоваровИУслуг).Склад
КОГДА ...
ТОГДА ...
КОНЕЦ).* КАК СкладПродаж}

Уродский он из-за связей с таблицами документов, которые по сути не нужны, а также из-за использования таблицы движений регистра вместо виртуальной таблицы оборотов.
И условие "И ВозвратТоваровОтПокупателя.Ссылка ЕСТЬ NULL" превращает левое соединение во внутреннее.
 
 Рекламное место пустует
   Axel2009
 
11 - 26.12.12 - 16:38
(10) "И условие "И ВозвратТоваровОтПокупателя.Ссылка ЕСТЬ NULL" превращает левое соединение во внутреннее."
посмеялсо
   kabanoff
 
12 - 26.12.12 - 16:39
(11) Где смеяться? не понял.
   Axel2009
 
13 - 26.12.12 - 16:39
(0)
кстати да
ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.ХарактеристикаНоменклатуры,
    Продажи.Количество * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / Продажи.Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК ПроданоВСЕГО
ИЗ
    РегистрНакопления.Продажи КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО Продажи.Регистратор = РеализацияТоваровУслуг.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
        ПО Продажи.Регистратор = ОтчетОРозничныхПродажах.Ссылка
ГДЕ
    Продажи.Период >= &ДатаНачПродаж
    И Продажи.Период <= &ДатаКонПродаж
    И Продажи.ЗаказПокупателя = НЕОПРЕДЕЛЕНО
   И НЕ Продажи.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
   Axel2009
 
14 - 26.12.12 - 16:40
(12) про с левого на внутренний.
   kabanoff
 
15 - 26.12.12 - 16:44
(14) Ну а как его еще назвать? Не левое однозначно.
   Axel2009
 
16 - 26.12.12 - 16:45
(15) а как выбирают такие записи из одной таблицы, которых нет в другой???
   kabanoff
 
17 - 26.12.12 - 16:46
(16) Именно так и выбирают. Мы же говорим про название данного типа соединения. Как его назвать?
   Axel2009
 
18 - 26.12.12 - 16:47
(17) внутреннее соединение это какое?
оно левым и остается.
   МастерВопросов
 
19 - 26.12.12 - 16:48
(10) "Уродский он из-за связей с таблицами документов, которые по сути не нужны"
============================
я подумал что при неявном соединении регистр будет искать поле "Склад" во всех таблицах документов, которые есть в составном типе регистратора. Поэтому написал явное и только с тремя таблицами.


" а также из-за использования таблицы движений регистра вместо виртуальной таблицы оборотов."
=========================

Во первых виртуальная таблица это тот же подзапрос, а я делаю все за один проход. Во вторых и в главных - каким параметром виртульной таблицы задать условие на Склад?
   toypaul
 
20 - 26.12.12 - 16:49
если СкладПродаж есть только в этих документах, то можно попробовать {ГДЕ Регистратор.СкладПродаж}
   Axel2009
 
21 - 26.12.12 - 16:50
(19) правильно все сделал. именно так и надо писать, чтобы другие после тебя все поняли
   kabanoff
 
22 - 26.12.12 - 16:50
(18) Я имею ввиду, что это внутреннее соединение первой таблицы по отношению к пустому множеству второй таблицы. Это уже не левое соединение. Что не так?
   toypaul
 
23 - 26.12.12 - 16:50
(19) все правильно сделал.
   МастерВопросов
 
24 - 26.12.12 - 16:52
(20) нет, Склад есть в том же "ВозвратОтПокупателя" и в других доках тоже.
   Axel2009
 
25 - 26.12.12 - 16:54
(24) если надо только 2 таблицы учесть, добавь отбор на эти 2 вида регистратора..
   kabanoff
 
26 - 26.12.12 - 16:54
(21) "Во первых виртуальная таблица это тот же подзапрос, а я делаю все за один проход"
Глупость. Для чего они (виртуальные таблицы) по твоему мнению тогда нужны?

"Во вторых и в главных - каким параметром виртульной таблицы задать условие на Склад"
Если его нет в измерениях регистра, то никаким. Но это не повод не использовать виртуальные таблицы.
   Axel2009
 
27 - 26.12.12 - 16:55
(22) сколько на форумах читаю про эти соединения и не только в 1с, но такой извращенной мысли не видел.. можешь называть это так
   kabanoff
 
28 - 26.12.12 - 16:55
(20) Так делать нельзя. Разыменование полей составного типа приводит к увеличению соединений в запросе.
   kabanoff
 
29 - 26.12.12 - 16:56
(27) Называй как хочешь, я не против.
   Axel2009
 
30 - 26.12.12 - 16:56
(26)
1. для того, чтобы по регистратору не читать ниче. как бы в виртуальной таблице все свернуто. а если идет периодичность регистратор, то запросы идут в любом случае к основной таблице.
2. вполне себе повод. и причем очень даже правильный
   kabanoff
 
31 - 26.12.12 - 16:58
(30) А как насчет других отборов, например, по номенклатуре? Тоже не повод?
   Axel2009
 
32 - 26.12.12 - 16:58
(29) ты главное на форумах так не говори, а то не поймут сразу то. придется объяснять. либо сразу вот это все и пиши.
   Axel2009
 
33 - 26.12.12 - 16:58
(31) естественно.
 
 
   kabanoff
 
34 - 26.12.12 - 17:05
(33) Т.е. ты считаешь, что использовать таблицу движений РН в случае, если нужна периодичность по регистратору, будет правильно, нежели использовать виртуальную таблицу оборотов?
   Axel2009
 
35 - 26.12.12 - 17:12
(31) открою махонький секрет. в виртуальной таблице итогов нет поля регистратор. да и поле Период там периодичен месяцу. поэтому если ты собираешь данные за 1 день, то может выгоднее взять данные с таблицы движений, чем с виртуальной таблицы.
   kabanoff
 
36 - 26.12.12 - 17:22
(35) Не хочу тебя расстраивать, но это не секрет.
А если пользователь укажет другой период? Да и с чего ты взял, что компоновщику запроса выгоднее, а что нет?
Сделай отбор по таблице движений, это будет быстрее?
   Axel2009
 
37 - 26.12.12 - 17:25
(36)
1. пусть указывает. пользуй обороты, только с периодичностью регистратор все равно к таблице итогов не будет обращений
2. я беру то, что 1с отправляет на скуль сервер.
3. в каком случае? если нужен регистратор или если он не нужен?


Список тем форума
Рекламное место пустует  Рекламное место пустует
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует