Имя: Пароль:
1C
1С v8
Как ускорить выполнение запроса
0 Shikolosa
 
23.10.20
14:52
Здравствуйте, подскажите пожалуйста, как можно ускорить выполнение запроса:  Необходимо выбрать списание материалов за определённый период, в разрезе складов.
                        "ВЫБРАТЬ
                   |    ТоварыНаСкладахОбороты.Склад,
                   |    ТоварыНаСкладахОбороты.Номенклатура,
                   |    ТоварыНаСкладахОбороты.КоличествоРасход,
                   |    ТоварыНаСкладахОбороты.Регистратор
                   |ИЗ
                   |    РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, Запись, Номенклатура.ВидНоменклатуры = &Материал) КАК ТоварыНаСкладахОбороты
                   |ГДЕ
                   |    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)";
Запрос.УстановитьПараметр("ДатаНачала", ЭтотОбъект.ДатаНачала);
  Запрос.УстановитьПараметр("ДатаКонца", ЭтотОбъект.ДатаКонец);
   Результат= Запрос.Выполнить();
   Выборка = Результат.Выбрать();
   Пока Выборка.Следующий() Цикл
    НоваяСтрока= ЭтотОбъект.Точка.Добавить();
    НоваяСтрока.Номенклатура=Выборка.Номенклатура;
    НоваяСтрока.Менеджер=НоваяСтрока.Номенклатура.ОтветственныйМенеджерЗаПокупки;
    НоваяСтрока.Единица=Выборка.Номенклатура.ЕдиницаХраненияОстатков;
Если Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000003")Тогда
    НоваяСтрока.СписаноМех=Выборка.КоличествоРасход;
ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000004")Тогда
    НоваяСтрока.СписаноРЭАиП=Выборка.КоличествоРасход;
ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000005")Тогда
    НоваяСтрока.СписаноТиТ=Выборка.КоличествоРасход;
ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000001")Тогда
    НоваяСтрока.СписаноОсновной=Выборка.КоличествоРасход;
ИначеЕсли Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000002")Тогда
    НоваяСтрока.СписаноМеханика=Выборка.КоличествоРасход;
КонецЕсли;
1 shuhard
 
23.10.20
14:56
(0)[Справочники.Склады.НайтиПоКоду("000000003")] - в цикле зачем ? сравни в запросе со значением
2 Shikolosa
 
23.10.20
15:02
(1) Не совсем понимаю как. Движения нужны в разрезе 5 складов.
3 Said_We
 
23.10.20
15:06
ВЫБРАТЬ
    ТоварыНаСкладахОбороты.Склад,
    ТоварыНаСкладахОбороты.Номенклатура,
    ТоварыНаСкладахОбороты.КоличествоРасход,
    ТоварыНаСкладахОбороты.Регистратор
    ,ВЫБОР КОГДА ТоварыНаСкладахОбороты.Склад = &Склад_СписаноМех ТОГДА ТоварыНаСкладахОбороты.КоличествоРасход ИНАЧЕ 0 КОНЕЦ КАК СписаноМех
    ,ВЫБОР КОГДА ТоварыНаСкладахОбороты.Склад = &Склад_СписаноРЭАиП ТОГДА ТоварыНаСкладахОбороты.КоличествоРасход ИНАЧЕ 0 КОНЕЦ КАК СписаноРЭАиП
...
4 shuhard
 
23.10.20
15:08
(3) +1
или сделать склады предопределенными или классифицировать реквизитом
5 arsik
 
гуру
23.10.20
15:08
Еще
ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)
заменить на
ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ТребованиеНакладная
6 arsik
 
гуру
23.10.20
15:10
Вот это тоже не надо
НоваяСтрока.Менеджер=НоваяСтрока.Номенклатура.ОтветственныйМенеджерЗаПокупки;
НоваяСтрока.Единица=Выборка.Номенклатура.ЕдиницаХраненияОстатков;

Сразу в запросе выбирай
7 NWsFF
 
23.10.20
15:10
Еще убрать из выборки регистратора и склад  и сгруппировать по номенклатуре
8 arsik
 
гуру
23.10.20
15:14
И зачем выбирать обороты остаточного регистра через виртуальную таблицу? Проще прямо по движениям сделать
9 Timon1405
 
23.10.20
15:30
(5) в SQL это абсолютно одно и то же: WHERE (Т.Recorder REFS Document123)
10 Shikolosa
 
23.10.20
15:30
Спасибо!
11 arsik
 
гуру
23.10.20
15:40
(9) Возможно, но не факт.
12 NWsFF
 
23.10.20
15:41
(9) в SQL есть такой оператор REFS?
13 RomanYS
 
23.10.20
15:52
Зачем ускорять запрос, если потом в цикле такое?

НоваяСтрока.Менеджер=НоваяСтрока.Номенклатура.ОтветственныйМенеджерЗаПокупки;
НоваяСтрока.Единица=Выборка.Номенклатура.ЕдиницаХраненияОстатков;
Если Выборка.Склад=Справочники.Склады.НайтиПоКоду("000000003")Тогда
14 ILM
 
гуру
23.10.20
15:54
(0) Перепишите на один запрос с использованием
Используй (3), добавь внутреннее соединение со справочником номенклатура, чтобы поля: Номенклатура.ОтветственныйМенеджерЗаПокупки,Номенклатура.ВидНоменклатуры, Номенклатура.ЕдиницаХраненияОстатков брать из него. В запросе сразу формируй все поля таблицы, чтобы не лазить 10 раз к базе.
и исправь в условии запроса
"ГДЕ
  ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ТребованиеНакладная"
15 arsik
 
гуру
23.10.20
15:57
(14)
>добавь внутреннее соединение со справочником номенклатура, чтобы поля: Номенклатура.ОтветственныйМенеджерЗаПокупки,Номенклатура.ВидНоменклатуры, Номенклатура.ЕдиницаХраненияОстатков брать из него.
Это необязательно. Если тип у поля через точку не составной то никакого профита не будет. А если не будет, то без соединения читабельность запроса лучше.
16 Timon1405
 
23.10.20
15:59
(12) да поправка, REFS оператор 1сного SDBL'a) на sql T1._RecorderTRef
17 ILM
 
гуру
23.10.20
16:00
(15) Памяти меньше ест на сервере. Если объем выборки большой, то в выборку попадают только нужные поля.
18 Shikolosa
 
23.10.20
16:51
Спасибо большое!! Намного быстрее! Сделала как (14). В результате если без группировки время выполнения: 49,73 сек.
19 palsergeich
 
23.10.20
16:58
(18) жесть.
Получи всю номенклатуру с видом = материал.
Помести во временную таблицу.
И при обращении к виртуальной (а на самом деле в ней нет смысла, ибо по позиции регистратора = к реальной) ставь отбор по номенклатуре из предыдущего пакета.
Не надо условия Вирт таблиц делать с точкой
20 palsergeich
 
23.10.20
17:01
"Выбрать спрНоменклатура.ссылка Как номенклатура Поместить втНоменклатура Из Справочникноменклатура как спрНоменклатура где спрНоменклатура.Видноменклатуры = &материал ;
ВЫБРАТЬ
                   |    ТоварыНаСкладахОбороты.Склад,
                   |    ТоварыНаСкладахОбороты.Номенклатура,
                   |    ТоварыНаСкладахОбороты.КоличествоРасход,
                   |    ТоварыНаСкладахОбороты.Регистратор
                   |ИЗ
                   |    РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, Запись, Номенклатура В (Выбрать втНоменклатура.номенклатура из втНоменклатура КАК втНоменклатура)) КАК ТоварыНаСкладахОбороты
                   |ГДЕ
                   |    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)";

Хотя бы так
21 palsergeich
 
23.10.20
17:02
"Выбрать спрНоменклатура.ссылка Как номенклатура Поместить втНоменклатура Из Справочникноменклатура как спрНоменклатура где спрНоменклатура.Видноменклатуры = &материал ;
| ВЫБРАТЬ
                   |    ТоварыНаСкладахОбороты.Склад,
                   |    ТоварыНаСкладахОбороты.Номенклатура,
                   |    ТоварыНаСкладахОбороты.КоличествоРасход,
                   |    ТоварыНаСкладахОбороты.Регистратор
                   |ИЗ
                   |    РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, Запись, Номенклатура В (Выбрать втНоменклатура.номенклатура из втНоменклатура КАК втНоменклатура)) КАК ТоварыНаСкладахОбороты
                   |ГДЕ
                   |    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ТребованиеНакладная)";
Поправил
22 xXeNoNx
 
26.10.20
01:44
Обороты и регистратор? Ну очень сомнительно.
А требование-накладная делает приход по товарам на складах?
23 Said_We
 
26.10.20
11:41
(18) Если почти минуту, то скорее всего как в (3) не сделано.
И тормозит не сам запрос, а обработка результата.
24 D_E_S_131
 
26.10.20
14:03
(19) "Получи всю номенклатуру с видом = материал." - это не рофл сейчас был? :)
25 D_E_S_131
 
26.10.20
14:06
+ к (22). Если нужно брать движения расход с учетом регистратора, то виртуальная таблица будет "узким местом". Поэтому либо из движений сразу выбирать данные, либо добавлять измерение в РН, характеризующее вид списания, которое потом можно будет использовать при получении оборотов.
26 Shikolosa
 
26.10.20
15:58
Сделала как в (3) и (14) в результате за 1,5 года формирует 11 сек
27 Armando
 
26.10.20
23:04
Использование таблицы оборотов в данном случае бессмысленно. Попробуй собрать данные из реальной таблицы. Собственно об этом уже сказали, я лишь поддержу.
И перечисли все измерения регистра в том порядке как они заданы в конфигураторе.