Имя: Пароль:
1C
1С v8
Выгрузить характеристики запросом
0 camojiet
 
19.04.13
10:43
Есть необходимость выгрузить характеристики во Временную таблицу в запросе.
Тоесть есть регистр сведений
Справочник
Параметр
Значение
Необходимо получить таблицу
Справочник Параметр1 Параметр2 Параметр3 и т.д.
Я подсмотрел как СКД вытаскивает характеристики

ВЫБРАТЬ РАЗРЕШЕННЫЕ
   CW_Грузоперевозки.Ссылка КАК Ссылка,
   ЕСТЬNULL(CW_Характеристики.Значение, &ПустаяДата) КАК Дата1,
   ЕСТЬNULL(CW_Характеристики1.Значение, НЕОПРЕДЕЛЕНО) КАК Параметр1
ИЗ
   Справочник.Справочник КАК Справочник
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Характеристики КАК Характеристики
       ПО (Характеристики.Справочник = Справочник.Ссылка)
           И (Характеристики.Параметр = &П_Дата1)
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Характеристики КАК Характеристики1
       ПО (Характеристики1.Справочник = Справочник.Ссылка)
           И (Характеристики.Параметр = &П_Параметр1)

Выяснилось что это в примерно в 5 раз быстрее чем:

ВЫБРАТЬ
   Характеристики.Ссылка
   МАКСИМУМ(ВЫБОР
           КОГДА Характеристики.Параметр = &П_Дата1
               ТОГДА Характеристики.ЗначениеФакт
           ИНАЧЕ НЕОПРЕДЕЛЕНО
       КОНЕЦ) КАК Дата1,
   МАКСИМУМ(ВЫБОР
           КОГДА Характеристики.Параметр = &П_Параметр1
               ТОГДА Характеристики.Значение
           ИНАЧЕ НЕОПРЕДЕЛЕНО
       КОНЕЦ) КАК Параметр1
ИЗ
   Справочник.CW_Грузоперевозки.ПараметрыГрузоперевозки КАК CW_ГрузоперевозкиПараметрыГрузоперевозки
ГДЕ
   CW_ГрузоперевозкиПараметрыГрузоперевозки.Ссылка.ПометкаУдаления = ЛОЖЬ

СГРУППИРОВАТЬ ПО
   CW_ГрузоперевозкиПараметрыГрузоперевозки.Ссылка

Может у кого-нибудь есть рецепт по наиболее быстрому формированию такой таблицы?
Ну или какие-нибудь соображения и поправки?
1 camojiet
 
19.04.13
10:44
Прошу прощения за синтаксические ошибки правил имена объектов чтобы сохранить общность картины и не доделал (недосмотрел). Важна сама суть.
2 camojiet
 
19.04.13
10:51
Так прошу прощения, кажется я нашёл себе почву для раздумий.
3 Wobland
 
19.04.13
10:52
обращайся, всегда рады
4 camojiet
 
19.04.13
11:14
Спасибо =)
Занимаюсь программой уже несколько месяцев и только что обнаружил что данные в программе дублируются в табличной части справочника и в РС. 0_o
Попробовал фокус со сверткой таблицы РС и всё равно левое соединение выигрывает в 2-3 раза по времени

ВЫБРАТЬ
   CW_ХарактеристикиГрузоперевозок.Грузоперевозка,
   МАКСИМУМ(ВЫБОР
           КОГДА CW_ХарактеристикиГрузоперевозок.Параметр = &ВыгруженВПорту
               ТОГДА CW_ХарактеристикиГрузоперевозок.ЗначениеФакт
           ИНАЧЕ НЕОПРЕДЕЛЕНО
       КОНЕЦ) КАК ВыгруженВПорту,
   МАКСИМУМ(ВЫБОР
           КОГДА CW_ХарактеристикиГрузоперевозок.Параметр = &СтанцияОтправления
               ТОГДА CW_ХарактеристикиГрузоперевозок.Значение
           ИНАЧЕ НЕОПРЕДЕЛЕНО
       КОНЕЦ) КАК СтанцияОтправления
ИЗ
   РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок

СГРУППИРОВАТЬ ПО
   CW_ХарактеристикиГрузоперевозок.Грузоперевозка

Можно ли обмануть судьбу?
5 Wobland
 
19.04.13
11:17
>дублируются в табличной части справочника и в РС
не приходила в голову мысль, что на форме справочника показывается тот же самый РС?
6 camojiet
 
19.04.13
11:18
Я пользуюсь консолью запросов когда изучаю структуру программы.
7 Wobland
 
19.04.13
11:19
(6) уболтал, дублируются ;)
8 camojiet
 
22.04.13
03:08
Ни у кого нет каких нибудь альтеративных идей по этому поводу? Я замерю и отпишусь о результатах.
9 camojiet
 
22.04.13
08:14
Появился такой вариант:
ВЫБРАТЬ
   CW_Грузоперевозки.Ссылка,
   Автовывоз.ЗначениеФакт КАК АвтовывозСТерминала,
   АгентОтправитель.Значение КАК АгентОтправитель,
   АгентПоПередаче.Значение КАК АгентПоПередаче,
   ВыгруженВПорту.ЗначениеФакт КАК ВыгруженВПорту,
   Коносамент.Значение КАК Коносамент,
   Отгружен.ЗначениеФакт КАК Отгружен,
   ПереданПорожним.ЗначениеФакт КАК ПереданПорожним,
   СтанцияНазначения.Значение КАК СтанцияНазначения,
   СтанцияОтправления.Значение КАК СтанцияОтправления
ИЗ
   Справочник.CW_Грузоперевозки КАК CW_Грузоперевозки
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
           CW_ХарактеристикиГрузоперевозок.ЗначениеФакт КАК ЗначениеФакт
       ИЗ
           РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
       ГДЕ
           CW_ХарактеристикиГрузоперевозок.Параметр = &АвтовывозСТерминала) КАК Автовывоз
       ПО CW_Грузоперевозки.Ссылка = Автовывоз.Грузоперевозка
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
           CW_ХарактеристикиГрузоперевозок.Значение КАК Значение
       ИЗ
           РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
       ГДЕ
           CW_ХарактеристикиГрузоперевозок.Параметр = &АгентОтправитель) КАК АгентОтправитель
       ПО CW_Грузоперевозки.Ссылка = АгентОтправитель.Грузоперевозка
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
           CW_ХарактеристикиГрузоперевозок.Значение КАК Значение
       ИЗ
           РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
       ГДЕ
           CW_ХарактеристикиГрузоперевозок.Параметр = &АгентПоПередаче) КАК АгентПоПередаче
       ПО CW_Грузоперевозки.Ссылка = АгентПоПередаче.Грузоперевозка
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
           CW_ХарактеристикиГрузоперевозок.ЗначениеФакт КАК ЗначениеФакт
       ИЗ
           РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
       ГДЕ
           CW_ХарактеристикиГрузоперевозок.Параметр = &ВыгруженВПорту) КАК ВыгруженВПорту
       ПО CW_Грузоперевозки.Ссылка = ВыгруженВПорту.Грузоперевозка
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
           CW_ХарактеристикиГрузоперевозок.Значение КАК Значение
       ИЗ
           РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
       ГДЕ
           CW_ХарактеристикиГрузоперевозок.Параметр = &Коносамент) КАК Коносамент
       ПО CW_Грузоперевозки.Ссылка = Коносамент.Грузоперевозка
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
           CW_ХарактеристикиГрузоперевозок.ЗначениеФакт КАК ЗначениеФакт
       ИЗ
           РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
       ГДЕ
           CW_ХарактеристикиГрузоперевозок.Параметр = &Отгружен) КАК Отгружен
       ПО CW_Грузоперевозки.Ссылка = Отгружен.Грузоперевозка
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
           CW_ХарактеристикиГрузоперевозок.ЗначениеФакт КАК ЗначениеФакт
       ИЗ
           РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
       ГДЕ
           CW_ХарактеристикиГрузоперевозок.Параметр = &ПереданПорожним) КАК ПереданПорожним
       ПО CW_Грузоперевозки.Ссылка = ПереданПорожним.Грузоперевозка
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
           CW_ХарактеристикиГрузоперевозок.Значение КАК Значение
       ИЗ
           РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
       ГДЕ
           CW_ХарактеристикиГрузоперевозок.Параметр = &СтанцияНазначения) КАК СтанцияНазначения
       ПО CW_Грузоперевозки.Ссылка = СтанцияНазначения.Грузоперевозка
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
           CW_ХарактеристикиГрузоперевозок.Значение КАК Значение
       ИЗ
           РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
       ГДЕ
           CW_ХарактеристикиГрузоперевозок.Параметр = &СтанцияОтправления) КАК СтанцияОтправления
       ПО CW_Грузоперевозки.Ссылка = СтанцияОтправления.Грузоперевозка

Работает в примерно в 1,5 раза быстрее СКД-шного запроса. Сейчас буду пробовать сделать пакетными запросами вместо вложенных.

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

СГРУППИРОВАТЬ ПО
   CW_ГрузоперевозкиПараметрыГрузоперевозки.Ссылка

Догадываюсь о том, что время запроса к РС возрастает с количеством условий (ГДЕ) с геометрической прогрессией. Так как много запросов, у которых указано по одному условию работают быстрее, чем выборка всех нужных вариантов Измерения разом.
Теперь можно пинать.
10 camojiet
 
22.04.13
08:57
Пакетами запросов получилось медленее.
11 camojiet
 
22.04.13
09:33
А нет, я соврал, когда делал вложенными пропустил одну характеристику, пакетные быстрее. Не в 1,5 раза но тоже хорошо. В общем судьбу обмануть можно.
12 camojiet
 
24.04.13
04:37
Вобщем, большие объемы характеристик выгружаются быстрее всего следующим образом:
ВЫБРАТЬ
   CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
   CW_ХарактеристикиГрузоперевозок.ЗначениеФакт КАК АвтовывозСТерминала
ПОМЕСТИТЬ Т_АвтовывозСТерминала
ИЗ
   РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
ГДЕ
   CW_ХарактеристикиГрузоперевозок.Параметр = &АвтовывозСТерминала

ИНДЕКСИРОВАТЬ ПО
   Грузоперевозка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   CW_ХарактеристикиГрузоперевозок.Грузоперевозка КАК Грузоперевозка,
   CW_ХарактеристикиГрузоперевозок.Значение КАК АгентОтправитель
ПОМЕСТИТЬ Т_АгентОтправитель
ИЗ
   РегистрСведений.CW_ХарактеристикиГрузоперевозок КАК CW_ХарактеристикиГрузоперевозок
ГДЕ
   CW_ХарактеристикиГрузоперевозок.Параметр = &АгентОтправитель

ИНДЕКСИРОВАТЬ ПО
   Грузоперевозка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   CW_Грузоперевозки.Ссылка,
   Т_АвтовывозСТерминала.АвтовывозСТерминала,
   Т_АгентОтправитель.АгентОтправитель
ИЗ
   Справочник.CW_Грузоперевозки КАК CW_Грузоперевозки
       ЛЕВОЕ СОЕДИНЕНИЕ Т_АвтовывозСТерминала КАК Т_АвтовывозСТерминала
       ПО CW_Грузоперевозки.Ссылка = Т_АвтовывозСТерминала.Грузоперевозка
       ЛЕВОЕ СОЕДИНЕНИЕ Т_АгентОтправитель КАК Т_АгентОтправитель
       ПО CW_Грузоперевозки.Ссылка = Т_АгентОтправитель.Грузоперевозка