В строку поиска по контрагентам менеджеры хотят вводить номер телефона в свободном формате
Например: 8(900)123-45-67 или +7900 12345-67
Как программно преобразовать в формат: 9001234567 ? (именно так содержатся номера телефонов в базе).
---
на этот случай там есть комментарий ) Поиск по сайту есть на любой случай: https://forum.infostart.ru/forum9/topic114710/
---
сделать СокрЛП исходной строки, пройтись циклом по каждому символу - если не число то исключить, дальше можно искать "900" и от него всё вправо взять
---
Подскажите как?
Сейчас у меня к строке поиска есть кнопка, ее код:

```1c
    Процедура НайтиНажатие(Элемент)

    Если СписокПоляПоиска = "Наименование" Тогда
    СправочникСписок.Отбор[СписокПоляПоиска].ВидСравнения = ВидСравнения.Содержит;
    СправочникСписок.Отбор[СписокПоляПоиска].Значение = СтрокаПоиска;
    СправочникСписок.Отбор[СписокПоляПоиска].Использование = Истина;
    Иначе
    ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Ложь;

    Если СтрДлина(СтрокаПоиска) = 10 Тогда
    СправочникСписок.Отбор[СписокПоляПоиска].ВидСравнения = ВидСравнения.Равно;
    СправочникСписок.Отбор[СписокПоляПоиска].Значение = Число(СтрокаПоиска);
    СправочникСписок.Отбор[СписокПоляПоиска].Использование = Истина;
    Иначе

    Предупреждение(СтрокаПоиска);
    Предупреждение("Введите все 10ть цифр номера!");
    КонецЕсли;
    КонецЕсли;

    КонецПроцедуры
```
---
а где происходит поиск, в форме списка контрагентов ? "СтрокаПоиска" это реквизит формы ?
---
Да в форме списка контрагентов, где контрагенты это справочник.
СтрокаПоиска это поле ввода, размещенное на панели, тип значения строка. Т.е. не реквизит.
---
```1c
    // можно дополнить другими спецсимволами
    ЗаменяемыеСимволы = "+<>()[]";

    Результат = СтрокаПоиска;
    Для Позиция = 1 По СтрДлина(Символы) Цикл
    Результат = СтрЗаменить(Результат, Сред(ЗаменяемыеСимволы, Позиция, 1), " ");
    КонецЦикла;

    Результат = СокрЛп(Результат);

    // подойдёт только если код города всегда "900"
    НомерСимвола = Найти(Результат, "900");
    Если НомерСимвола <> 0 Тогда
    Результат = Сред(Результат, НомерСимвола);
    Иначе
    Если Стрдлина(Результат) = 7 Тогда
    //считаем что нормальный номер, только без кода
    Результат = "900" + Результат;
    Иначе
    Сообщить("Введен не правильный формат номера");
    КонецЕсли;
    КонецЕсли;
```

Что-то такое.. Вставляете код в начале процедуры нажатия, и заменяете "СтрокаПоиска" на "Результат" в местах где

```1c
    СправочникСписок.Отбор[СписокПоляПоиска].Значение = Результат;
```
---
В этом случае введут любой другой символ отличный от +<>()[] и будет проблема.
---
на этот случай там есть комментарий )
---
ааа, логично)
---
на этот случай там есть комментарий ) Поиск по сайту есть на любой случай: https://forum.infostart.ru/forum9/topic114710/
---
Не всем понятны "регулярные выражения" описанные в этой теме. И там нет конкретно того, что хотел автор.
---
И там нет конкретно того, что хотел автор. По-моему, вам надо поменять очки - в этих вы плохо видите, они слишком темные. ;-)

Конкретно почитайте там комментарий № 3 - разве не этого хотел автор? На всякий случай напоминаю:
(1) Как программно преобразовать в формат: 9001234567 ?
Ах да, надо ведь добавить:

```1c
    Возврат Прав(ВыхСтрока,10);
```

Архисложная задача! ;-P
---
Для автора видимо сложная, раз спрашивает (это можно понять с первых ответов), да и я не претендую на единственное верное решение.
зы: в коде коммента номер 3 нет ни про сокрлп, ни прав(..., 10).
---
в коде коммента номер 3 нет ни про сокрлп А зачем там СокрЛП?
ни прав(..., 10) Это да, что делает задачу этой ветки практически нерешаемой... для вас - точно, для автора - может быть... ;-)
---
```1c
    Рез = СтрЗаменить(Рез, "+", ");
    Рез = СтрЗаменить(Рез, "-", ");
    Рез = СтрЗаменить(Рез, "(", ");
    Рез = СтрЗаменить(Рез, ")", ");
    Рез = СтрЗаменить(Рез, " ", ");
```
---
Набросал такой код, работает но странно, например
номер 8(900) 161 50 01 некорректно обрабатывает, теряет ноль и получается 900161501, в тоже время
8(900) 977 850 11 00 корректирует нормально в 9009778501100
Почему из двух нулей остается один 0 не понятно
---
Набросал такой код Какой именно "такой" - мы, наверное, должны угадать? Извините, но телепатия после полуночи почему-то "некорректно обрабатывает". :-)
---
)) Ха, забыл видимо сам код опубликовать)
Но в любом случае воспользовался примером по ссылке выше.
---
Сложно живете))

```1c
    ДлинаСтроки = СтрДлина(ТелефонСБотвой);
    Телефон = ";
    Для Сч = 1 По ДлинаСтроки Цикл
    Символ = Сред(ТелефонСБотвой, Сч, 1);
    Если Символ >= "0" и Символ <= "9" Тогда
    Телефон = Телефон + Символ;
    КонецЕсли
    КонецЦикла
```
---
подсмотрено в 1С и чуток допилено:

```1c
    ЛишниеСимволы = СтрСоединить(СтрРазделить(ТелефонМобильныйПредставление, "0123456789"), ");

    СтрокаТелефон = СтрСоединить(СтрРазделить(ТелефонМобильныйПредставление, ЛишниеСимволы), ");

    СтрокаТелефон = Прав(СтрокаТелефон, СтрДлина(СтрокаТелефон) - 1);

    СтрНовый.ТелефонМобильныйПредставление = "+7" + СтрокаТелефон;
```
---
СтрокаТелефон = Прав(СтрокаТелефон, СтрДлина(СтрокаТелефон) - 1);
Если телефон введут в "свободном формате", например, без +7 или без 8, то в итоге из него пропадёт первая цифра.
Думаю, "СтрДлина(СтрокаТелефон) - 1" можно смело заменить на "10".