Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
11 дек 2024, 08:46

Запрос замедляет при получение цены продажи

Автор Спектор, 16 апр 2024, 16:50

0 Пользователей и 1 гость просматривают эту тему.

Спектор

МассивТоваров = Новый Массив;
 МассивТоваров.Очистить();
 ШаблонПоиска = СокрЛП(ПолеПоиска);
 Если ЗначениеНеЗаполнено(ШаблонПоиска) Тогда
  Возврат;
 КонецЕсли;
 Если Не ЗначениеЗаполнено(Местахранения) Тогда
  ПользовательБазы = ПользователиИнформационнойБазы.ТекущийПользователь();
  ПользовательБазыСтрока = Строка(ПользовательБазы.УникальныйИдентификатор);
  ПоискВСправочникеПользователей = Справочники.Пользователи.НайтиПоРеквизиту("УникальныйИдентификатор",ПользовательБазыСтрока);
  Местахранения = ПоискВСправочникеПользователей.МестаХранения;
 КонецЕсли;
 Текст = ШаблонПоиска;
 
 ШаблонПоиска1 = "";
 
 ЭтаФорма.ШаблонПоиска1 = Текст;
 ЭтаФорма.ШаблонПоиска1 = СтрЗаменить(ЭтаФорма.ШаблонПоиска1, "~", "~~");   
 ЭтаФорма.ШаблонПоиска1 = СтрЗаменить(ЭтаФорма.ШаблонПоиска1, "%", "~%");
 ЭтаФорма.ШаблонПоиска1 = СтрЗаменить(ЭтаФорма.ШаблонПоиска1, "_", "~_");
 ЭтаФорма.ШаблонПоиска1 = СтрЗаменить(ЭтаФорма.ШаблонПоиска1, "[", "~[");
 ЭтаФорма.ШаблонПоиска1 = СтрЗаменить(ЭтаФорма.ШаблонПоиска1, "-", "~-");
 ЭтаФорма.ШаблонПоиска1 = "%" + ЭтаФорма.ШаблонПоиска1 + "%";

Бархаётжон, [16.04.2024 18:46]
Запрос = Новый Запрос;
 Запрос.УстановитьПараметр("ШаблонПоиска", ЭтаФорма.ШаблонПоиска1);//ШаблонПоиска);
 
 Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 51
 | Номенклатура.Код КАК Код,
 | Номенклатура.Ссылка КАК Номенклатура
 |ИЗ
 | Справочник.Номенклатура КАК Номенклатура
 |ГДЕ
 | Номенклатура.ПолноеИмя ПОДОБНО &ШаблонПоиска СПЕЦСИМВОЛ ""~""
 | И Номенклатура.ЭтоГруппа = ЛОЖЬ";
 
 МассивТоваров= Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Номенклатура");
 
 
 Запрос = Новый Запрос;
 Запрос.Текст =
 "ВЫБРАТЬ
 | Номенклатур.Ссылка КАК Номенклатура,
 | Номенклатур.Код,
 | Номенклатур.ЕдиницаИзмерения,
 | СРЕДНЕЕ(ВЫБОР
 |   КОГДА Номенклатур.Валютный
 |    ТОГДА ВЫБОР
 |      КОГДА &РознПродажа
 |       ТОГДА ЕСТЬNULL(ЦенаПокупкиСрезПоследних.ЦенаПокупки, 0) * &Курс
 |      ИНАЧЕ ЕСТЬNULL(ЦенаПокупкиСрезПоследних.ЦенаПокупки, 0)
 |     КОНЕЦ
 |   ИНАЧЕ ЕСТЬNULL(ЦенаПокупкиСрезПоследних.ЦенаПокупки, 0)
 |  КОНЕЦ) КАК ЦенаПокупки,
 | СРЕДНЕЕ(ВЫБОР
 |   КОГДА Номенклатур.Валютный
 |    ТОГДА ВЫБОР
 |      КОГДА &РознПродажа
 |       ТОГДА ЕСТЬNULL(ЦенаПродажаСрезПоследних.ЦенаПродажа, 0) * &Курс
 |      ИНАЧЕ ЕСТЬNULL(ЦенаПродажаСрезПоследних.ЦенаПродажа, 0)
 |     КОНЕЦ
 |   ИНАЧЕ ЕСТЬNULL(ЦенаПродажаСрезПоследних.ЦенаПродажа, 0)
 |  КОНЕЦ) КАК Цена,
 | СРЕДНЕЕ(ВЫБОР
 |   КОГДА Номенклатур.Валютный
 |    ТОГДА ВЫБОР
 |      КОГДА &РознПродажа
 |       ТОГДА ЕСТЬNULL(ЦенаПродажаРозничнаяСрезПоследних.ЦенаПродажа, 0) * &Курс
 |      ИНАЧЕ ЕСТЬNULL(ЦенаПродажаРозничнаяСрезПоследних.ЦенаПродажа, 0)
 |     КОНЕЦ
 |   ИНАЧЕ ЕСТЬNULL(ЦенаПродажаРозничнаяСрезПоследних.ЦенаПродажа, 0)
 |  КОНЕЦ) КАК ЦенаРозн,
 | Номенклатур.Валютный КАК Валютный,
 | СРЕДНЕЕ(ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0)) КАК Остатка
 |ИЗ
 | Справочник.Номенклатура КАК Номенклатур
 |  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦенаПокупки.СрезПоследних(&Дата, МестаХранения.Филиал = &Филиал) КАК ЦенаПокупкиСрезПоследних
 |  ПО Номенклатур.Ссылка = ЦенаПокупкиСрезПоследних.Номенклатура
 |  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦенаПродажа.СрезПоследних(&Дата, ТипЦена = &ТипЦена) КАК ЦенаПродажаСрезПоследних
 |  ПО Номенклатур.Ссылка = ЦенаПродажаСрезПоследних.Номенклатура
 |  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦенаПродажаРозничная.СрезПоследних(&Дата, ТипЦена = &ТипЦена) КАК ЦенаПродажаРозничнаяСрезПоследних
 |  ПО Номенклатур.Ссылка = ЦенаПродажаРозничнаяСрезПоследних.Номенклатура
 |  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&Дата, МестаХранения = &МестаХранения) КАК ОстаткиТоваровОстатки
 |  ПО Номенклатур.Ссылка = ОстаткиТоваровОстатки.Номенклатура
 |ГДЕ
 | Номенклатур.Ссылка В(&МассивТоваров)
 | И ОстаткиТоваровОстатки.КоличествоОстаток > 0
 |
 |СГРУППИРОВАТЬ ПО
 | Номенклатур.Ссылка,
 | Номенклатур.ЕдиницаИзмерения,
 | Номенклатур.Код,
 | Номенклатур.Валютный
 |
 |УПОРЯДОЧИТЬ ПО
 | Номенклатур.Наименование";
 Курс = ПолучитьКурсВалюты(КонецДня(ТекущаяДата()));
 Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
 Запрос.УстановитьПараметр("МассивТоваров", МассивТоваров);
 Запрос.УстановитьПараметр("Филиал", МестаХранения.Филиал);
 Запрос.УстановитьПараметр("МестаХранения", МестаХранения);
 Запрос.УстановитьПараметр("ТипЦена",Местахранения.Филиал.ТипЦена);
 Запрос.УстановитьПараметр("Курс",Курс);
 Запрос.УстановитьПараметр("РознПродажа",РознПродажа);
 Если Не ПоОстаткам Тогда
  Запрос.Текст = СтрЗаменить(Запрос.Текст, "И ОстаткиТоваровОстатки.КоличествоОстаток > 0", "");
 КонецЕсли;
 
 Рез=Запрос.Выполнить();
 Если Рез.Пустой() Тогда
  Таблица.Очистить();
 КонецЕсли;
 
 Таблица= Рез.Выгрузить();

Максим75

Спектор, не совсем понятно, в чем проблема.
сразу что бросается в глаза - запихнуть массив товаров зразу в виртуальные таблицы всех регистров в левых соединениях.
возможно, что номенклатуры очень много, и логично сразу отсечь только нужную номенклатуру при получении виртуальных таблиц.

antoneus

Номенклатура.ПолноеИмя ПОДОБНО &ШаблонПоиска СПЕЦСИМВОЛ ""~""

Вот это прямо оооочень тормозит.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск