Здравствуйте! Помогите пожалуйста оптимизировать код.
Вижу только всё переписать заново в запросе и обойтись без вложенных запросов.
Спасибо!
Вижу только всё переписать заново в запросе и обойтись без вложенных запросов.
Спасибо!
ДопРасходыИмпортДокументы.Очистить();
Если ПоступлениеТоваровИмпорт.ДопРасходыИмпорт.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеДопРасходов.Содержание КАК Содержание,
| ПоступлениеДопРасходов.Номенклатура КАК Номенклатура,
| СУММА(ПоступлениеДопРасходов.Сумма) КАК Сумма,
| МАКСИМУМ(ЗаказПоставщикуОтгруженный.Количество) КАК Количество,
| ПоступлениеДопРасходов.Валюта КАК Валюта,
| ПоступлениеДопРасходов.Курс КАК Курс,
| ПоступлениеДопРасходов.Контрагент КАК Контрагент,
| ПоступлениеДопРасходов.ДоговорВзаиморасчетов КАК Договор
|ИЗ
| (ВЫБРАТЬ
| ""ГТД: Таможенная пошлина"" КАК Содержание,
| ГТДИмпортТовары.Номенклатура КАК Номенклатура,
| ГТДИмпортТовары.Количество КАК Количество,
| ГТДИмпортТовары.СуммаПошлины КАК Сумма,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов КАК Валюта,
| ГТДИмпортТовары.Ссылка.КурсВзаиморасчетов КАК Курс,
| ГТДИмпортТовары.Ссылка.Контрагент КАК Контрагент,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов КАК ДоговорВзаиморасчетов
| ИЗ
| Документ.ГТДИмпорт.Товары КАК ГТДИмпортТовары
| ГДЕ
| ГТДИмпортТовары.Ссылка.ДокументОснование = &Основание
| И ГТДИмпортТовары.Ссылка.Проведен
| И ГТДИмпортТовары.Номенклатура В(&МассивНоменклатуры)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ""ГТД: НДС"",
| ГТДИмпортТовары.Номенклатура,
| ГТДИмпортТовары.Количество,
| ГТДИмпортТовары.СуммаНДС,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов,
| ГТДИмпортТовары.Ссылка.КурсВзаиморасчетов,
| ГТДИмпортТовары.Ссылка.Контрагент,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов
| ИЗ
| Документ.ГТДИмпорт.Товары КАК ГТДИмпортТовары
| ГДЕ
| ГТДИмпортТовары.Ссылка.ДокументОснование = &Основание
| И ГТДИмпортТовары.Ссылка.Проведен
| И ГТДИмпортТовары.Номенклатура В(&МассивНоменклатуры)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ""ГТД: Таможенный сбор"",
| ГТДИмпортТовары.Номенклатура,
| ГТДИмпортТовары.Количество,
| ГТДИмпортТовары.СуммаТаможня,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов.ВалютаВзаиморасчетов,
| ГТДИмпортТовары.Ссылка.КурсВзаиморасчетов,
| ГТДИмпортТовары.Ссылка.Контрагент,
| ГТДИмпортТовары.Ссылка.ДоговорВзаиморасчетов
| ИЗ
| Документ.ГТДИмпорт.Товары КАК ГТДИмпортТовары
| ГДЕ
| ГТДИмпортТовары.Ссылка.ДокументОснование = &Основание
| И ГТДИмпортТовары.Ссылка.Проведен
| И ГТДИмпортТовары.Номенклатура В(&МассивНоменклатуры)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ""ДР: "" + ПоступлениеДопРасходовИмпортТовары.Ссылка.Содержание,
| ПоступлениеДопРасходовИмпортТовары.Номенклатура,
| ПоступлениеДопРасходовИмпортТовары.Количество,
| ПоступлениеДопРасходовИмпортТовары.Сумма,
| ПоступлениеДопРасходовИмпортТовары.Ссылка.ВалютаДокумента,
| ПоступлениеДопРасходовИмпортТовары.Ссылка.КурсДокумента,
| ПоступлениеДопРасходовИмпортТовары.Ссылка.Контрагент,
| ПоступлениеДопРасходовИмпортТовары.Ссылка.ДоговорВзаиморасчетов
| ИЗ
| Документ.ПоступлениеДопРасходовИмпорт.Товары КАК ПоступлениеДопРасходовИмпортТовары
| ГДЕ
| ПоступлениеДопРасходовИмпортТовары.Ссылка.ДокументОснование = &Основание
| И ПоступлениеДопРасходовИмпортТовары.Ссылка.Проведен
| И ПоступлениеДопРасходовИмпортТовары.Номенклатура В(&МассивНоменклатуры)) КАК ПоступлениеДопРасходов
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ЗаказПоставщикуОтгруженныйТовары.Номенклатура КАК Номенклатура,
| СУММА(ЗаказПоставщикуОтгруженныйТовары.Количество) КАК Количество
| ИЗ
| Документ.ЗаказПоставщикуОтгруженный.Товары КАК ЗаказПоставщикуОтгруженныйТовары
| ГДЕ
| ЗаказПоставщикуОтгруженныйТовары.Ссылка = &Основание
|
| СГРУППИРОВАТЬ ПО
| ЗаказПоставщикуОтгруженныйТовары.Номенклатура) КАК ЗаказПоставщикуОтгруженный
| ПО ПоступлениеДопРасходов.Номенклатура = ЗаказПоставщикуОтгруженный.Номенклатура
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеДопРасходов.Содержание,
| ПоступлениеДопРасходов.Номенклатура,
| ПоступлениеДопРасходов.Валюта,
| ПоступлениеДопРасходов.Курс,
| ПоступлениеДопРасходов.Контрагент,
| ПоступлениеДопРасходов.ДоговорВзаиморасчетов";
Запрос.УстановитьПараметр("Основание", ПоступлениеТоваровИмпорт.ДокументОснование);
Запрос.УстановитьПараметр("МассивНоменклатуры", ПоступлениеТоваровИмпорт.Товары.ВыгрузитьКолонку("Номенклатура"));
ТЗ_Товары = ПоступлениеТоваровИмпорт.Товары.Выгрузить();
ТЗ_Товары.Свернуть("Номенклатура", "Количество");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрокаТЧ = ДопРасходыИмпортДокументы.Добавить();
НоваяСтрокаТЧ.Содержание = Выборка.Содержание;
НоваяСтрокаТЧ.Контрагент = Выборка.Контрагент;
НоваяСтрокаТЧ.Договор = Выборка.Договор;
НоваяСтрокаТЧ.Валюта = Выборка.Валюта;
НоваяСтрокаТЧ.Курс = Выборка.Курс;
НоваяСтрокаТЧ.Часть = "ПОСЛЕ";
нс = ТЗ_Товары.Найти(Выборка.Номенклатура, "Номенклатура");
КолТовар = нс.Количество;
Если КолТовар = Выборка.Количество Тогда
НоваяСтрокаТЧ.Сумма = Выборка.Сумма;
Иначе
НоваяСтрокаТЧ.Сумма = Окр(Выборка.Сумма / Выборка.Количество * КолТовар, 2, 1);
КонецЕсли;
НоваяСтрокаТЧ.СуммаРуб = НоваяСтрокаТЧ.Сумма * НоваяСтрокаТЧ.Курс;
НоваяСтрокаТЧ.СуммаУпр = _обПересчет(НоваяСтрокаТЧ.Сумма, НоваяСтрокаТЧ.Валюта, НоваяСтрокаТЧ.Курс, Константы.ВалютаУправленческогоУчетаКомпании.Получить(), ?(ЗначениеЗаполнено(ПоступлениеТоваровИмпорт.Дата), ПоступлениеТоваровИмпорт.Дата, ТекущаяДата()));
КонецЦикла;
ДопРасходыИмпортДокументы.Свернуть("Содержание,Контрагент,Договор,Валюта,Курс,Часть", "Сумма,СуммаРуб,СуммаУпр");
ДопРасходыИмпортДокументы.Сортировать("Содержание,Часть");
ПоказатьПо теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(10) вы бы выяснили сперва этот вопрос, а так же убедитесь в том, что все в порядке с железом, на котором работает SQL-сервер
Если все же база обслуживается, железо - адекватное, то проведите замеры каждого из запросов, чтобы понять, в каком именно месте нужно выполнять оптимизации.
Если все же база обслуживается, железо - адекватное, то проведите замеры каждого из запросов, чтобы понять, в каком именно месте нужно выполнять оптимизации.
(1)
Передай ПоступлениеТоваровИмпорт параметром в запрос и посчитай все внутри.
...
Запрос.УстановитьПараметр("МассивНоменклатуры", ПоступлениеТоваровИмпорт.Товары.ВыгрузитьКолонку("Номенклатура"));
ТЗ_Товары = ПоступлениеТоваровИмпорт.Товары.Выгрузить();
ТЗ_Товары.Свернуть("Номенклатура", "Количество");
...
нс = ТЗ_Товары.Найти(Выборка.Номенклатура, "Номенклатура");
...
Передай ПоступлениеТоваровИмпорт параметром в запрос и посчитай все внутри.
(1)
1.Надо сделать явное соединение с таблицей Документ.ГТДИмпорт и из нее получать данные Контрагент, Договор и т.д
2. Также сделать для Документ.ПоступлениеДопРасходовИмпорт
3. Не понятно зачем 3 раза выбирать одно и тоже и добавлять только колонку, можно получать данные из временной таблице и потому уже добавлять колонку
4. Соединение с вложенным запросом лучше убрать
1.Надо сделать явное соединение с таблицей Документ.ГТДИмпорт и из нее получать данные Контрагент, Договор и т.д
2. Также сделать для Документ.ПоступлениеДопРасходовИмпорт
3. Не понятно зачем 3 раза выбирать одно и тоже и добавлять только колонку, можно получать данные из временной таблице и потому уже добавлять колонку
4. Соединение с вложенным запросом лучше убрать
(1) Мне вот не нравятся фрагменты запроса ... В(&МассивНоменклатуры).
Загрузить номенклатуры в ВТ и использовать внутреннее соединение.
Но в ВТ нужно загрузить уникальные значения номенклатур, без дублей.
Да и в вашем варианте тоже желательно это иметь в виду - в &МассивНоменклатуры установить уникальные значения.
Загрузить номенклатуры в ВТ и использовать внутреннее соединение.
Но в ВТ нужно загрузить уникальные значения номенклатур, без дублей.
Да и в вашем варианте тоже желательно это иметь в виду - в &МассивНоменклатуры установить уникальные значения.
к ТС:
1) 90 сек на запрос или на весь код?
2) Условия джойна в запросах прописать от большего к меньшему и от индексированного к не индексированному. Т.е. сначала .Проведен, Внутреннее соединение с ВТ_Номенклатура, потом по ссылке документов, условно в зависимости какая выборка меньше
3) Составные индексы тоже используй в последовательности от первого до последнего
1) 90 сек на запрос или на весь код?
2) Условия джойна в запросах прописать от большего к меньшему и от индексированного к не индексированному. Т.е. сначала .Проведен, Внутреннее соединение с ВТ_Номенклатура, потом по ссылке документов, условно в зависимости какая выборка меньше
3) Составные индексы тоже используй в последовательности от первого до последнего
(17) Давай таки определим основная нагрузка в запросе или далее в цикле. может там доки с 100500 строк номенклатуры и мы гоняем там поиск по номенклатуре без индекса те же 100500 раз, здесь количество важно.
и мы ничего не знаем об _обПересчет, может там собака зарыта.
и мы ничего не знаем об _обПересчет, может там собака зарыта.
(19) Если мы _обПересчет не знаем и обязаны его выполнить, давай думать как его вес узнать при исполнении кода...
Вставь Сообщить("Текущее время шага 1 = " + ТекущаяДата());
И сообщить("Количество строк моей таблицы: " + Таблица.Количество());
во все осмысленные места в коде и попроси выслать тебе лог сообщений - станет много легче понимать что там происходит.
Вставь Сообщить("Текущее время шага 1 = " + ТекущаяДата());
И сообщить("Количество строк моей таблицы: " + Таблица.Количество());
во все осмысленные места в коде и попроси выслать тебе лог сообщений - станет много легче понимать что там происходит.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот