Имя: Пароль:
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) Предполагается, что префикс будет слева, справа могут быть Символы.НПП. Указал справа, что бы наверняка.
Жаль, что запросом нельзя так сделать, полезная штука была бы
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший