Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 фев 2026, 06:05

Долго открывает документ, неоптимальный запрос

Автор dinariskra, 22 янв 2026, 15:41

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

dinariskra

Как можно правильно переписать запрос чтобы было открытие документа в разы быстрее по скорости?

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

LexaK

эээ,в инете полно статей как правильно и оптимально писать запросы в 1С
почитайте эти статьи, узнаете много интересного и полезного.

основные замечания
1.собирать данные нужно не из первичных документов а из Регистров сведений и накоплений
2.не  допускать вложенность выборок (без  необходимости)
выбрать ... из (выбрать ... из (выбрать ...
3.внимательно используйте точку для доступа к реквизитам объектов
4.запрос можно \нужно построиьь так, что загружать его результат в ТЧ такой командой
ВашаТЧ.Загрузить(Запрос.выполнить().выгрузить());
всего одна команда, без всяких циклов

для убыстрения отладки запроса, рекомендуется использовать Консоль запросов
как целиком так и частями, в консоли есть замер времени выполнения запроса
если помогло нажмите: Спасибо!

Теги:

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

Рейтинг@Mail.ru

Поиск