Есть задача найти все элементы справочника где в коде содержаться числа поиска. В запросе есть оператор подобно который отлично подошел бы но в справочнике код это число, пробовал Выразить как строка или представление, запрос выдает строку но в условиях нельзя использовать ПОДОБНО, пробовал с временными таблицами все-равно =(.
Есть у кого идеи как осуществить поиск быстро?
Варианты которые я придумал
1) Выбрать весь справочник и
```1c
    Найти(Строка(ВыборкаХка.Код),Строка(ПоискХка))>1
```

все отлично но т.к. выбирает весь справочник и перебирает работает медлено
2) выгрузить запрос в таблицу, и к ней сделать 2 запрос с условием подобно чуть быстрее но все равно выборка идет всего и загрузка в таблицу =(
---
Если задача не разовая, а постоянная, то подумайте над тем, чтобы переделать структуру данных. Потому как искать по подстроке - это мегаизврат.
---
Cool_vsi, Наверное так
Выбрать Код
Из Справочник
Где Код/10000>=1234 И Код/10000<1234+1
---
найдет код 75812345888?
---
tusv, непонял ваш вариант , что выбираем и на что делим? и зачем делить
---
Cool_vsi,
Ну чтобы было совсем понятно
Выбрать Код
Из Справочник
Где (Код=&ЧислоПоиска)
или (Код/10>=&ЧислоПоиска И Код/10<&ЧислоПоиска+1)
или (Код/100>=&ЧислоПоиска И Код/100<&ЧислоПоиска+1)
или (Код/1000>=&ЧислоПоиска И Код/1000<&ЧислоПоиска+1)

Итд. Не больше 19
---
tusv, а остаток от деления?
например код 17250 а ищем 250
17250/10=1725 не равно 250
172.5 не равно 250
и т.д. в чем смысл не пойму?
---
Cool_vsi, Упс. Понял Ты хочешь найти вхождение, а не по первым числам. Тогда этот вариант не для тебя.
Ну раз у тебя конфа сильно переписана, то почему бы тебе не завести новый Реквизит, который дублирует код как строка и не парится?
---
В коде из, например, 12 знаков 3 цифры (например "678") начиная с любой из позиций могут встретиться 9 раз. То есть:
678*********
*678********
**678*******
...
*********678
Длина кода фиксирована, остается добавить в процедуру построения запроса добавление условий в зависимости от количества разрядов в строке поиска.
Типа

```1c
    ФрагментДляПоиска = "678";
    ЧислоИзФрагментаДляПоиска = Число(ФрагментДляПоиска);
    ДлинаКода = 12;
    сч = 0;
    Запрос = Новый Запрос;
    Пока сч < ДлинаКода - СтрДлина(ФрагментДляПоиска) Цикл

    НижнийПредел = ЧислоИзФрагментаДляПоиска * Pow(10, ДлинаКода - СтрДлина(ФрагментДляПоиска) - сч);
    ВерхнийПредел = НижнийПредел + Pow(10, ДлинаКода - СтрДлина(ФрагментДляПоиска) - сч);

    Условие = "ИЛИ (Справочник.Код >= &НижнийПредел" + Строка(сч)+ " И Справочник.Код < &ВерхнийПредел" + Строка(Сч) + ")";

    Запрос.Текст = Запрос.Текст + Условие;

    Запрос.Параметры.Вставить("НижнийПредел" + Строка(сч), НижнийПредел);
    Запрос.Параметры.Вставить("ВерхнийПредел" + Строка(сч), ВерхнийПредел);

    сч = сч + 1;
    КонецЦикла;
```

Код не тестировался, но думаю подгоните по месту. Именно на это, думаю, Вам пытались намекнуть в (2)
---
измените формат кода на строковый
---
spezc, к сожалению конфигурация сильно переписанная и на число много завязок, очень не хочется все переделывать
---
Я предлагаю поиграть с разрядностью
Например ЦЕД(75812345888223/1000) будет равен твоему числу 75 812 345 888.
Всего то условий делить на 10, на 100 на 1000 итд.
Все быстрее, чем выбирать весь справочник
---
Сделал вот так

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ХарактеристикиНоменклатуры.Владелец,
    | ПРЕДСТАВЛЕНИЕ(ХарактеристикиНоменклатуры.Код) КАК СтрокаКод,
    //| Выразить(ХарактеристикиНоменклатуры.Код как строка(10)) КАК СтрокаКод,
    | ХарактеристикиНоменклатуры.Ссылка
    |ИЗ
    | Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры";

    ВсеХКА = Запрос.Выполнить().Выгрузить();

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ВыборкаХКА.Владелец,
    | ВыборкаХКА.СтрокаКод,
    | ВыборкаХКА.ССылка
    |ПОМЕСТИТЬ Таб1
    |ИЗ
    | &ВыборкаХКА КАК ВыборкаХКА
    |ГДЕ
    | ВыборкаХКА.СтрокаКод ПОДОБНО &КлючПоиска
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | Таб1.Владелец,
    | Таб1.ССылка
    |ИЗ
    | Таб1 КАК Таб1";

    Запрос.УстановитьПараметр("КлючПоиска","%"+Строка(ПоискХка)+"%");
    Запрос.УстановитьПараметр("ВыборкаХКА",ВсеХКА);

    Результат = Запрос.Выполнить();

    ВыборкаХка = Результат.Выбрать();
```

только есть проблема код выводиться Например "15 800" , даже в консоле запросов в параметрах разбивает по разрядам...непойму как так
и получается что когда вбиваеш "15 800" находит а когда "15800" нет
---
```1c
    СтрокаПоискХка = Формат(ПоискХка, "ЧЦ=10; ЧДЦ=0;ЧГ=''")
    Запрос.УстановитьПараметр("КлючПоиска","%"+СтрокаПоискХка+"%");
```
---
spezc, да спасибо, только форматирование добавил в строку поиска и стало отлично работать.

Скорость работы средняя но приемлемая, интересно почему если сначала выбрать
```1c
    | ПРЕДСТАВЛЕНИЕ(ХарактеристикиНоменклатуры.Код) КАК СтрокаКод,
```

 и поместить это во временную таблицу, запрос всеравно не дает использовать ПОДОБНО во временной таблице пишет не совместимые типы..полазил на форумах не только у меня такая проблема...=(

(12) tusv, думал есть способы сделать это в запросе, вариант хороший но не очень хотелось лишние реквизиты создавать
---
Cool_vsi, потому что "представление" это особенный случай, с ним ничего больше, кроме как получить, сделать нельзя.
---
PetroP, а есть варианты чтобы в запросе выбрать число, преобразовать в строку и использовать ПОДОБНО ?
---
Cool_vsi, только извратом: генерацией временной таблицы соответствия чисел и их строкового представления, и использования ее в соединении.
---
Cool_vsi, http://infostart.ru/public/170336/
---
Cool_vsi,
 tusv, думал есть способы сделать это в запросе, вариант хороший но не очень хотелось лишние реквизиты создавать

Тут дело в частоте использования этого поиска. Бывает, что лучше лишний реквизит, чем необоснованное изнасилование железа
---
spezc, к сожалению вариант с форматом провалился =(
т.к если код "1 500" мы ищем "1 500" все отлично
но когда ищем "150" то ничего не найдем, необходимо искать "1 50"

Судя по всему придется делать дополнительный реквизит Строка и туда все записывать =(
---
МегаИзврат сделать. Выбрать все товары во временную таблицу, где получить строку из кода, а в основном запросе наложить условие ПОДОБНО на это поле.
---
platon_, что значит "получить строку из кода"?
---
PetroP,
```1c
    ВЫБРАТЬ
    Номенклатура.Ссылка,
    ВЫРАЗИТЬ(Номенклатура.Код КАК СТРОКА(15)) КАК Код
    ПОМЕСТИТЬ ВТ_Номеклатура
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_Номеклатура.Ссылка
    ИЗ
    ВТ_Номеклатура КАК ВТ_Номеклатура
    ГДЕ
    ВТ_Номеклатура.Код ПОДОБНО &Код
```
---
platon_, вы уже пробовали на числовых кодах такое? Или просто теоретизируете?
---
PetroP, у меня ни в одной конфе нету числовых кодов. везде строки. поэтому теоризирую. но консоль запросов вам в помощь.
---
platon_, мне в помощь? Запомните, "ВЫРАЗИТЬ" служит для приведения составного типа к какому-то конкретному, но никак не для преобразования в совсем другой тип.
---
PetroP, сории. ПРЕДСТАВЛЕНИЕ, а не ВЫРАЗИТЬ.
---
platon_, я в (14) написал по поводу "ПРЕДСТАВЛЕНИЕ". Более подробно читайте на ИТС.
---
Если задача не разовая, а постоянная, то подумайте над тем, чтобы переделать структуру данных. Потому как искать по подстроке - это мегаизврат.