Функция преобрНТ(ЗНАЧ нт)
стр = "";
Для сч = 1 по СтрДлина(нт) ЦИкл
см = Сред(нт, сч, 1);
Если см>="0" И см<="9" Тогда
стр = стр + см;
КонецЕсли;
КонецЦикла;
возврат Прав(стр,10);
КонецФункции
(9) если автор ставит Лев(нт, 2) , значит у него не бывает впереди пробела.
Любая программа опирается на какие то условия. В его условиях впереди пробела быть не может, возможно перед тем как положить данные в базу или при передаче параметров, он уже очистил от лидирующих пробелов , мы видим лишь некие входные условия.
Мы же понимаем , что если отключат электричество , то вообще программа не отработает, это кстати тоже условие работы программы.
(20)
Ну в теории можно зачистку сделать оставить только цифры.
Вообще это у вас уложено в базу ? может зачистить один раз , разово , перед укладкой в базу.
(23) Это лежит в базе. Но а) телефон нужен в человекочитаемом виде и б) процедура вызывается не каждые 5 секунд, чтобы изменённые данные хранить в базе и дублировать информацию.
В принципе после советов тут скорость поднялась на ~20%. Дальше уже другие моменты роялять...
(29) как я понял это уже дало 20% по скорости. Но тут еще можно порезвиться по оптимизации.
Но самый лучший вариант посадить ОДИН РАЗ в базу одни цифры.
А выводить пользователю форматно, это будет более оптимальное решение.
И у Вас просто исчезнет подобна процедура.
ну в любом случае, если юзер-менеджер некооректно вводит , надо просто программно не дать ему ввести кривой номер в базу.
Поймите , лучше на входе данные изначально ввести правильно , чем потом бороться с мельницами.
если ее можно например запускать рано утром - до начала рабочего дня
или поздно вечером или еще лучше ночью - то в принципе борьбы такой делать и не надо.
--
но идеально - это правильное проектирование - т.е. НЕ ДОПУСКАТЬ кривой ввод данных изначально.
(48) Её запускают тогда, когда нужно начальнику. Не в моих силах на это повлиять.
И вообще - вопрос "правильного" хранения телефонов нужно адресовать в Москву.
Ибо ради такой задачки переделывать всю подсистему хранения контактной информации - мне за это не заплатят.
(49) Если база порядка 100-300тыс записей , обработка на 100тыс порядка 2 минут - то не страшно, а если несколько миллионов то это уже серьезно. В моем случае у меня была база порядка 4 терабайт , в некоторых таблицах сотни миллионов записей, база не 1С. Подобная обработка была бы неприемлема. Если ничего нельзя сделать с приведением данных к нормальному виду и начальник не готов идти на оптимизацию хранения данных. Остается только писать изящные решения для борьбы с последствиями , тем более что именно за них и платят.
(16) Можно. Но есть одно но - транслятор перед сравнением букв производит конвертацию буквенного представления в числовой (т.к. в регистрах процессора хранятся не буквы, а числа). Т.е. все равно сравниваются не буквы как таковые, а числа. Т.е. см>="0" и КодСимвола(см)>=Перем0, где Перем0 уже присвоено КодСимвола("0") должно работать быстрее. Т.к. тут производится только одно преобразование КодСимвола(см). Но проверить это надо - т.к. транслятор может оптимизировать по другому.
А если использовать регулярные выражения? По ссылке выше были примеры, сначала отбираем только цифры регулярным выражением, а потом справа отбираем 10 символов