Имя: Пароль:
1C
1С v8
Как лучше выгрузить данные из двух регистров накопления
0 Guerro
 
21.11.19
12:09
Есть регистр потолков с левым соединением регистра состояния потолков, из них грузятся все нужные данные по отбору по измерению и статусу потолка, выгрузка занимает примерно 5-10 секунд, а это конечно много.
Запрос:
                Запрос=Новый Запрос;
        Запрос.Текст="ВЫБРАТЬ
                     |    ПотолкиОстатки.Код КАК Код,
                     |    СостояниеПотолковОстатки.Состояние КАК Состояние,
                     |    ПотолкиОстатки.Заказчик КАК Заказчик,
                     |    ПотолкиОстатки.Статус КАК Статус,
                     |    ПотолкиОстатки.Материал КАК Материал,
                     |    ПотолкиОстатки.Площадь КАК Площадь,
                     |    ПотолкиОстатки.Углы КАК Углы,
                     |    ПотолкиОстатки.Криволинейность КАК Криволинейность,
                     |    ПотолкиОстатки.КриволинейнаяСпайка КАК КриволинейнаяСпайка,
                     |    ПотолкиОстатки.ЦенаДилер КАК ЦенаДилер,
                     |    ПотолкиОстатки.КолФотоПечать КАК КолФотоПечать,
                     |    ПотолкиОстатки.ЦенаФотоПечать КАК ЦенаФотоПечать,
                     |    ПотолкиОстатки.СуммаФотоПечать КАК СуммаФотоПечать,
                     |    СУММА(ПотолкиОстатки.ОстатокОстаток) КАК Остаток,
                     |    СУММА(ПотолкиОстатки.ЦенаЗакупкиОстаток) КАК ЦенаЗакупки,
                     |    СУММА(ПотолкиОстатки.ЦенаИзделияОстаток) КАК ЦенаИзделия
                     |ИЗ
                     |    РегистрНакопления.Потолки.Остатки(, Статус = ""Заказ"") КАК ПотолкиОстатки
                     |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СостояниеПотолков.Остатки(, Состояние = &Состояние) КАК СостояниеПотолковОстатки
                     |        ПО ПотолкиОстатки.Код = СостояниеПотолковОстатки.Код
                     |
                     |СГРУППИРОВАТЬ ПО
                     |    ПотолкиОстатки.Заказчик,
                     |    ПотолкиОстатки.Статус,
                     |    ПотолкиОстатки.Материал,
                     |    ПотолкиОстатки.Код,
                     |    ПотолкиОстатки.Площадь,
                     |    ПотолкиОстатки.Углы,
                     |    ПотолкиОстатки.Криволинейность,
                     |    ПотолкиОстатки.ЦенаДилер,
                     |    ПотолкиОстатки.КолФотоПечать,
                     |    ПотолкиОстатки.ЦенаФотоПечать,
                     |    ПотолкиОстатки.СуммаФотоПечать,
                     |    ПотолкиОстатки.КриволинейнаяСпайка,
                     |    СостояниеПотолковОстатки.Состояние";
        Запрос.УстановитьПараметр("Состояние",Статус);
        ТаблРез=Запрос.Выполнить().Выгрузить();
Попробовала через "РегистрыНакопления.Потолки.Остатки(,Новый Структура(...))", занимает менее секунды, но нужно организовать цикл для подгрузки состояния:
                РегПотолков.Колонки.Добавить("Состояние");
        РегПотолков.Колонки.Сдвинуть(РегПотолков.Колонки.Найти("Состояние"),-(РегПотолков.Колонки.Количество()-2));
        Для каждого СтрРЗ Из РегПотолков Цикл
            ТРег=РегистрыНакопления.СостояниеПотолков.Остатки(,Новый Структура("ШтрихКод",СтрРЗ.ШтрихКод));
            Для Каждого Рег из ТРег Цикл
                СтрРЗ.Состояние=Рег.Состояние;
            КонецЦикла;
        КонецЦикла;
А вот тут уже запрос в цикле нельзя, но вот как получилось, и нагрузка стала до 1-2 секунд. Так еще нужно будет отбор сделать для нужного статуса. Как лучше правильно сделать?
1 sqr4
 
21.11.19
12:12
Не рекомендуется же соединяться с виртуальными таблицами. Результаты во временные таблицы, индексируй по соединяемым полям и соединяй
2 Guerro
 
21.11.19
12:17
(1) Получилось так:
"ВЫБРАТЬ
                     |    РегистрПотолков.Код КАК Код,
                     |    РегистрПотолков.Заказчик КАК Заказчик,
                     |    РегистрПотолков.Статус КАК Статус,
                     |    РегистрПотолков.Материал КАК Материал,
                     |    РегистрПотолков.Площадь КАК Площадь,
                     |    РегистрПотолков.Углы КАК Углы,
                     |    РегистрПотолков.Криволинейность КАК Криволинейность,
                     |    РегистрПотолков.КриволинейнаяСпайка КАК КриволинейнаяСпайка,
                     |    РегистрПотолков.ЦенаДилер КАК ЦенаДилер,
                     |    РегистрПотолков.КолФотоПечать КАК КолФотоПечать,
                     |    РегистрПотолков.ЦенаФотоПечать КАК ЦенаФотоПечать,
                     |    РегистрПотолков.СуммаФотоПечать КАК СуммаФотоПечать,
                     |    РегистрПотолков.ОстатокОстаток КАК ОстатокОстаток,
                     |    РегистрПотолков.ЦенаЗакупкиОстаток КАК ЦенаЗакупкиОстаток,
                     |    РегистрПотолков.ЦенаИзделияОстаток КАК ЦенаИзделияОстаток,
                     |    РегистрСостоянияПотолков.Состояние КАК Состояние
                     |ИЗ
                     |    (ВЫБРАТЬ
                     |        ПотолкиОстатки.Код КАК Код,
                     |        ПотолкиОстатки.Заказчик КАК Заказчик,
                     |        ПотолкиОстатки.Статус КАК Статус,
                     |        ПотолкиОстатки.Материал КАК Материал,
                     |        ПотолкиОстатки.Площадь КАК Площадь,
                     |        ПотолкиОстатки.Углы КАК Углы,
                     |        ПотолкиОстатки.Криволинейность КАК Криволинейность,
                     |        ПотолкиОстатки.КриволинейнаяСпайка КАК КриволинейнаяСпайка,
                     |        ПотолкиОстатки.ЦенаДилер КАК ЦенаДилер,
                     |        ПотолкиОстатки.КолФотоПечать КАК КолФотоПечать,
                     |        ПотолкиОстатки.ЦенаФотоПечать КАК ЦенаФотоПечать,
                     |        ПотолкиОстатки.СуммаФотоПечать КАК СуммаФотоПечать,
                     |        ПотолкиОстатки.ОстатокОстаток КАК ОстатокОстаток,
                     |        ПотолкиОстатки.ЦенаЗакупкиОстаток КАК ЦенаЗакупкиОстаток,
                     |        ПотолкиОстатки.ЦенаИзделияОстаток КАК ЦенаИзделияОстаток
                     |    ИЗ
                     |        РегистрНакопления.Потолки.Остатки(, Статус = ""Заказ"") КАК ПотолкиОстатки) КАК РегистрПотолков
                     |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                     |            СостояниеПотолковОстатки.Код КАК Код,
                     |            СостояниеПотолковОстатки.Состояние КАК Состояние
                     |        ИЗ
                     |            РегистрНакопления.СостояниеПотолков.Остатки(, Состояние = &Состояние) КАК СостояниеПотолковОстатки) КАК РегистрСостоянияПотолков
                     |        ПО РегистрПотолков.Код = РегистрСостоянияПотолков.Код"
3 Darych
 
21.11.19
12:19
не
4 Guerro
 
21.11.19
12:22
Сделал так и стало около секунды:
"Запрос=Новый Запрос;
        Запрос.Текст="ВЫБРАТЬ
                     |    РегистрПотолков.Код КАК Код,
                     |    РегистрСостоянияПотолков.Состояние КАК Состояние,
                     |    РегистрПотолков.Заказчик КАК Заказчик,
                     |    РегистрПотолков.Статус КАК Статус,
                     |    РегистрПотолков.Материал КАК Материал,
                     |    РегистрПотолков.Площадь КАК Площадь,
                     |    РегистрПотолков.Углы КАК Углы,
                     |    РегистрПотолков.Криволинейность КАК Криволинейность,
                     |    РегистрПотолков.КриволинейнаяСпайка КАК КриволинейнаяСпайка,
                     |    РегистрПотолков.ЦенаДилер КАК ЦенаДилер,
                     |    РегистрПотолков.КолФотоПечать КАК КолФотоПечать,
                     |    РегистрПотолков.ЦенаФотоПечать КАК ЦенаФотоПечать,
                     |    РегистрПотолков.СуммаФотоПечать КАК СуммаФотоПечать,
                     |    РегистрПотолков.Остаток КАК Остаток,
                     |    РегистрПотолков.ЦенаЗакупки КАК ЦенаЗакупки,
                     |    РегистрПотолков.ЦенаИзделия КАК ЦенаИзделия
                     |ИЗ
                     |    (ВЫБРАТЬ
                     |        ПотолкиОстатки.Код КАК Код,
                     |        ПотолкиОстатки.Заказчик КАК Заказчик,
                     |        ПотолкиОстатки.Статус КАК Статус,
                     |        ПотолкиОстатки.Материал КАК Материал,
                     |        ПотолкиОстатки.Площадь КАК Площадь,
                     |        ПотолкиОстатки.Углы КАК Углы,
                     |        ПотолкиОстатки.Криволинейность КАК Криволинейность,
                     |        ПотолкиОстатки.КриволинейнаяСпайка КАК КриволинейнаяСпайка,
                     |        ПотолкиОстатки.ЦенаДилер КАК ЦенаДилер,
                     |        ПотолкиОстатки.КолФотоПечать КАК КолФотоПечать,
                     |        ПотолкиОстатки.ЦенаФотоПечать КАК ЦенаФотоПечать,
                     |        ПотолкиОстатки.СуммаФотоПечать КАК СуммаФотоПечать,
                     |        ПотолкиОстатки.ОстатокОстаток КАК Остаток,
                     |        ПотолкиОстатки.ЦенаЗакупкиОстаток КАК ЦенаЗакупки,
                     |        ПотолкиОстатки.ЦенаИзделияОстаток КАК ЦенаИзделия
                     |    ИЗ
                     |        РегистрНакопления.Потолки.Остатки(, Статус = ""Заказ"") КАК ПотолкиОстатки) КАК РегистрПотолков
                     |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                     |            СостояниеПотолковОстатки.Код КАК Код,
                     |            СостояниеПотолковОстатки.Состояние КАК Состояние
                     |        ИЗ
                     |            РегистрНакопления.СостояниеПотолков.Остатки(, Состояние = &Состояние) КАК СостояниеПотолковОстатки) КАК РегистрСостоянияПотолков
                     |        ПО РегистрПотолков.Код = РегистрСостоянияПотолков.Код";
        Запрос.УстановитьПараметр("Состояние",Статус);
        ТаблРез=Запрос.Выполнить().Выгрузить();"
5 Guerro
 
21.11.19
12:22
(3) а как?
6 Guerro
 
21.11.19
14:49
up
7 Ник080808
 
21.11.19
14:54
(6) Выбрать всенайиг ПОместить ВТПотолки из РегистрНакопления.Потолки.Остатки(, Статус = ""Заказ"") КАК ПотолкиОстатки;
Выбрать всенайиг ПОместить ВТСостоянияПотолков из РегистрНакопления.СостояниеПотолков.Остатки(, Состояние = &Состояние) КАК РегистрСостоянияПотолков;
Выбрать ВТПотолки левое соединение ВТСостоянияПотолков
8 sqr4
 
21.11.19
14:55
(4) а тут связь с подзапросом, тоже не есть гуд и индексируй по полям соединения
9 Guerro
 
21.11.19
14:58
(7) я в (4) так и сделал, не то?
10 sqr4
 
21.11.19
15:00
(9) у тебя связь виртуально таблицы с подзапросом, теже яйца, вид сбоку.
11 Darych
 
21.11.19
15:01
(9) у тяж запрос по вирт таблице идет в разрезе всех измерений по остаткам... нах тебе суммы и группировки
12 Guerro
 
21.11.19
15:01
(10) понял, сейчас буду изучать временные таблицы, я их перепутал с вложенными запросами
13 Ник080808
 
21.11.19
15:03
(12) "перепутал", пол "Женский". Кажется трансгендеры на мисту пришли)
14 sqr4
 
21.11.19
15:05
(13) причем он сам зашел и поменял, по умолчанию мужской создается. Чтобы поменять, надо обязательно зайти еще раз в настройки учетки, т.е ошибиться нельзя)
15 D_E_S_131
 
21.11.19
15:13
(0) А нельзя сразу получить остатки с отбором по "Статусу" и "Состоянию" нужному? Обязательно соединять-извращаться нужно? Хотя учитывая чехарду с полом аккаунта возможно это и норм...
16 Guerro
 
21.11.19
15:15
(14) это называется "донашивать" аккаунт
17 Guerro
 
21.11.19
15:16
(15) ну регистры же разные или путаю что-то?
18 Guerro
 
21.11.19
15:23
(7) все летает быстрее, чем когда-либо
19 D_E_S_131
 
21.11.19
15:24
(17) Тогда выбираешь данные из одного регистра и помещаешь в ВТ, устанавливая индекс по Коду, через которое соединять будешь. Потом так же по второму регистру. И уже в третьем пакете соединяешь эти две ВТ и выводишь данные.
20 Ник080808
 
21.11.19
15:56
(19) см (7) Правда я индекс не написал
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн