Имя: Пароль:
1C
1C 7.7
v7: Отбор по дате основания 1с 77 SQL
,
0 Franchiser
 
гуру
16.08.18
22:29
Есть запрос 1с 7.7 генерируемый обработкой settatrs (допиленной).
В запросе устанавливается фильтр на дату документа основания, но запрос не фильтрует данные, т.е. Неверно интерпретируется в SQL: вместо условия на дату основания ставится условие на дату документы. Есть ли варианты решения проблемы с помощью патча или как то еще?
1 NSSerg
 
16.08.18
22:34
(0) нет такого глюка.
Приведи текст запроса который по твоему мнению работает неверно.
напиши в коде сообщить(текстзапроса);
2 Franchiser
 
гуру
16.08.18
22:40
Обрабатывать Все;
Период с гНачДата по гКонДата;
ОбрабатыватьДокументы Все;
ПеремОбъект = Документ.РасходнаяНакладная.ТекущийДокумент;
Группировка ПеремОбъект;              
Без Итогов;
Перем1 = Документ.РасходнаяНакладная.ДокументОснование.ДатаДок;
Условие (Перем1 =    гУсл1);
3 NSSerg
 
16.08.18
22:44
(2) согласно этому запросу, должны обрабатываться расходные накладные с датой от гначдата по гкондата включительно, у которых дата документа основания равна гусл1
4 Злопчинский
 
16.08.18
22:58
(3) причем гУсл1 должна попадать в диапазон гНачДата по гКОндата
5 Franchiser
 
гуру
16.08.18
23:40
(4) даже период даже если указать огромный период все равно не работает.
Почему гусл1 должен попадать в период гначдата по гконлата?
6 Franchiser
 
гуру
16.08.18
23:41
Вот ставлю период 01.01.18, в итоге отбираются документы за 01.01.18, у которых дата основания в 2017 году
7 Franchiser
 
гуру
16.08.18
23:43
Период указываю январь 2018, фильтр на дату основания = 01.01.2018
8 Salimbek
 
16.08.18
23:49
(6) Ну вроде правильно, по этому запросу. А как должно быть по вашему?
9 Franchiser
 
гуру
16.08.18
23:53
Нужны документы за период у которых дата основания 01.01.18
10 Salimbek
 
17.08.18
00:10
(9) Может быстрее сделать без запросов? Тупым перебором? (это если задача разовая и объемы обрабатываемых данных не гигантские)
11 Franchiser
 
гуру
17.08.18
00:25
Запрос динамический в обработке setattrs, понятно что если не получится буду делать отдельную обработку, но все таки хотелось бы разъяснений
12 toypaul
 
гуру
17.08.18
08:35
"Неверно интерпретируется в SQL" ну и какой запрос в СКЛ?
13 Peltik
 
17.08.18
09:06
закоменти Перем1, а в условии попробуй вот так

Условие (ПеремОбъект.ДокументОснование.ДатаДок =    гУсл1)
14 АЛьФ
 
17.08.18
09:43
2(13) Так в 7.7 не работает.
15 АЛьФ
 
17.08.18
09:44
+(14) Блин, коряво высказался.
16 Мимохожий Однако
 
17.08.18
09:46
Без условия отрабатывается запрос?
17 Эльниньо
 
17.08.18
09:55
4 точки. Нуна.
Что мешает сделать:
ПеремОбъект = Документ.РасходнаяНакладная.ТекущийДокумент;
ДокОсн = Документ.РасходнаяНакладная.ДокументОснование;
18 Peltik
 
17.08.18
10:47
(16) нет, закоментить строку там где Перем1, а строку с условием изменить


Обрабатывать Все;
Период с гНачДата по гКонДата;
ОбрабатыватьДокументы Все;
ПеремОбъект = Документ.РасходнаяНакладная.ТекущийДокумент;
Группировка ПеремОбъект;              
Без Итогов;
//Перем1 = Документ.РасходнаяНакладная.ДокументОснование.ДатаДок;
Условие (ПеремОбъект.ДокументОснование.ДатаДок =    гУсл1);


вот так
19 Franchiser
 
гуру
17.08.18
13:51
(17) когда в запросе 1с 7.7 идет выбор 2 и более полей одинакового типа, то sql делает одно соединение с таблице Документов и потом тупо подставляет одно и то же значение в поля запроса
20 Franchiser
 
гуру
17.08.18
14:11
(18) так что-то делает. но висит уже полчаса
21 Peltik
 
17.08.18
14:13
(20) ограничь маленьким периодом для проверки
22 Peltik
 
17.08.18
14:18
"//{{ЗАПРОС(Сформировать)
    |Период с гНачДата по гКонДата;
    |ОбрабатыватьДокументы все;
    |Без итогов;
    |ТТН = Документ.ТТН.ТекущийДокумент;
    |Группировка ТТН;
    |Условие(ТТН.ДокументОснование.ДатаДок = гУсл1);
    |"//}}ЗАПРОС


кароч, в таком варианте он у меня работет, вроде, так как тебе и надо, только на другом документе тренировался
23 Franchiser
 
гуру
17.08.18
14:20
(21) Да, на маленьком периоде работает. Ладно всем спасибо
24 NSSerg
 
17.08.18
17:21
Проверяем код из (2)
Процедура Сформировать()  
    гНачДата=ТекущаяДата()-10;
    гКонДата=ТекущаяДата();
    гУсл1=ТекущаяДата()-5;
    Запрос=создатьобъект("Запрос");
    ТекстЗапроса="Обрабатывать Все;
    |Период с гНачДата по гКонДата;
    |ОбрабатыватьДокументы Все;
    |ПеремОбъект = Документ.Реализация.ТекущийДокумент;
    |Группировка ПеремОбъект;              
    |Без Итогов;
    |Перем1 = Документ.Реализация.ДокОснование.ДатаДок;
    |Условие (Перем1 =    гУсл1);";
    Запрос.Выполнить(ТекстЗапроса);  
    Верно=0;
    Ошибок=0;
    Пока Запрос.Группировка()=1 Цикл
        Если Запрос.ПеремОбъект.ДокОснование.ДатаДок=гУсл1 Тогда
            Верно=Верно+1;
        Иначе
            Ошибок=Ошибок+1;
        КонецЕсли;    
    КонецЦикла;
    Сообщить("Верно: "+Верно);
    Сообщить("Ошибок: "+Ошибок);
КонецПроцедуры
//
Верно: 1468
Ошибок: 0
// Тут докоснование - документ определенного вида.
Вторая проверка, докоснование - тип "Документ" неопределенного вида
//
//*******************************************
Процедура Сформировать()  
    гНачДата=ТекущаяДата()-10;
    гКонДата=ТекущаяДата();
    гУсл1=ТекущаяДата()-5;
    Запрос=создатьобъект("Запрос");
    ТекстЗапроса="Обрабатывать Все;
    |Период с гНачДата по гКонДата;
    |ОбрабатыватьДокументы Все;
    |ПеремОбъект = Документ.ПКО.ТекущийДокумент;
    |Группировка ПеремОбъект;              
    |Без Итогов;
    |Перем1 = Документ.ПКО.ДокОснование.ДатаДок;
    |Условие (Перем1 =    гУсл1);";
    Запрос.Выполнить(ТекстЗапроса);  
    Верно=0;
    Ошибок=0;
    Пока Запрос.Группировка()=1 Цикл
        Если Запрос.ПеремОбъект.ДокОснование.ДатаДок=гУсл1 Тогда
            Верно=Верно+1;
        Иначе
            Ошибок=Ошибок+1;
        КонецЕсли;    
    КонецЦикла;
    Сообщить("Верно: "+Верно);
    Сообщить("Ошибок: "+Ошибок);
КонецПроцедуры
//
Верно: 608
Ошибок: 0
// Это на SQL
Повторюсь, нет такого глюка.
25 Ёпрст
 
17.08.18
17:24
(0)

У переменных неопределенного вида/типа нельзя смотреть атрибуты в чорном запросе, исключение - общие реквизиты дока. ДатаДок как и Номер к ним не относится.
В sql и в dbf варианте, где-то будет значение, а где-то нет.
26 Ёпрст
 
17.08.18
17:26
Можешь сделать так, но про скорость, забудь :

Обрабатывать Все;
Период с гНачДата по гКонДата;
ОбрабатыватьДокументы Все;
ПеремОбъект = Документ.РасходнаяНакладная.ТекущийДокумент;
Группировка ПеремОбъект;              
Без Итогов;
Перем1 = Документ.РасходнаяНакладная.ДокументОснование;
Условие (Перем1.ДатаДок =    гУсл1);
27 NSSerg
 
17.08.18
17:26
(25) в (24) тест.
28 Ёпрст
 
17.08.18
17:31
(27) Сообщить(Запрос.Перем1) че возвращает у тебя ?
29 Ёпрст
 
17.08.18
17:33
Ну и вот это воткни

|Перем2 = Документ.ПКО.ДокОснование.НомерДок;

и сообщи, чему равно
Сообщить(Запрос.Перем2);
30 Franchiser
 
гуру
17.08.18
21:29
(24) какой SQL у тебя?
31 Franchiser
 
гуру
17.08.18
21:34
(24) ДокОснование у тебя общий реквизит?
32 Franchiser
 
гуру
17.08.18
21:41
(26) я так понимаю этот вариант не лучше чем (22). Сначала SQL отберёт данные, а потом 1с 7.7 налодит условие на дату основания. На самом деле я раньше смотрел profiler, проблема alias таблиц, неужели нельзя сделать что-нибудь с bkend.dll ?
33 Franchiser
 
гуру
17.08.18
21:43
(25) у меня как раз общий реквизит, почему же нельзя поставить фильтр на Датадок из него ?
34 Franchiser
 
гуру
17.08.18
21:51
(24) ты не то сверяешь, нужно не это сверять Запрос.ПеремОбъект.ДокОснование.ДатаДок =гусл1, а запрос.перем1 = гусл1
35 NSSerg
 
17.08.18
23:02
(28) Конечно куча строк с 12.08.18, других значений нет.
(29) сообщить(""+Запрос.Перем2+" "+стрдлина(Запрос.Перем2)+" "+кодсимв(лев(Запрос.Перем2,1)));
Выводит
  1 32
то есть там один пробел.
При этом
сообщить(Запрос.ПеремОбъект.ДокОснование.номердок);
eстественно выводит всё нормально.
(30) SQL2000
(31) Это имеет значение? Нет, не общий
(34) Я сверяю что в выборку попали правильные документы, с нужной датой документа основания. Естественно правильно проверяю.
36 NSSerg
 
17.08.18
23:06
(29) Прикольный глюк.
37 Franchiser
 
гуру
17.08.18
23:19
У меня sql2008
38 Злопчинский
 
18.08.18
00:39
(14) работает, только надо ловко извернуться.
39 Злопчинский
 
18.08.18
00:40
(14) Условие (Запрос.ПеремОбъект.ДокументОснование.ДатаДок =    гУсл1)

где Запрос = СоздатьОбъект("Запрос");
40 Злопчинский
 
18.08.18
00:43
(39) хотя это я м.б. не тему впихнулся, сорри
41 Franchiser
 
гуру
18.08.18
00:48
(39) может так и работает, но время работы далеко не на уровне прямого запроса
42 Злопчинский
 
18.08.18
00:49
(25) а мне удалось

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

- и все отрабатывает норм....

????
43 Злопчинский
 
18.08.18
00:51
(41) А кто сказал что будет легко...
44 Franchiser
 
гуру
18.08.18
00:54
(42) мне нужно отобрать документы за период, у которых есть основание и дата основания, например, меньше начала текущего периода. Прямым запросом можно отобрать за раз, а семерошным и за 30-60 мин не удается получить.
45 Злопчинский
 
18.08.18
00:54
(36) Поясни, плиз, в чем прикольгый глюк, а то я не улавливаю без глубокого погружения в тему...
46 Злопчинский
 
18.08.18
00:56
покажи итоговый текст запроса.
полный.
который ты запускаешь.
47 Franchiser
 
гуру
18.08.18
00:57
Черный запрос в (2) не отрабатывает, т.к. запрос в профайлере интерпретирует фильтр на дату в основании как фильтр на дату документа, т.е. из первой переменной в запросе перемобъект.
48 Злопчинский
 
18.08.18
00:58
я б, по ческгноку, вооьбще бы поостерегся выбирать/фильтровать какие-то документы/реквизитыдокументы, которые вне заданного периода запроса (параноик я). Или, по крайней мере, провел бы тестирование на вырожденных примерах чтобы убедиться что это работает как надо.
49 Злопчинский
 
18.08.18
00:59
(47) то есть в профалере неверно интепретирован исходны код чорного запроса?
50 Злопчинский
 
18.08.18
01:00
(47) я не знаю, глюк это или нет, но я всегда исходил из того, что период в запросе - ограничивает все документы, которыми оперирует запрос - поэтому и (48)
51 Franchiser
 
гуру
18.08.18
01:00
(46) но если пытаться делать другими способами , то да работает, но время работы запроса сопоставимо с получением всех документов без фильтра на дату основания, потому что в скуль фильтр на дату основания уже не идёт и фильтр отрабатывает на уровне платформы после выполнения запроса
54 Злопчинский
 
18.08.18
01:24
(51) а кто сказал что будет легко.
.
попробуй первым запросом собрать все документы, которые потенциально могут быть документами-основаниями во втором запросе и во втором запросе фильтруй выборку докумеентов по вхождению документа-основания в список.
55 Franchiser
 
гуру
18.08.18
10:25
(54) это универсальная обработка setattrs, я дорабатываю кусочный запрос, который выгружается в тз.
56 NSSerg
 
18.08.18
11:38
Не проще ли поменять тип реквизита?
Я в реализации поменял тип с "документ" на "документ.ЗаявкаПокупателя", как раз чтоб было проще писать эффективные запросы.
57 Ёпрст
 
20.08.18
13:32
(35,36)
есть такое, а в дбф будет с точностью до наоборот, даты не будет, а номер будет.