Имя: Пароль:
1C
 
Помогите с запросом
0 SuperMario
 
08.05.09
11:00
ВЫБРАТЬ
   ЗаказПоставщику.Ссылка,
   ЗаказПоставщику.ДатаПоступления,
   ЗаказПоставщику.ДатаОплаты,
   ПлатежноеПоручениеИсходящее.Ссылка КАК Ссылка1,
   ПлатежноеПоручениеИсходящее.Контрагент.Ссылка,
   ПлатежноеПоручениеИсходящее.Контрагент.ОсновнойБанковскийСчет.Ссылка,
   ПлатежноеПоручениеИсходящее.Контрагент.ИНН,
   ПлатежноеПоручениеИсходящее.СуммаДокумента,
   ПлатежноеПоручениеИсходящее.Комментарий,
   ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.СтатьяДвиженияДенежныхСредств,
   ПлатежноеПоручениеИсходящее.Подразделение.Ссылка
ИЗ
   Документ.ПлатежноеПоручениеИсходящее.РасшифровкаПлатежа КАК ПлатежноеПоручениеИсходящееРасшифровкаПлатежа
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПлатежноеПоручениеИсходящее КАК ПлатежноеПоручениеИсходящее
           ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ЗаказПоставщику
           ПО ПлатежноеПоручениеИсходящее.ДокументОснование.ДокументОснование.Ссылка = ЗаказПоставщику.Ссылка
       ПО ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка = ПлатежноеПоручениеИсходящее.Ссылка
ГДЕ
   ЗаказПоставщику.Дата МЕЖДУ &Дата1 И &Дата2


вместо ПОЛНОЕ СОЕДИНЕНИЕ получается ВНУТРЕННЕЕ
Т.е. не достает заказы постащику у котовых нет ПлатежноеПоручениеИсходящее

Если построить запрос так:
ВЫБРАТЬ
   ЗаказПоставщику.Ссылка,
   ЗаказПоставщику.ДатаПоступления,
   ЗаказПоставщику.ДатаОплаты,
   ПлатежноеПоручениеИсходящее.Ссылка КАК Ссылка1,
   ПлатежноеПоручениеИсходящее.Контрагент.Ссылка,
   ПлатежноеПоручениеИсходящее.Контрагент.ОсновнойБанковскийСчет.Ссылка,
   ПлатежноеПоручениеИсходящее.Контрагент.ИНН,
   ПлатежноеПоручениеИсходящее.СуммаДокумента,
   ПлатежноеПоручениеИсходящее.Комментарий,
   ПлатежноеПоручениеИсходящее.Подразделение.Ссылка
ИЗ
   Документ.ПлатежноеПоручениеИсходящее.РасшифровкаПлатежа КАК ПлатежноеПоручениеИсходящееРасшифровкаПлатежа
           ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ЗаказПоставщику
           ПО ПлатежноеПоручениеИсходящее.ДокументОснование.ДокументОснование.Ссылка = ЗаказПоставщику.Ссылка
ГДЕ
   ЗаказПоставщику.Дата МЕЖДУ &Дата1 И &Дата2



то все работает, но нет данных по статье движения ДС (это таб. часть в платежке).
1 azernot
 
08.05.09
11:07
Кури вот это условие
ПО ПлатежноеПоручениеИсходящее.ДокументОснование.ДокументОснование.Ссылка = ЗаказПоставщику.Ссылка

И нахрена тебе полное соединение, если тебе в первую очередь нужны заказы? Юзай правое соединение.
2 Лирик
 
08.05.09
11:14
ВЫБРАТЬ
   ЗаказПоставщику.Ссылка,
   ЗаказПоставщику.ДатаПоступления,
   ЗаказПоставщику.ДатаОплаты,
   ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка КАК Ссылка1,
   ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка.Контрагент,
   ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка.Контрагент.ОсновнойБанковскийСчет,
   ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка.Контрагент.ИНН,
   ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка.СуммаДокумента,
   ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка.Комментарий,
   ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.СтатьяДвиженияДенежныхСредств,
   ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка.Подразделение
ИЗ
   Документ.ПлатежноеПоручениеИсходящее.РасшифровкаПлатежа КАК ПлатежноеПоручениеИсходящееРасшифровкаПлатежа
       ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ЗаказПоставщику
       ПО ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка.ДокументОснование = ЗаказПоставщику.Ссылка
ГДЕ
   ЗаказПоставщику.Дата МЕЖДУ &Дата1 И &Дата2

Таблица ПлатежноеПоручениеИсходящее лишняя, проверь условия соединения
3 SuperMario
 
08.05.09
11:15
(1) изначально предполагалось, что нужно все доки у которых не проходит  
ПлатежноеПоручениеИсходящее.ДокументОснование.ДокументОснование.Ссылка = ЗаказПоставщику.Ссылка  
+
те, у кторых условие соблюдается (т.е ПОЛНОЕ).

Потом переиграли задачу, но это не суть.
4 SuperMario
 
08.05.09
11:21
azernot спасиб! Прокурил соединение, арбайтен.
Лирик спасиб за варинт. Моно и так, но привык через соединение.



Кстать вопрос. Видел вариант как (2). Но сам пользую левое соединение шапки с табл. частью. Как правильнее?
5 Лирик
 
08.05.09
11:44
Соединение на порядок медленнее (по крайней мере так учили)
6 73
 
08.05.09
11:49
(4)(5)
ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка.Контрагент - неявное соединение с шапкой.
ПлатежноеПоручениеИсходящееРасшифровкаПлатежа.Ссылка.Контрагент.ИНН - еще одно со справочником Контрагентов.

Чудес не бывает. Как же без соединений данные из других таблиц достать?

Вариант без шапки (2) - лучше читается, запутаться сложнее.
7 hhhh
 
08.05.09
11:52
(4) в варианте (2) не попадают документы с пустой табличной частью. Например, если нужно подсчитать количество строк в документах, тогда вариант с соединением
8 Ненавижу 1С
 
гуру
08.05.09
11:53
(5) через точку это тоже ЛЕВОЕ соединение
9 Лирик
 
08.05.09
12:04
ВЫБРАТЬ
   РеализацияТоваровУслугТовары.НомерСтроки,
   РеализацияТоваровУслуг.Номер
ИЗ
   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
       ПО (РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка)

- Время выполнения 2.830

ВЫБРАТЬ
   РеализацияТоваровУслугТовары.НомерСтроки,
   РеализацияТоваровУслугТовары.Ссылка.Номер
ИЗ
   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

- Время выполнения 0.18

Что я не правильно делаю? :)
10 73
 
08.05.09
12:07
(9) Все правильно.
Тлько я думаю, что во втором случае все же не Левое а Внутреннее.
11 Ненавижу 1С
 
гуру
08.05.09
12:08
(10) кстати возможно, тогда я прав в v8: ЛЕВОЕ и ВНУТРЕННЕЕ СОЕДИНЕНИЕ
12 Aprobator
 
08.05.09
12:11
(11) может быть. Надо тестить, а не гадать в таких случаях.
13 Ненавижу 1С
 
гуру
08.05.09
12:12
(9) версия какая SQL или файловая?
14 Лирик
 
08.05.09
12:12
Файловая
15 73
 
08.05.09
12:12
Сравнивать со вторым запросом из (9) корректнее такой запрос

ВЫБРАТЬ
   РеализацияТоваровУслугТовары.НомерСтроки,
   РеализацияТоваровУслуг.Номер
ИЗ
   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
       ПРАВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары //ВНУТРЕННЕЕ
       ПО (РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка)
16 Ненавижу 1С
 
гуру
08.05.09
12:15
(14) ну файловая неинтересно, там 1С сама распоряжается ))
17 Лирик
 
08.05.09
12:21
(16) Будет время попробую.
(15) Возможно. Кстати если твой запрос загнать в конструктор - последний сделает из него как в (9).
18 Ненавижу 1С
 
гуру
08.05.09
12:23
(17) нет, там важно в какую сторону соединение
19 73
 
08.05.09
12:23
(17) Нет. Правое на Левое заменит, но! он таблицы местами поменяет.
20 Лирик
 
08.05.09
12:27
Я так понимаю, что соединять нужно большую таблицу с меньшей (для быстродействия)?
21 IOL
 
08.05.09
12:30
>вместо ПОЛНОЕ СОЕДИНЕНИЕ получается ВНУТРЕННЕЕ


может не в тему, но база под чем крутиться, просто под ПГ были какието ограничения,
22 73
 
08.05.09
12:31
(20) Я думаю, соединять надо по поставленной задаче.
Первый запрос в (9) вернет все доки, даже с пустыми ТЧ.
Второй - только с непустыми ТЧ.

Поэтому они разные.
23 Ненавижу 1С
 
гуру
08.05.09
12:34
Результаты:

ЛЕВОЕ       = 0,010552
ВНУТРЕННЕЕ  = 0,009402
через точку = 0,009148

данных маловато, тока начали работать в 8.1

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    РеализацияТоваровУслугТовары.НомерСтроки,
                  |    РеализацияТоваровУслуг.Номер
                  |ИЗ
                  |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                  |        ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
                  |ГДЕ
                  |    РеализацияТоваровУслуг.Дата = &Дата";
   Запрос.УстановитьПараметр("Дата",НачалоМесяца(ТекущаяДата()));
   РезультатЗапроса = Запрос.Выполнить();
   
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    РеализацияТоваровУслугТовары.НомерСтроки,
                  |    РеализацияТоваровУслуг.Номер
                  |ИЗ
                  |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                  |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                  |        ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
                  |ГДЕ
                  |    РеализацияТоваровУслуг.Дата = &Дата";
   Запрос.УстановитьПараметр("Дата",НачалоМесяца(ТекущаяДата()));
   РезультатЗапроса = Запрос.Выполнить();
       
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    РеализацияТоваровУслугТовары.НомерСтроки,
                  |    РеализацияТоваровУслугТовары.Ссылка.Номер
                  |ИЗ
                  |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                  |ГДЕ
                  |    РеализацияТоваровУслугТовары.Ссылка.Дата = &Дата";
   Запрос.УстановитьПараметр("Дата",НачалоМесяца(ТекущаяДата()));
   РезультатЗапроса = Запрос.Выполнить();
   
КонецПроцедуры
24 73
 
08.05.09
13:04
Результаты (23) без ограничения по дате:

Тип Док1 - однократно:
РезультатЗапросаТочка = Запрос.Выполнить();    1    2,206696    35,46
РезультатЗапросаВнутр = Запрос.Выполнить();    1    2,146396    34,49
РезультатЗапросаЛевое = Запрос.Выполнить();    1    1,868299    30,02    
   
Тип Док1 - 5-кратно:
РезультатЗапросаТочка = Запрос.Выполнить();    5    9,504820    33,62
РезультатЗапросаЛевое = Запрос.Выполнить();    5    9,422038    33,33
РезультатЗапросаВнутр = Запрос.Выполнить();    5    9,335256    33,03    
   
   
Тип Док2 - однократно:
РезультатЗапросаЛевое = Запрос.Выполнить();    1    1,136862    33,58
РезультатЗапросаТочка = Запрос.Выполнить();    1    1,124520    33,21
РезультатЗапросаВнутр = Запрос.Выполнить();    1    1,121538    33,12
   
Тип Док2 - 5-кратно:
РезультатЗапросаЛевое = Запрос.Выполнить();    5    5,815986    33,95
РезультатЗапросаВнутр = Запрос.Выполнить();    5    5,711888    33,34
РезультатЗапросаТочка = Запрос.Выполнить();    5    5,601147    32,70

Данных достаточно.
Так что примерно один хр.
Зависит, как я думаю, от конкретных данных и SQL.
25 SuperMario
 
08.05.09
13:09
(22) отличия есть, согласен.
Но 1С овцы,блин, отжигают.
Например счет фактура выданный. Табл. часть по опренделению не будет пустая.
Даже если накладные не списком, то запись в ТЧ будет.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший