Имя: Пароль:
1C
1С v8
В запросе обрабатывать содержимое поля (убрать спецсимволы)и сравнивать с искомым
0 alexeyomg
 
21.09.15
22:32
Нужно найти телефон в регистре сведений очень быстро. Но телефоны хранятся с плюсиками, пробелами и тире.
Нужно произвести поиск искомого телефона очень быстро (рассчитывается на большую базу).
Поэтому хочу узнать, как можно в запросе сравнивать поле с номером телефона (не очищенный, т.е. с плюсиками и т.д.) из базы с искомым номером на уровне запроса, а не с помощью перебора после выгрузки.
Если это возможно, то это быстрее будет работать, так как 99% времени занимает выгрузка таблицы по запросу.
Я нашёл только тему с ПОДОБНО, если можно сравнить с шаблоном. Да я могу понять с его помощью, содержит ли поле спецсимвол, но мне нужно сразу в запросе сравнить поле БЕЗ спецсимволов, но как это сделать? На уровне запроса очень мало операций можно выполнять же.
Можно это реализовать или каким-то образом сократить ?
1 FIXXXL
 
21.09.15
22:40
Модернизируй запись и один раз перезаполни РС по шаблону.
2 Толич
 
21.09.15
23:01
Сделайте новый текстовый ресурс в том же регистре сведений с телефонами "НомерЦифрами" и найдите все цифры в телефоне и заполните этот ресурс.
Затем через "подобно" ищите в запросе.
3 DiMel_77
 
22.09.15
07:50
Задача простая, тебе надо в запросе выразить текст как целое число. Есть хорошая статья на эту тему: http://catalog.mista.ru/public/170336/ написано уважаемым ildarovich (он есть на этом форуме).
4 DiMel_77
 
22.09.15
08:10
+(3) Запрос будет иметь примерно такой вид:

ВЫБРАТЬ
    ТвойРегистр.Телефон КАК Телефон,
    ТвойРегистр.Контрагент КАК Контрагент
ПОМЕСТИТЬ ВТ_Телефоны
ИЗ
    РегистрСведений.ТвойРегистр КАК ТвойРегистр
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    0 КАК С,
    1 КАК П
ПОМЕСТИТЬ Р16

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    1,
    10

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    2,
    100

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    3,
    1000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    4,
    10000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    5,
    100000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    6,
    1000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    7,
    10000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    8,
    100000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    9,
    1000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    10,
    10000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    11,
    100000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    12,
    1000000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    13,
    10000000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    14,
    100000000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    15,
    1000000000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    16,
    10000000000000000
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Телефоны.Контрагент,
    ВТ_Телефоны.Телефон,
    СУММА(А.П * Б.С) / МИНИМУМ(А.П) КАК ТелефонЧисло
ИЗ
    ВТ_Телефоны КАК ВТ_Телефоны,
    Р16 КАК А,
    Р16 КАК Б
ГДЕ
    Б.С < 10
    И ПОДСТРОКА(ВТ_Телефоны.Телефон, 17 - А.С, 1) = ПОДСТРОКА("0123456789", Б.С + 1, 1)

СГРУППИРОВАТЬ ПО
    ВТ_Телефоны.Контрагент,
    ВТ_Телефоны.Телефон

У меня другая была задача, но похожая 27 тыс. элементов преобразовывались за ~3 сек.
5 ЧеловекДуши
 
22.09.15
08:18
(0) Чо бы нормально искать, нужно нормально хранить :)
Наприги, мозх, и осиль Подобно... там все просто :)
6 ЧеловекДуши
 
22.09.15
08:20
+(0) Быстрее будет работать, если вы добавите индекс. и разделите телефонный номер на составляющие, который будут соответствовать искомому шаблону.
Исключите Подобно, т.к. оно все же ищет медленней, чем просто равенство "="  :)
7 alexeyomg
 
22.09.15
08:49
ПОДОБНО не даёт прирост в скорости работы почти.
Я бы хранил телефон нормально, чтобы искать нормально, но нельзя вносить изменения в конфу. Обработка универсальной должна быть, менять может только запрос. Поэтому я ищу вариант, чтобы искать по базе телефон быстро.
Сейчас попробую тему с преобразованием строки в число.

Фишка в том, что на моём компе поиск телефона по базе с 100 000  телефонами в РС происходит за секунду. А на слабеньком компе минуту целую. Вот и я хочу найти способ ускорить это. Но мне нужно, чтобы и на слабом компе не лагало. В том числе в случае, когда база файловая на шаре лежит гденть у клиентов.
8 alexeyomg
 
22.09.15
08:49
(6) (2) (1) (4)
9 dk
 
22.09.15
08:57
грузи все в ТЗ добавляй индекс и и ищи по ней
либо во временной таблице с индексами храни
вопрос только с обновлением информации - как часто инфа меняется?
10 alexeyomg
 
22.09.15
09:08
да как раз фишка в том, что нужно искать прям в актуальной базе. Поиск этот может проводиться в следующую секунду после добавления нового документа, а значит и новой записи в РС (либо изменение).
Поэтому у меня нет ресурсов, чтобы преобразовывать каждый раз все записи из регистре.
Вот такие дела. Да по сути так неправильно. И надо хранить данные в норм формате и так искать по формализированному полю. Но обработка универсальная. И если даже один раз сделать преобразование, добавив телефон норм формата в какое-нибудь поле, то при следующем добавлении телефона в этот регистр, мы не будем иметь телефон "очищенный" и снова надо будет обрабатывать и писать телефон в другое поле, что мы не можем себе позволить (9)
11 dk
 
22.09.15
09:11
тут либо данные в удобном виде для поиска, либо полный перебор
12 alexeyomg
 
22.09.15
09:56
Ну я как бы догадывался,но на всякий случай спросил. Ну ладно, спасибо
13 dk
 
22.09.15
10:03
есть еще 1 вариант - железо ускорять
терминал / скуль + куча оперативки
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс