Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Условие в обычном (не прямом) запросе - Регистр..ТекущийДокумент в СписокЗначений не работ

v7: Условие в обычном (не прямом) запросе - Регистр..ТекущийДокумент в СписокЗначений не работ
Я
   AMKahm
 
17.04.19 - 11:57
Добрый день.
Есть запрос:

...
ТекущийДокумент = Регистр.Продажи.ТекущийДокумент;
...
Условие ((ТекущийДокумент в СписокФильтрТекущийДокумент));
...

Если в СписокФильтрТекущийДокумент один документ то все ок работает - профайлером ловлю запрос:

exec sp_cursoropen @p1 ... from ... join #RGTEMP0 WITH (NOLOCK) on RA2351.SP2344 =#RGTEMP0.VAL
where ... and ((RA2351.IDDOC ='' 2CYME   '')))
group by ...

проверка на ТекущийДокумент в where - RA2351.IDDOC ='' 2CYME   ''

Если в СписокФильтрТекущийДокумент более одного документа то не работает!!! из профайлера получаю:

exec sp_cursoropen @p1 ... from ... join #RGTEMP0 WITH (NOLOCK) on RA2351.SP2344 =#RGTEMP0.VAL join #RGTEMP1 WITH (NOLOCK) on RA2351.IDDOC =#RGTEMP1.VAL
where ...
group by ...

проверка на ТекущийДокумент join #RGTEMP1, ок, только вот в #RGTEMP1.VAL записывается вот это:

exec sp_executesql N'IF NOT EXISTS( SELECT * FROM #RGTEMP1 WHERE VAL=@P1 )
    INSERT #RGTEMP1 VALUES( @P2, 2 )
',N'@P1 varchar(13),@P2 varchar(13)',' 745 2CYME   ',' 745 2CYME   '

exec sp_executesql N'IF NOT EXISTS( SELECT * FROM #RGTEMP1 WHERE VAL=@P1 )
    INSERT #RGTEMP1 VALUES( @P2, 2 )
',N'@P1 varchar(13),@P2 varchar(13)',' 745 2COZ9   ',' 745 2COZ9   '

тоесть вместо ' 2CYME   ' там ' 745 2CYME   ', 745 = 9221, типизация? ну ок, только вот RA2351.IDDOC это Char(9)

никак не могу понять что надо сделать чтоб заработало...
 
 
   Ёпрст
 
1 - 17.04.19 - 12:11
ну аоказывай, чего ты в СписокФильтрТекущийДокумент пихаешь и как.
   AMKahm
 
2 - 17.04.19 - 12:15
...
СписокФильтрТекущийДокумент = СоздатьОбъект("СписокЗначений");
...
СписокФильтрТекущийДокумент.ДобавитьЗначение(тДок);
СписокФильтрТекущийДокумент.ДобавитьЗначение(тДок1);
...

тДок и тДок1 - это реквизит диалога на форме типа Документ.9221
   AMKahm
 
3 - 17.04.19 - 12:28
создал конструктором отчет:
ВыбТекущийДокумент и ВыбТекущийДокумент1 на форме
    ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент); 
    //ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент1);

работает как и 
    //ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент); 

    ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент1);
а вот
    //ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент); 

    ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент1);
уже нет

Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    ВыбТекущийДокументСписок = СоздатьОбъект("СписокЗначений");   
    ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент); 
    ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент1);
    
    //Создание объекта типа Запрос

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)

    |Период с ВыбНачПериода по ВыбКонПериода;
    |Обрабатывать НеПомеченныеНаУдаление;
    |ТекущийДокумент = Регистр.Продажи.ТекущийДокумент;
    |Номенклатура = Регистр.Продажи.Номенклатура;
    |Себестоимость = Регистр.Продажи.Себестоимость;
    |Функция СебестоимостьСумма = Сумма(Себестоимость);
    |Группировка Номенклатура без групп;
    |Условие(ТекущийДокумент в ВыбТекущийДокументСписок);
    |"//}}ЗАПРОС

    ;
    // Если ошибка в запросе, то выход из процедуры

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса

    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"

    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        // Заполнение полей Номенклатура

        Таб.ВывестиСекцию("Номенклатура");
    КонецЦикла;
    // Заполнение полей "Итого"

    Таб.ВывестиСекцию("Итого");
    // Вывод заполненной формы

    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры
   AMKahm
 
4 - 17.04.19 - 12:28
копипастил, правильно так:
а вот
    ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент); 
    ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент1);
уже нет
   azernot
 
5 - 17.04.19 - 12:35
Попробуй
СписокФильтрТекущийДокумент.ДобавитьЗначение(тДок.ТекущийДокумент()); 
СписокФильтрТекущийДокумент.ДобавитьЗначение(тДок1.ТекущийДокумент());
   MadDAD
 
6 - 17.04.19 - 12:37
(2) А если так?

СписокФильтрТекущийДокумент.ДобавитьЗначение(тДок.ТекущийДокумент();
   AMKahm
 
7 - 17.04.19 - 12:38
пробую...
... не, не работает
   MadDAD
 
8 - 17.04.19 - 12:41
Регистр.Продажи.ТекущийДокумент не типизирован?
   Euguln
 
9 - 17.04.19 - 12:43
Переделай на номера.
   AMKahm
 
10 - 17.04.19 - 12:45
(8) ну да, он Char(9), это ж платформа контролирует http://www.script-coding.com/v77tables.html#3.4.2.1.
"IDDOC - ID документа, тип «строка», по этому полю осуществляется связь с таблицей документов («1SJOURN» или «_1SJOURN» для SQL). Тип - Char(9)."

(9) думал, но номера могут совпасть с другими типами документов, не прокатит
   Ёпрст
 
11 - 17.04.19 - 12:57
Запрос.ВключитьSQL(0) воткни, забудь о скорости, но работать будет
   AMKahm
 
12 - 17.04.19 - 13:06
(11) работает....!? спасибо
тот простенький запрос тестовый без этой опции отрабатывал менее секунды... с ней минуты 3!!!
боюсь что там где это нужно изначально на пол дня повиснет, ну и ладно
   AMKahm
 
13 - 17.04.19 - 13:23
да, тестил все это на 25 и 27 релизах. может на других глюка этого нет?
падение скорости оказалось не таким большим на основном запросе... всегото минуты 4 отрабатывал, что ок вполне. (раньше секунд 40)
   AMKahm
 
14 - 17.04.19 - 13:26
думаю что с vk_hook можно поменять на свою временную таблицу, заполненную верными значениями

но vk_hook работает только в режиме совместимости 80 (2000)
нет ли где версии vk_hook для 90+
   AMKahm
 
15 - 17.04.19 - 13:32
все, нашел версию 2.0.0.31
   Ёпрст
 
16 - 17.04.19 - 14:42
Проще переписать на прямой запрос
   Ёпрст
 
17 - 17.04.19 - 14:43
Можешь еще попробовать так, через Список.Принадлежит = 1 в тесте запроса (не помню синтаксис какой там у списка значения)
   AMKahm
 
18 - 17.04.19 - 15:02
(16) ну да, в этом отчете все остальное уже на прямых
(17) (СписокФильтрТекущийДокумент.Принадлежит(ТекущийДокумент) = 1) работает отлично... в профайлере это конечно выглядит так себе... но работает много быстрей ВключитьSQL(0)
   Ёпрст
 
19 - 17.04.19 - 15:11
(18) попробуй еще массив использовать, заместо списка значения..Единственное, размерность нужно задавать :(
   Злопчинский
 
20 - 17.04.19 - 16:11
(18) через СЗ.НайтиЗначение(ТвойДокумент)<>0
,eltn tot ,scnhtt
   AMKahm
 
21 - 17.04.19 - 16:40
(20) спасиб


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.