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


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

Программный отбор можно сделать так:

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

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

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

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


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

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

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