Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Отбор по дате основания 1с 77 SQL

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

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

Условие (ПеремОбъект.ДокументОснование.ДатаДок =    гУсл1);


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

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



кароч, в таком варианте он у меня работет, вроде, так как тебе и надо, только на другом документе тренировался
   Franchiser
 
23 - 17.08.18 - 14:20
(21) Да, на маленьком периоде работает. Ладно всем спасибо
   NSSerg
 
24 - 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);
   NSSerg
 
27 - 17.08.18 - 17:26
(25) в (24) тест.
   Ёпрст
 
28 - 17.08.18 - 17:31
(27) Сообщить(Запрос.Перем1) че возвращает у тебя ?
   Ёпрст
 
29 - 17.08.18 - 17:33
Ну и вот это воткни

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

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

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

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

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



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