Имя: Пароль:
1C
1C 7.7
v7: Условие в обычном (не прямом) запросе - Регистр..ТекущийДокумент в СписокЗначений не работ
,
0 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
ну аоказывай, чего ты в СписокФильтрТекущийДокумент пихаешь и как.
2 AMKahm
 
17.04.19
12:15
...
СписокФильтрТекущийДокумент = СоздатьОбъект("СписокЗначений");
...
СписокФильтрТекущийДокумент.ДобавитьЗначение(тДок);
СписокФильтрТекущийДокумент.ДобавитьЗначение(тДок1);
...

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

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

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

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        // Заполнение полей Номенклатура
        Таб.ВывестиСекцию("Номенклатура");
    КонецЦикла;
    // Заполнение полей "Итого"
    Таб.ВывестиСекцию("Итого");
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры
4 AMKahm
 
17.04.19
12:28
копипастил, правильно так:
а вот
    ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент);
    ВыбТекущийДокументСписок.ДобавитьЗначение(ВыбТекущийДокумент1);
уже нет
5 azernot
 
17.04.19
12:35
Попробуй
СписокФильтрТекущийДокумент.ДобавитьЗначение(тДок.ТекущийДокумент());
СписокФильтрТекущийДокумент.ДобавитьЗначение(тДок1.ТекущийДокумент());
6 MadDAD
 
17.04.19
12:37
(2) А если так?

СписокФильтрТекущийДокумент.ДобавитьЗначение(тДок.ТекущийДокумент();
7 AMKahm
 
17.04.19
12:38
пробую...
... не, не работает
8 MadDAD
 
17.04.19
12:41
Регистр.Продажи.ТекущийДокумент не типизирован?
9 Euguln
 
17.04.19
12:43
Переделай на номера.
10 AMKahm
 
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) воткни, забудь о скорости, но работать будет
12 AMKahm
 
17.04.19
13:06
(11) работает....!? спасибо
тот простенький запрос тестовый без этой опции отрабатывал менее секунды... с ней минуты 3!!!
боюсь что там где это нужно изначально на пол дня повиснет, ну и ладно
13 AMKahm
 
17.04.19
13:23
да, тестил все это на 25 и 27 релизах. может на других глюка этого нет?
падение скорости оказалось не таким большим на основном запросе... всегото минуты 4 отрабатывал, что ок вполне. (раньше секунд 40)
14 AMKahm
 
17.04.19
13:26
думаю что с vk_hook можно поменять на свою временную таблицу, заполненную верными значениями

но vk_hook работает только в режиме совместимости 80 (2000)
нет ли где версии vk_hook для 90+
15 AMKahm
 
17.04.19
13:32
все, нашел версию 2.0.0.31
16 Ёпрст
 
17.04.19
14:42
Проще переписать на прямой запрос
17 Ёпрст
 
17.04.19
14:43
Можешь еще попробовать так, через Список.Принадлежит = 1 в тесте запроса (не помню синтаксис какой там у списка значения)
18 AMKahm
 
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
21 AMKahm
 
17.04.19
16:40
(20) спасиб
Независимо от того, куда вы едете — это в гору и против ветра!