Главная Новые темы Список тем Задать вопрос Поиск  

Форум "1с" (архив)


"Наш" Си для бухгалтеров


 #0  Кошастый © 23.06.03 15:26:39 - 18.01.05 10:52:31

1С - Оптимизация запросов по быстродействию



Кто-то когда-то занимался этим делом? Может быть есть ссылки, или любые наводки на подобную информацию? Запрос - на выборку информации о движении регистра остатков, подобного типа:

   ТекстЗапроса = "
    |Период с ДатаС по ДатаПо;
    |Кво   = Регистр.Резерв.Кво;
    |Товар = Регистр.Резерв.Товар;
    |Счет = Регистр.Резерв.Счет;
    |Условие(Товар = Тов);        
    |Группировка Счет;
    |Функция КонКол  = КонОст(Кво);    
    |Функция ОплКол  = КонОст(Кво) когда (Регистр.Взаиморасчеты.Остаток(Счет.кли­ент, Счет, ""СуммаОсн"") > 0);
    |";


Буду благодарен за советы ;) Цитата

 #1 сишник 23.06.03 17:05:54

дак запрос и так прост,   ИМХО,  оптимизировать ничего не получиться - и так классический СКЛ.
 #2  Кошастый © 24.06.03 09:19:46

Дык, это и так понятно... просто в 1С-е много тонкостей, которые бывают совсем неочевидны, но до жути влияют на скорость выполнения. Вот я и думаю, может кто подскажет..
 #3 deep © 02.07.03 12:04:15

> Кошастый © 24.06.2003 10:19:00
  ИМХО,  реально оптимизировать можно в там, где есть много агрегатных функций и подзапросов.  
 #4  Кошастый © 02.07.03 16:17:44

Дипыч, я просто протащился от лингвистической конструкции "в там" ;)))
 #5 deep © 02.07.03 18:10:39

это я по ходу соптимизировал предложение(изначально оно должно было быть подлиннее), а бекспейс забыл пару раз жать  
 #6 Леший © 04.08.03 20:11:54

Оптимизацией приходится заниматься очень часто: сначала пишу отчет под конкретную конфигурацию (а встречаются очень разные) чтоб реализовать фунциональность отчета (по ТЗ), а потом оптимизирую по быстродействию. Но со временем стал писать отчеты, которые редко можно оптимизировать по быстродействию, разве только по функциональности (опыт кое-какой уже есть).

По тексту запроса:
Как я понял, это несколько измененный текст запроса из АБТ-шки (отчет "Текущие резервы").
Видимо, запрос призван вывести счета на дату (период тут не уместен, так как начальные остатки нигде не используются) по которым зарезервирован товар (указанный в реквизите "Тов") для контрагентов, перед которыми числится долг по выписанному счету на дату отчета(то бишь если по данному оплаченному счету произошла отгрузка товара на дату отчета, то переменная "ОплКол" должна быть равна нулю). Если задача именно такая, то запрос построен не верно. Выражение: "Регистр.Взаиморасчеты.Остаток(Сче­т.кли­ент, Счет, СуммаОсн"") > 0" проверяет остаток по регистру "Взаиморасчеты" на точку актуальности (ТА), а дата "ДатаПо" может быть почти произвольной ("ДатаПо" не может быть больше ТА). Это значит, что если отчет формируется на 01.08.2003г., а ТА равна сегодня, то в переменную "ОплКол" попадут значения зарезервированного товара по счетам которые оплачены не по состоянию на 01.08.2003, а на сегодняшний день. Кстати, при условии "Товар=Тов"  выполненный зпрос будет пустым, если реквизит (поле ввода, список ввода) не заполнен. Чаще используется оператор "в" - "Условие(Товар в Тов)", в этом случае если реквизит "Тов" пустой, то запрос выполнится по всем товарам.

Чтоб решить задачу придется выполнять два запроса. Реализовать это можно так (результаты запросов записываются в таблицу значений):

Процедура Сформировать()
    Табл=СоздатьОбъект("ТаблицаЗначени­й");
    Табл.НоваяКолонка("Счет",&quo­t;Документ");
    Табл.НоваяКолонка("Клиент",&q­uot;Справочник.Клиенты");
    Табл.НоваяКолонка("КонКол",19­,5);
    Табл.НоваяКолонка("ОплКол",19­,5);
    Запр1=СоздатьОбъект("Запрос")­;
    Запр2=СоздатьОбъект("Запрос")­;
    ТЗРез="//{{ЗАПРОС(ОтчетПоРезервамН­ов)
    |Период с ДатаПо по ДатаПо;
    |Кво = Регистр.Резерв.Кво;
    |Товар = Регистр.Резерв.ТМЦ;
    |Счет = Регистр.Резерв.Счет;
    |Функция КонКол = КонОст(Кво);
    |Группировка Счет;
    |Условие(Товар в Тов);
    |"//}}ЗАПРОС
    ;
    
    ТЗВЗ="//{{ЗАПРОС(ОтчетПоВЗ)
    |Период с ДатаПо по ДатаПо;
    |КонтрВР = Регистр.Взаиморасчеты.Клиент;
    |Заказ = Регистр.Взаиморасчеты.Заказ;
    |Долг = Регистр.Взаиморасчеты.СуммаОсн;
    |Функция ДолгКонОст = КонОст(Долг);
    |Группировка КонтрВР без групп;
    |Группировка Заказ;
    |Условие(Долг > 0);
    |"//}}ЗАПРОС
    ;
        
    Если Запр1.Выполнить(ТЗРез)=0 Тогда
        Предупреждение("Запрос №1 не выполнен!",15);
    КонецЕсли;
    Если Запр2.Выполнить(ТЗВЗ)=0 Тогда
        Предупреждение("Запрос №2 не выполнен!",15);
    КонецЕсли;
    
    Пока Запр1.Группировка("Счет")=1 Цикл
        Табл.НоваяСтрока();
        Табл.Счет=Запр1.Счет;
        Табл.Клиент=Запр1.Счет.Клиент;
        Табл.КонКол=Запр1.КонКол;
        Табл.ОплКол=0;
        Если Запр2.Получить(Запр1.Счет.Клиент,Запр1.­Счет)=1 Тогда
            Табл.ОплКол=Запр1.КонКол;
        Иначе
            Предупреждение("Обратитесь к разработчику отчета");
        КонецЕсли;
    КонецЦикла;
    Табл.ВыбратьСтроку();// просмотр результатов запроса
КонецПроцедуры


Такая процедура выполнятся, несомненно дольше, чем приведенный текст запроса.

Если задача состоит в ином, например, в формировании запроса исключительно на ТА, тогда действительно запрос можно оптимизировать по быстродействию:

Процедура Сформировать()
    Табл=СоздатьОбъект("ТаблицаЗначени­й");
    Запр1=СоздатьОбъект("Запрос")­;
    ТЗ = "//{{ЗАПРОС(ОтчетПоРезервам)
    |Кво   = Регистр.Резерв.Кво;
    |Товар = Регистр.Резерв.ТМЦ;
    |Счет = Регистр.Резерв.Счет;
    |Условие(Товар в Тов);        
    |Группировка Счет;
    |Функция КонКол  = КонОст(Кво);    
    |Функция ОплКол  = КонОст(Кво) когда (Регистр.Взаиморасчеты.Остаток(Счет.Кли­ент, Счет, ""СуммаОсн"")>0)­;
    |"//}}ЗАПРОС
    ;
    Если Запр1.Выполнить(ТЗ)=0 Тогда
        Предупреждение("Запрос не выполнен!",15);
    КонецЕсли;
    Запр1.Выгрузить(Табл);
    Табл.ВыбратьСтроку(); // просмотр результатов запроса
КонецПроцедуры


Запрос работает только с актуальными данными, а не обрабатывает заданный период (как в исходном тексте запроса).
 #7  Раби Ламерович 20.02.04 15:47:14

Господа хорошие, научите где бы бедному раввину найти достойный источник или пособие по запросам в 1С?

Мир вашим винтам и мамам!
 #8 Е-Моё имя © 20.02.04 15:53:12

>
>Мир вашим винтам и мамам!

а болтам?
 #9 Mim 18.01.05 10:52:31

вот это посмотрите




  • Тема находится в архиве

    Написать ответ

    Имя: Регистрация HTML?
    smiles смайлики
    Потом перейти в:    
    паутина



      ©  webest.net, 2002-2007  

    top.mail.ru
    » Бесплатный счетчик посещений
    » Рейтинг сайтов