Имя: Пароль:
1C
1С v8
Подскажите по пакетному запросу
0 palpetrovich
 
19.07.12
15:50
такой вот код:

   СписокКонтрагентов = Новый СписокЗначений;
   Для Каждого ЭлементОформления Из ОформленияСтрок Цикл
       СписокКонтрагентов.Добавить(ЭлементОформления.ДанныеСтроки.Ссылка);
   КонецЦикла;    
   Запрос = Новый Запрос("
   |ВЫБРАТЬ
   |    КонтактнаяИнформация.Объект
   |ПОМЕСТИТЬ СписКонтрагентов
   |ИЗ
   |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
   |ГДЕ
   |    КонтактнаяИнформация.Объект В ИЕРАРХИИ (&СписокКонтрагентов)
   |;
   |ВЫБРАТЬ
   |    Выразить(КонтактнаяИнформация.Представление КАК Строка(100)) КАК Адрес,
   |    КонтактнаяИнформация.Объект
   |ПОМЕСТИТЬ ТабАдресов
   |ИЗ
   |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
   |ГДЕ
   |    КонтактнаяИнформация.Вид = &Адрес
   |    И КонтактнаяИнформация.Объект В    (ВЫБРАТЬ СписКонтрагентов.Объект
   |                                    ИЗ СписКонтрагентов КАК СписКонтрагентов)
   |;
   |ВЫБРАТЬ
   |    Выразить(КонтактнаяИнформация.Представление КАК Строка(100)) КАК Телефон,
   |    КонтактнаяИнформация.Объект
   |ПОМЕСТИТЬ ТабТелефонов
   |ИЗ
   |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
   |ГДЕ
   |    КонтактнаяИнформация.Вид = &Телефон
   |    И КонтактнаяИнформация.Объект В    (ВЫБРАТЬ СписКонтрагентов.Объект
   |                                    ИЗ    СписКонтрагентов КАК СписКонтрагентов)
   |;
   |ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    ТабАдресов.Объект,
   |    ТабАдресов.Адрес,
   |    ТабТелефонов.Телефон
   |ИЗ
   |    СписКонтрагентов КАК СписКонтрагентов,
   |    ТабАдресов КАК ТабАдресов
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТабТелефонов КАК ТабТелефонов
   |        ПО ТабАдресов.Объект = ТабТелефонов.Объект    
   |");
   Запрос.УстановитьПараметр("СписокКонтрагентов", СписокКонтрагентов);
   Запрос.УстановитьПараметр("Телефон", Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента);
   Запрос.УстановитьПараметр("Адрес", Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);

Получаю плоскую табличку, собственно то что и хочу, но мучает вопрос, а нельзя-ли подЗапросы по Адресу и по Телефону сделать в одном? Вернее сделать-то можно, но у меня при этом табличка "рассламвается", телефон и Адрес получаются в разных строках
1 H A D G E H O G s
 
19.07.12
15:51
Можно
2 H A D G E H O G s
 
19.07.12
15:51
Немного извращенной фантазии
3 palpetrovich
 
19.07.12
15:53
(2) я пробовал конструкцию КОГДА, получил не то ...можно маленько указать куда фантазировать?
4 H A D G E H O G s
 
19.07.12
15:54
ВЫБРАТЬ
   ЗначенияСвойствОбъектов.Объект КАК Номенклатура,
   МАКСИМУМ(ВЫБОР
           КОГДА ЗначенияСвойствОбъектов.Свойство = &Емкость
               ТОГДА ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Значение КАК ЧИСЛО(9, 3))
           ИНАЧЕ NULL
       КОНЕЦ) КАК Емкость,
   МАКСИМУМ(ВЫБОР
           КОГДА ЗначенияСвойствОбъектов.Свойство = &Вес
               ТОГДА ЗначенияСвойствОбъектов.Значение
           ИНАЧЕ NULL
       КОНЕЦ) КАК Вес,
   МАКСИМУМ(ВЫБОР
           КОГДА ЗначенияСвойствОбъектов.Свойство = &Цвет
               ТОГДА ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Значение КАК Справочник.Контрагенты)
           ИНАЧЕ NULL
       КОНЕЦ) КАК Цвет
ПОМЕСТИТЬ ПараметрыНоменклатуры
ИЗ
   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
   ЗначенияСвойствОбъектов.Свойство В (&Емкость, &Вес, &Цвет)

СГРУППИРОВАТЬ ПО
   ЗначенияСвойствОбъектов.Объект
5 palpetrovich
 
19.07.12
15:54
кста, если соединить  Адресу и Телефон - быстрее работать будет?
6 H A D G E H O G s
 
19.07.12
15:55
(5) Быстрее. Но не критично. Мне (4) нравиться больше.
7 H A D G E H O G s
 
19.07.12
15:56
Цвет и
ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Значение КАК Справочник.Контрагенты)

не обращайте внимания, это переделывалось на скорую руку.
8 palpetrovich
 
19.07.12
16:00
(7) я понял, дело в МАКСИМУМ
а как быть если у меня еще КонтактнаяИнформация.Объект?
проверять Адрес и Телефон и если оба пустые тогда тоже NULL?
9 palpetrovich
 
19.07.12
16:00
+8 в смысле
ВЫБРАТЬ
   МАКСИМУМ(ВЫБОР
       КОГДА КонтактнаяИнформация.Вид = &Адрес
           ТОГДА ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(100))
            ИНАЧЕ NULL
   КОНЕЦ) КАК Адрес,
   МАКСИМУМ(ВЫБОР
       КОГДА КонтактнаяИнформация.Вид = &Телефон
           ТОГДА ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(100))
            ИНАЧЕ NULL
   КОНЕЦ) КАК Телефон,
   КонтактнаяИнформация.Объект
ПОМЕСТИТЬ ТабАдресовИтелефонов
10 H A D G E H O G s
 
19.07.12
16:02
СГРУППИРОВАТЬ ПО
   КонтактнаяИнформация.Объект
11 H A D G E H O G s
 
19.07.12
16:03
Один в один у меня - твой запрос.
12 acsent
 
19.07.12
16:04
праильно делать левое соединение по объету типу и виду без доп временных таблиц ибо только тогда в индекс попадается.
а за код как в (4) вообще нужно руки отрубать
13 Kashemir
 
19.07.12
16:05
Так а где тут пакетные запросы ?
14 H A D G E H O G s
 
19.07.12
16:07
(12) Расскажи мне, за что тут руки отрубать.
15 acsent
 
19.07.12
16:08
(14) ибо ты вообще не думаешь о производительности запросов, только о корректной выборке
16 Aprobator
 
19.07.12
16:09
(13) уже все в пакетах )))
17 palpetrovich
 
19.07.12
16:09
(11) да, я недосмотрел ЗначенияСвойствОбъектов.Объект КАК Номенклатура,
(12) ?
(13) в (0) не?
18 H A D G E H O G s
 
19.07.12
16:10
(15) Ну что там с производительностью?
19 acsent
 
19.07.12
16:11
(18) ты вообще понимаешь выражение "попасть в индекс"?
20 H A D G E H O G s
 
19.07.12
16:12
(19) Ты мне "мясо" давай.
21 H A D G E H O G s
 
19.07.12
16:13
(19) Расскажи, как бы сделал ты.
22 acsent
 
19.07.12
16:14
ВЫБРАТЬ
   КИ_Телефон.Представление,
   КИ_Адрес.Представление КАК Представление1,
   Контрагенты.Ссылка
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КИ_Телефон
       ПО (КИ_Телефон.Объект = Контрагенты.Ссылка)
           И (КИ_Телефон.Тип = &Т1)
           И (КИ_Телефон.Вид = &В1)
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КИ_Адрес
       ПО (КИ_Адрес.Объект = Контрагенты.Ссылка)
           И (КИ_Адрес.Тип = &Т2)
           И (КИ_Адрес.Вид = &В2)

Причем обязательно соединяться по полю ТИП так как он первый в индексе
23 palpetrovich
 
19.07.12
16:16
(22) а как-же http://chistov.spb.ru/publ/5-1-0-13 ?
24 acsent
 
19.07.12
16:16
(19) собственно ты не один такой, большинство ванцырей не понимают про "попадания в индекс"
25 acsent
 
19.07.12
16:17
(23) это он так учит как в (0)? ППЦ
26 Широкий
 
19.07.12
16:19
(22) ИМХАЕТсся мне , что раз пошло дело про оптимизацию
то тут
ВЫБРАТЬ
   КИ_Телефон.Представление,
   КИ_Адрес.Представление КАК Представление1,

надо бы типы ограничить
27 palpetrovich
 
19.07.12
16:20
(25) ну я так понял, на истину не претендую. А что в (0) не так? ...результат есть
28 H A D G E H O G s
 
19.07.12
16:22
(22) Все же применительно к моему запросу по свойствам

ЗначенияСвойствОбъектов.Свойство В (&Емкость, &Вес, &Цвет)

не будет индекс использовать?
29 H A D G E H O G s
 
19.07.12
16:23
(22) А твой код на небольшой табличке 2 раза TableScan сделает скорее всего.
30 H A D G E H O G s
 
19.07.12
16:23
Хотя че я гадаю, счаст глянем.
31 acsent
 
19.07.12
16:23
(28) у тебя поле свойство индексировано? НЕТ
32 acsent
 
19.07.12
16:24
ты "убиваешь" даже индекс по объекту, т.к. делаешь временную таблицу
33 H A D G E H O G s
 
19.07.12
16:24
(31) Нет. Так что мне на попадание в Индекс плевать.
34 H A D G E H O G s
 
19.07.12
16:26
(32) Лучше "убить" индекс и сделать его снова во временной, чем городить адскую кашу потом, в которой захлебнется оптимизатор.
35 acsent
 
19.07.12
16:26
(27) читай (15)
36 H A D G E H O G s
 
19.07.12
16:26
(34) И последующий программист.
37 acsent
 
19.07.12
16:26
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КИ_Адрес
       ПО (КИ_Адрес.Объект = Контрагенты.Ссылка)
           И (КИ_Адрес.Тип = &Т2)
           И (КИ_Адрес.Вид = &В2)

Это адская каша? вот у тебя адская каша и максимум и группировка
38 acsent
 
19.07.12
16:27
Какой код легче читать? в (0) или (22)?
39 H A D G E H O G s
 
19.07.12
16:28
и максимум и группировка - ничего с этом страшного нет.
40 acsent
 
19.07.12
16:28
(26) вот эта оптимизация уже от лукавого
41 H A D G E H O G s
 
19.07.12
16:28
(38) читать легче (4)
42 acsent
 
19.07.12
16:29
(39) ты просто никогда с высоконагруженными системами не работал. на  2х человек в файловой конечно никакой разницы нет
43 H A D G E H O G s
 
19.07.12
16:29
(42) Я понял тебя провидец.
44 acsent
 
19.07.12
16:30
Хотя ну строится отчет 5 мин да и ладно, но ведь он может строиться всего 5 сек
45 palpetrovich
 
19.07.12
16:38
(44) а почему Выборка по спраовчнику, почему не по регистру? Если по регистру - мы-ж  сразу отрезаем контрагентов с незаполненной КИ?
46 acsent
 
19.07.12
16:42
(45) а их надо отрезать?
47 palpetrovich
 
19.07.12
16:43
(46) ну да ...собственно это не отчет, это вывод Адреса и телефона в форму списка справочника
48 palpetrovich
 
19.07.12
16:48
+(47)  в общем нижевыложенный код дает ne-же табличку что и в (0), не знаю правда пока, какой быстрее
ВЫБРАТЬ РАЗЛИЧНЫЕ
   Выразить(КИ_Телефон.Представление КАК Строка(100)) КАК КИ_Телефон,
   Выразить(КИ_Адрес.Представление КАК Строка(100)) КАК КИ_Адрес,
   Контрагенты.Объект
ИЗ
   РегистрСведений.КонтактнаяИнформация КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КИ_Телефон
       ПО (КИ_Телефон.Объект = Контрагенты.Объект)
           И (КИ_Телефон.Тип = &Т1)
           И (КИ_Телефон.Вид = &В1)
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КИ_Адрес
       ПО (КИ_Адрес.Объект = Контрагенты.Объект)
           И (КИ_Адрес.Тип = &Т2)
           И (КИ_Адрес.Вид = &В2)
ГДЕ
   Контрагенты.Объект В ИЕРАРХИИ (&Контрагенты)
49 palpetrovich
 
19.07.12
16:52
+(48) на небольшом справочнике, замер показал примерно одинаковые значения для (0) и (48): 0.015..0.016

Всем спасибо!
50 Fragster
 
гуру
19.07.12
16:53
(49) пройдет время, и станет так: http://s006.radikal.ru/i213/1207/b0/688850f4e536.png
51 H A D G E H O G s
 
19.07.12
16:54
(49) На небольшом справочнике индексы не используются.
52 palpetrovich
 
19.07.12
16:57
(50) не понял
(51) запомню :)
53 acsent
 
19.07.12
17:00
(48) зачем различные???
54 palpetrovich
 
19.07.12
17:00
(52) 120 тысяч в смысле?  Не думаю, не тот размах
55 Fragster
 
гуру
19.07.12
17:01
(52).1 я к тому, что базы имеют тенденцию к росту. у меня в базе ~120к контрагентов, в регистре "контактная информация" ~1,5м записей
56 acsent
 
19.07.12
17:02
(55) можешь замер сделать?
57 palpetrovich
 
19.07.12
17:02
(53) без РАЗЛИЧНЫЕ строки повторяются по нескольку раз
58 acsent
 
19.07.12
17:03
(57) не может быть. хначит ты параметры неверно установил
59 acsent
 
19.07.12
17:04
а понял ты справочник опять заменил на регистр. не стоило
60 acsent
 
19.07.12
17:04
лучше писть
НЕ КИ_Адрес.Объект ЕСТЬ NULL
ИЛИ НЕ КИ_Телефон.Объект ЕСТЬ NULL
61 palpetrovich
 
19.07.12
17:06
(60)  вместо Выразить?
62 H A D G E H O G s
 
19.07.12
17:06
ВЫБРАТЬ
   КонтактнаяИнформация.Объект,
   МАКСИМУМ(ВЫБОР
           КОГДА КонтактнаяИнформация.Вид = &Адрес
               ТОГДА ПОДСТРОКА(КонтактнаяИнформация.Представление, 1, 1000)
           ИНАЧЕ NULL
       КОНЕЦ) КАК Адрес,
   МАКСИМУМ(ВЫБОР
           КОГДА КонтактнаяИнформация.Вид = &Телефон
               ТОГДА ПОДСТРОКА(КонтактнаяИнформация.Представление, 1, 1000)
           ИНАЧЕ NULL
       КОНЕЦ) КАК Поле1
ИЗ
   РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
ГДЕ
   КонтактнаяИнформация.Вид В(&Виды)

СГРУППИРОВАТЬ ПО
   КонтактнаяИнформация.Объект

Юзает IndexSeek.
63 H A D G E H O G s
 
19.07.12
17:07
Причем сцуко странно юзает

Когда ему явно скажешь
with (index(_InfoR14844_ByDims20174_RRR))
64 H A D G E H O G s
 
19.07.12
17:07
А так то - TableScan :-)
65 acsent
 
19.07.12
17:08
ВЫБРАТЬ
   КИ_Телефон.Представление,
   КИ_Адрес.Представление КАК Представление1,
   Контрагенты.Ссылка
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КИ_Телефон
       ПО (КИ_Телефон.Объект = Контрагенты.Ссылка)
           И (КИ_Телефон.Тип = &Т1)
           И (КИ_Телефон.Вид = &В1)
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КИ_Адрес
       ПО (КИ_Адрес.Объект = Контрагенты.Ссылка)
           И (КИ_Адрес.Тип = &Т2)
           И (КИ_Адрес.Вид = &В2)
ГДЕ
 НЕ КИ_Адрес.Объект ЕСТЬ NULL
 ИЛИ НЕ КИ_Телефон.Объект ЕСТЬ NULL
66 palpetrovich
 
19.07.12
17:08
(65) я понял уже, спасибо
Основная теорема систематики: Новые системы плодят новые проблемы.