Имя: Пароль:
1C
1С v8
Время выполнения запроса
0 MyReflection
 
10.02.16
08:26
Получается интересный момент.
Для выборки перебором четырех позиций для цикла

    Пока ЗапросТабличнойЧасти.EOF() = 0 Цикл
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
                |ХозрасчетныйОстатки.Субконто2.Код КАК СкладКод,
                |ХозрасчетныйОстатки.Субконто2.Наименование КАК Склад,
                |ХозрасчетныйОстатки.Субконто1.Код КАК НоменклатураКод,
                |ХозрасчетныйОстатки.Субконто1.Наименование КАК Номенклатура,
                |ХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоОстаток
                |ИЗ
                |РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки
                |ГДЕ
                |ХозрасчетныйОстатки.Субконто1.Код = &НомеклатураКод
                |И ХозрасчетныйОстатки.Субконто2.Код = &СкладКод";
        
        Запрос.УстановитьПараметр("НомеклатураКод", Формат(ЗапросТабличнойЧасти.Fields("1s").value, "ЧГ=0"));
        Запрос.УстановитьПараметр("СкладКод", КодСкладаОтправителя);
        РезультатЗапроса = Запрос.Выполнить();
        ВыборкаНом = РезультатЗапроса.Выбрать();

Время выполнения в четыре раза больше чем для того же цикла но
    Пока ЗапросТабличнойЧасти.EOF() = 0 Цикл

        Отбор = Новый Структура;
        Отбор.Вставить("Субконто2", Справочники.склады.НайтиПоКоду(КодСкладаОтправителя).Ссылка);
        Отбор.Вставить("Субконто1", Справочники.Номенклатура.НайтиПоКоду(Формат(ЗапросТабличнойЧасти.Fields("1s").value, "ЧГ=0")).Ссылка);

        КоличествоОстатокДт = "КоличествоОстатокДт";
        Результат = РегистрыБухгалтерии.Хозрасчетный.Остатки(ТекущаяДата(),ВидыСубконто,Отбор);

Не понятно почему прямой запрос занимает больше времени чем тот же запрос но через существующую функцию..
1 Cyberhawk
 
10.02.16
08:46
Остатки в первом случае не на текущую дату, а на конец времен (31.12.3999)
2 ДенисЧ
 
10.02.16
08:46
Запрос в цикле? Расстрелять...
3 neckto
 
10.02.16
08:47
(0) Время разное т.к. запросы разные
4 Cyberhawk
 
10.02.16
08:47
+(1) и условия нужно пихать в параметры виртуальной таблицы, а не в ГДЕ
5 Cyberhawk
 
10.02.16
08:48
Ну и Субконто1.Код = &НомеклатураКод это не то же самое, что во втором случае
6 Cyberhawk
 
10.02.16
08:48
Короче КГ/АМ
7 Ma3eIIa
 
10.02.16
08:56
(0) делаешь внешнию таблицу по своим данных. находишь по коду номенклатуру склад, индексируешь эти поля, помещаеш во временную. в параметры виртуальной таблицы остатков делаешь условие на (Субконто1,Субконто2) В (ВЫБРАТЬ ВТ.Склад,ВТ.Номенклатура ИЗ ВнешнияТаблица КАК ВТ).
8 Ma3eIIa
 
10.02.16
09:00
(0) в первом случае. у тебе отбор накладывается уже после прочтение остатков. то есть ты все получил. а потом отобрал. нужно задавать параметры как у тебя во втором варианте. по этому быстрее. и не используй .Код, передавай уже ссылку на элемент. ну и пробуй (7)
9 xxTANATORxx
 
10.02.16
09:29
(7)а зачем внешнюю ТЗ???, сразу времянку делать
10 Ma3eIIa
 
10.02.16
09:35
(9) я про параметр внешния тз, ее выбираем. по ней ищем склады и номенклатуру. а уже дальше эту таблицу используем в снятие остатков
11 vde69
 
10.02.16
09:39
(2) судя по "EOF()" вполне имеет право на жизнь
12 Dmitrii
 
гуру
10.02.16
09:46
(0) Чтобы считать оба варианта идентичными, запрос должен быть вроде этого:

ВЫБРАТЬ
  Номенклатура.Ссылка КАК Номенклатура,
  Склады.Ссылка КАК Склад,
  Номенклатура.Код КАК НоменклатураКод,
  Склады.Код КАК СкладКод,
  Номенклатура.Наименование КАК НоменклатураНаименование,
  Склады.Наименование КАК СкладНаименование
ПОМЕСТИТЬ НоменклатураСклад
ИЗ
   Справочник.Номенклатура КАК Номенклатура
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
      ПО (Номенклатура.Код = &НоменклатураКод
                И Склады.Код = &СкладКод)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
  НоменклатураСклад.СкладКод КАК СкладКод,
  НоменклатураСклад.СкладНаименование КАК Склад,
  НоменклатураСклад.НоменклатураКод КАК НоменклатураКод,
  НоменклатураСклад.НоменклатураНаименование КАК Номенклатура,
  ХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
   РегистрБухгалтерии.Хозрасчетный.Остатки(&ТекущаяДата, , &ВидыСубконто, (Субконто1, Субконто2) В
       (ВЫБРАТЬ
          НоменклатураСклад.Номенклатура,
          НоменклатураСклад.Склад
        ИЗ
          НоменклатураСклад КАК НоменклатураСклад)) КАК ХозрасчетныйОстатки
ВНУТРЕННЕЕ СОЕДИНЕНИЕ НоменклатураСклад КАК НоменклатураСклад
       ПО ХозрасчетныйОстатки.Субконто1 = НоменклатураСклад.Номенклатура
         И ХозрасчетныйОстатки.Субконто2 = НоменклатураСклад.Склад
13 MyReflection
 
11.02.16
06:55
Всем огромное спасибо за разъяснение. Особая благодарность МаЗеПе и Дмитрию..
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.