Имя: Пароль:
1C
 
Запрос с точки зрения производительности
,
0 Vvvvv
 
25.07.15
12:35
Есть запрос, в нем берутся две таблицы из таблиц значения и они соединяются.
Обратите внимание на связь таблиц, насколько это правильно или не правильно?

ВЫБРАТЬ
    ВЫРАЗИТЬ(ТЗ.Номер КАК СТРОКА(30)) КАК НомерВходящегоДокумента,
    ТЗ.Дата КАК ДатаВходящегоДокумента,
    ТЗ.Ссылка
ПОМЕСТИТЬ ТЗ
ИЗ
    &ТЗ КАК ТЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВЫРАЗИТЬ(ТЗ2.Номер КАК СТРОКА(30)) КАК Номер,
    ТЗ2.Дата,
    ТЗ2.Сумма
ПОМЕСТИТЬ ТЗ2
ИЗ
    &ТЗ2 КАК ТЗ2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТЗ.Ссылка,
    ТЗ.ДатаВходящегоДокумента,
    ТЗ2.Дата,
    ТЗ2.Номер,
    ТЗ.НомерВходящегоДокумента
ИЗ
    ТЗ КАК ТЗ
        ЛЕВОЕ СОЕДИНЕНИЕ ТЗ2 КАК ТЗ2
        ПО ("%" + ТЗ.НомерВходящегоДокумента ПОДОБНО "%" + ТЗ2.Номер)


ОБРАТИТЬ ВНИМАНИЕ на эти строчки:
ЛЕВОЕ СОЕДИНЕНИЕ ТЗ2 КАК ТЗ2
        ПО ("%" + ТЗ.НомерВходящегоДокумента ПОДОБНО "%" + ТЗ2.Номер)
1 H A D G E H O G s
 
25.07.15
12:40
пофиг
2 ДенисЧ
 
25.07.15
13:00
Если у тебя возникает ПОДОБНО, то о производительности можешь забыть
3 Рэйв
 
25.07.15
13:04
Если челловек научился запихивать ТЗ в запрос, странно слышать от него вопросы о соединении:-)
4 H A D G E H O G s
 
25.07.15
13:07
(2) Если слушать ДенисЧ - то можно вообще в лес не ходить.
5 Vvvvv
 
25.07.15
13:09
(3) у меня с этим
"%" + ТЗ2.Номер

не получается найти нужные документы, приходится делать через циклы, но это долго.
6 ДенисЧ
 
25.07.15
13:12
(4) А что тебе в лесу делать? Там злые волки и денисы. Ничего хорошего от них не жди.
7 Рэйв
 
25.07.15
13:14
(6)Ты ошибаешься.Денисы всегда с тобой:-)
8 Fragster
 
гуру
25.07.15
13:16
в формировании ТЗ перед помещением их в запрос сделать колонку с "инвертированным" номером
9 Vvvvv
 
25.07.15
14:00
(8) я не знаю каким может в дальнейшем оказаться номер?
например:
ТЗ2.Номер = "123456789"

ТЗ.НомерВходящегоДокумента = "РТ_00123456789"
или
ТЗ.НомерВходящегоДокумента = "ВС_00123456789"
10 Fragster
 
гуру
25.07.15
14:01
(9) просто ПОДОБНО %строка работает намного медленнее, чем ПОДОБНО Строка%
11 Fragster
 
гуру
25.07.15
14:02
ну и да - в идеале на первоначальном этапе (до помещения в спрос) префиксы отпиливать и приводить к одному формату (про лидирующие нули) и сравнивать через "="
12 Vvvvv
 
25.07.15
14:12
(11) в том то и дело, что не могу отпилить префикс, т.к. не знаю какой он и сколько символов должно быть?
13 Vvvvv
 
25.07.15
14:13
Попробовал сделать так, весь код:
ни одного сообщения не вышло:

ТЗ = новый ТаблицаЗначений;
    тз.Очистить();
    ТЗ.Колонки.Добавить("Номер", новый ОписаниеТипов("Строка"), новый КвалификаторыСтроки(30));
    ТЗ.Колонки.Добавить("Дата", новый ОписаниеТипов("Дата"));
    ТЗ.Колонки.Добавить("Сумма", новый ОписаниеТипов("Число"));

    ТЗ2 = новый ТаблицаЗначений;
    тз2.Очистить();
    ТЗ2.Колонки.Добавить("Номер", новый ОписаниеТипов("Строка"), новый КвалификаторыСтроки(30));
    ТЗ2.Колонки.Добавить("Дата", новый ОписаниеТипов("Дата"));
    ТЗ2.Колонки.Добавить("Сумма", новый ОписаниеТипов("Число"));
    
    НСтр1 = тз.Добавить();
    НСтр1.Номер = "12345";
    НСтр1 = тз.Добавить();
    НСтр1.Номер = "122345";
    НСтр1 = тз.Добавить();
    НСтр1.Номер = "7566";
    НСтр1 = тз.Добавить();
    НСтр1.Номер = "22243";
    
    НСтр2 = тз2.Добавить();
    НСтр2.Номер = "РС12345";
    НСтр2 = тз2.Добавить();
    НСтр2.Номер = "ТК122345";
    НСтр2 = тз2.Добавить();
    НСтр2.Номер = "ББ7566";
    НСтр2 = тз2.Добавить();
    НСтр2.Номер = "СС22243";

    
    
        Запрос = новый Запрос;
        Запрос.УстановитьПараметр("ТЗ", ТЗ);    //123
        Запрос.УстановитьПараметр("ТЗ2", ТЗ2);   //РС123
        Запрос.Текст = "ВЫБРАТЬ
                       |    ВЫРАЗИТЬ(ТЗ.Номер КАК СТРОКА(30)) КАК Номер
                       |ПОМЕСТИТЬ ТЗ
                       |ИЗ
                       |    &ТЗ КАК ТЗ
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ВЫРАЗИТЬ(ТЗ2.Номер КАК СТРОКА(30)) КАК Номер2
                       |ПОМЕСТИТЬ ТЗ2
                       |ИЗ
                       |    &ТЗ2 КАК ТЗ2
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ТЗ.Номер,
                       |    ТЗ2.Номер2
                       |ИЗ
                       |    ТЗ КАК ТЗ
                       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ2 КАК ТЗ2
                       |        ПО (""%"" + ТЗ.Номер + ""%"" ПОДОБНО ""%"" + ТЗ2.Номер2 + ""%"")";
        Выборка = Запрос.Выполнить().Выбрать();
        пока Выборка.Следующий() цикл
            Сообщить(""+Выборка.номер + "   " + Выборка.Номер2);
        КонецЦикла;
14 ДенисЧ
 
25.07.15
14:14
(7) Не всё то денисы, что с зубами.
Не все те, кого бояться нужно - денисы...
15 Fragster
 
гуру
25.07.15
21:32
если ты словами опишешь свой запрос - ты увидишь, что так и должно быть с твоими данными. а отрезать префикс можно и не зная его длину, а только то, что его последний символ - не цифра, например
16 mistеr
 
25.07.15
23:29
(0) Я не понял, зачем % с левой стороны от ПОДОБНО?
17 Vvvvv
 
26.07.15
10:56
(16) например в ТЗ1 номер = "12345"
а в ТЗ2 номер = "РС_12345", а может быть наоборот.
И нужно найти запросов те поля, в которых присутствует "12345"
18 hhhh
 
26.07.15
11:03
(17) ПОДОБНО здесь не подойдет. Потому что он выберет и 612345 и 8812345, а их не нужно.
19 Vvvvv
 
26.07.15
11:11
(18) для моей задачи этот вариант подойдет, т.к. префикс будет не известен.
Только этот механизм не работает
"%" + ТЗ2.Номер

Не могу понять как правильно? Пока никто не подсказал, возможно раньше не сталкивались?
20 ДенисЧ
 
26.07.15
11:13
(19) полный текст давай.
Ибо УМВР, ЧЯДНТ?
21 Vvvvv
 
26.07.15
11:14
(20) полный код в (13) от и до
22 ДенисЧ
 
26.07.15
11:16
(21) То есть реальный код, который передаётся запросу, ты показать не можешь?
Без всяких там + и т.д.?
23 Vvvvv
 
26.07.15
11:22
(22) чем этот код не устраивает?
2 таблицы значения, видно чем заполняются и их нужно сравнить, даже заполняется таблица сама нужными значениями

ТЗ = новый ТаблицаЗначений;
    тз.Очистить();
    ТЗ.Колонки.Добавить("Номер", новый ОписаниеТипов("Строка"), новый КвалификаторыСтроки(30));

    ТЗ2 = новый ТаблицаЗначений;
    тз2.Очистить();
    ТЗ2.Колонки.Добавить("Номер", новый ОписаниеТипов("Строка"), новый КвалификаторыСтроки(30));
    
    НСтр1 = тз.Добавить();
    НСтр1.Номер = "РС12345";
    НСтр1 = тз.Добавить();
    НСтр1.Номер = "122345";
    НСтр1 = тз.Добавить();
    НСтр1.Номер = "7566";
    НСтр1 = тз.Добавить();
    НСтр1.Номер = "22243";
    
    НСтр2 = тз2.Добавить();
    НСтр2.Номер = "12345";
    НСтр2 = тз2.Добавить();
    НСтр2.Номер = "ТК122345";
    НСтр2 = тз2.Добавить();
    НСтр2.Номер = "ББ7566";
    НСтр2 = тз2.Добавить();
    НСтр2.Номер = "СС22243";

    
    
        Запрос = новый Запрос;
        Запрос.УстановитьПараметр("ТЗ", ТЗ);    //123
        Запрос.УстановитьПараметр("ТЗ2", ТЗ2);   //РС123
        Запрос.Текст = "ВЫБРАТЬ
                       |    ВЫРАЗИТЬ(ТЗ.Номер КАК СТРОКА(30)) КАК Номер
                       |ПОМЕСТИТЬ ТЗ
                       |ИЗ
                       |    &ТЗ КАК ТЗ
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ВЫРАЗИТЬ(ТЗ2.Номер КАК СТРОКА(30)) КАК Номер2
                       |ПОМЕСТИТЬ ТЗ2
                       |ИЗ
                       |    &ТЗ2 КАК ТЗ2
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ТЗ.Номер,
                       |    ТЗ2.Номер2
                       |ИЗ
                       |    ТЗ КАК ТЗ
                       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ2 КАК ТЗ2
                       |        ПО (""%"" + ТЗ.Номер + ""%"" ПОДОБНО ""%"" + ТЗ2.Номер2 + ""%"")";
        Выборка = Запрос.Выполнить().Выбрать();
        пока Выборка.Следующий() цикл
            Сообщить(""+Выборка.номер + "   " + Выборка.Номер2);
        КонецЦикла;
24 ДенисЧ
 
26.07.15
11:24
Меня не устраивает вот это
ПО (""%"" + ТЗ.Номер + ""%"" ПОДОБНО ""%"" + ТЗ2.Номер2 +

И кстати, 1с тоже вряд ли устроит.

Я же не зря говорю - текст, который отдаётся запросу.
Сообщить(Запрос.Текст)
И результат сюда.
После этого можно начать избиение младенца.
25 Vvvvv
 
26.07.15
11:30
Сообщить(Запрос.Текст);
Вот что вывел:

ВЫБРАТЬ
    ВЫРАЗИТЬ(ТЗ.Номер КАК СТРОКА(30)) КАК Номер
ПОМЕСТИТЬ ТЗ
ИЗ
    &ТЗ КАК ТЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВЫРАЗИТЬ(ТЗ2.Номер КАК СТРОКА(30)) КАК Номер2
ПОМЕСТИТЬ ТЗ2
ИЗ
    &ТЗ2 КАК ТЗ2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТЗ.Номер,
    ТЗ2.Номер2
ИЗ
    ТЗ КАК ТЗ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ2 КАК ТЗ2
        ПО ("%" + ТЗ.Номер + "%" ПОДОБНО "%" + ТЗ2.Номер2 + "%")
26 ДенисЧ
 
26.07.15
11:59
ПО ("%" + ТЗ.Номер + "%" ПОДОБНО "%" + ТЗ2.Номер2 + "%")

Тут проблема.
Подумай
27 Vvvvv
 
26.07.15
12:12
(26) я знаю, что тут проблема, я еще в теме (0) об этом сказал.
28 ДенисЧ
 
26.07.15
12:14
(27) gdb dna не предлагать?
29 Vvvvv
 
26.07.15
12:14
(28) а что это?
30 ДенисЧ
 
26.07.15
12:18
31 Vvvvv
 
27.07.15
09:14
(30) без знания английского языка, - это мало чем поможет.
32 mistеr
 
27.07.15
09:25
(17) Я правильно понял, что ты хочешь сопоставить по номерм без префиксов? Причем префиксы могут быть и справа и слева, и они заранее не известны, и даже их длина заранее не известна?

Если да, то запросом этого сделать нельзя.
33 Vvvvv
 
27.07.15
09:30
(32) Предполагается, что префикс будет слева, справа могут быть Символы.НПП. Указал справа, что бы наверняка.
Жаль, что запросом нельзя так сделать, полезная штука была бы
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший