Имя: Пароль:
1C
1C 7.7
v7: Долго выполняется запрос
,
0 r1000
 
23.10.13
12:01
Перем Запрос, ТекстЗапроса;
    ПустойНаряд = ПолучитьПустоеЗначение("Документ.ВыпускПродукции");
    ДокЗадание = "";

    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |ТекущийДокумент = Документ.Задание.ТекущийДокумент;
    |Наряд = Документ.Задание.Наряд;
    |Исполнитель = Документ.Задание.Исполнитель;
    |Группировка ТекущийДокумент;    
    |Условие(Наряд = ПустойНаряд);
    |Условие(Исполнитель = Сотрудник);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Пока Запрос.Группировка() = 1 Цикл
        ДокЗадание = Запрос.ТекущийДокумент;
        Прервать;
    КонецЦикла;


Вот такой код использую, чтобы найти документ по 2ум условиям. Сотрудник - это элемент справочника, который передается в эту функцию.

Проблема в том, что когда эта функция поиска выполняется, 1ка начинает ацки перемалывать документ за весь период базы.
Гуру, как оптимизировать. Мне всего лишь нужно найти документ по 2ум условиям.
Спасибо.
1 mikecool
 
23.10.13
12:02
указать период выборки
переделать на прямой запрос
2 dk
 
23.10.13
12:03
Задать период не предлагать?
3 pofigos
 
23.10.13
12:04
(0) Период выборки документов поставить.
4 r1000
 
23.10.13
12:05
(1)Но это значит, что если реально док в другом периоде, она его не найдет ?
5 varelchik
 
23.10.13
12:28
(4) А что ты хотел?
Самое елементарное:
Пустить в цикле с уменьшением даты.
и уменьшать до тех пор пока не наткнешься на своего сотрудника.
6 varelchik
 
23.10.13
12:36
Что-то типа:
    НачДата=ТекущаяДата();
    Стоп=0;
    Запрос = СоздатьОбъект("Запрос");
    ДокЗадание="";
    КонДата=Дата(1980,1,1);
    Пока Стоп=0 Цикл
        ТекстЗапроса =
        "//{{ЗАПРОС(Сформировать)
        |Период с НачДата по НачДата        
        |ТекущийДокумент = Документ.Задание.ТекущийДокумент;
        |Наряд = Документ.Задание.Наряд;
        |Исполнитель = Документ.Задание.Исполнитель;
        |Группировка ТекущийДокумент;    
        |Условие(Наряд = ПустойНаряд);
        |Условие(Исполнитель = Сотрудник);
        |"//}}ЗАПРОС
        
        ;
        // Если ошибка в запросе, то выход из процедуры
        
        Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
            Прервать;;
        КонецЕсли;
        
        Пока Запрос.Группировка() = 1 Цикл
            ДокЗадание = Запрос.ТекущийДокумент;
            Стоп=1;
            Прервать;
        КонецЦикла;
        НачДата=НачДата-1;
        Если НачДата<КонДата Тогда
            Стоп=1;
        КонецЕсли;
    КонецЦикла;
    Если ПустоеЗначение(ДокЗадание)=0 Тогда
        Сообщить(ДокЗадание);
    Иначе
        Сообщить("Ничего не найдено");
    КонецЕсли;
7 sapphire
 
23.10.13
12:37
DOCPRINT.ert что говорит?
8 pofigos
 
23.10.13
12:39
(6) Запрос в цикле??? жестоко однако.
9 varelchik
 
23.10.13
12:46
ну так по крайней мере это не запрос ко всей базе.
Все ж меньше времени займет.
10 varelchik
 
23.10.13
12:47
(8) Он же не знает в какой дате искать.
11 varelchik
 
23.10.13
12:52
Или так:
    Текст="
    |select
    |j.iddoc [Док $Документ],
    |j.iddocdef Док_вид
    |from $Документ.Задание Шапка (nolock)
    |inner join _1sjourn j (nolock) on j.iddoc=Шапка.iddoc
    |WHERE
    |$Шапка.Сотрудник=:ВыбСотр
    |and
    |$Шапка.Наряд=$ПустойИД
    |";
    Запрос=СоздатьОбъект("ODBCRecordSet");
    Запрос.УстановитьТекстовыйПараметр("ВыбСотр",Сотрудник);
    ТЗ=Запрос.ВыполнитьИнструкцию(Текст);
    ТЗ.ВыбратьСтроку();
12 КонецЦикла
 
23.10.13
12:54
Графу отбора сделать не предлагать?
13 VladZ
 
23.10.13
12:57
Я бы для начала графу отбора попробовал. Потом уже прямые запросы.
Закон Брукера: Даже маленькая практика стоит большой теории.