Всем, привет! 1С 8.3 (обычное приложение) подскажите, пожалуйста, как из строки вида 380000000000 (директор) перенести все не числовые символы в другую строку.
---
Например вот так:
Строка - это ваша строка "380000000000 (директор)" - в результате разобьется в две строки
"380000000000"
"(директор)"
Можете сделать вариант с массивом если хотите)

```1c
    Строка = СокрЛП(Строка);
    Длина = СтрДлина(Строка);
    Итог = ";
    Для Инд = 1 По Длина Цикл
    Символ = Сред(Строка,Инд,1);
    КодСимвола = КодСимвола(Символ);

    Если КодСимвола >= 48 И КодСимвола < 58 Тогда
    Итог = Итог+Символ;
    Иначе
    Итог = Итог+Символы.ПС+Сокрлп(Сред(Строка,Инд,Длина));
    Прервать
    КонецЕсли;
    КонецЦикла;
```
---
самый простой вариант. Сравниваешь каждый символ с числом. Если не число, тогда пишем в новую строку. По итогу получится:
СтрокаЦифр = "380000000000";
СтрокаНеЦифр = " (директор)";
---
Это непростая задача, тут код писать надо. Например, такой:

```1c
    ИтоговаяСтрока=";
    стрДлина = СтрДлина(ИсходнаяСтрока);
    Для х = 1 По стрДлина Цикл
    симв = Сред(ИсходнаяСтрока, х, 1);
    Если ((симв > "9") ИЛИ (симв < "0")) Тогда
    ИтоговаяСтрока = ИтоговаяСтрока + симв;
    КонецЕсли;
    КонецЦикла;
```

P.S. 1Сники всё еще считаются программистами?
---
Например вот так:
Строка - это ваша строка "380000000000 (директор)" - в результате разобьется в две строки
"380000000000"
"(директор)"
Можете сделать вариант с массивом если хотите)

```1c
    Строка = СокрЛП(Строка);
    Длина = СтрДлина(Строка);
    Итог = ";
    Для Инд = 1 По Длина Цикл
    Символ = Сред(Строка,Инд,1);
    КодСимвола = КодСимвола(Символ);

    Если КодСимвола >= 48 И КодСимвола < 58 Тогда
    Итог = Итог+Символ;
    Иначе
    Итог = Итог+Символы.ПС+Сокрлп(Сред(Строка,Инд,Длина));
    Прервать
    КонецЕсли;
    КонецЦикла;
```
---
как должно быть в результате ?

380000000000
(директор) ????

А если будет +380 (067) 1123456 ? Тогда как ?
---
результат должен быть такой См. вложение...
А пользователи у меня пишут текст в поле "Номер", хотя должны писать пояснения в поле "комментарий". И таких контактов у меня около 10.000 шт. (((((
---
результат должен быть такой Тогда исходная задача поставлена некорректно: "-" (дефис) - это тоже нечисловой символ. Но его вы хотите оставить в числовой строке.

Можно делить строку на части по первому пробелу или по открывающей скобке "(", но обязательно найдется пользователь, который напишет в номере "(380)" или насует туда пробелов.

Или напишет просто "Директор" без скобок. В-общем, программно бороться с раздолбайством юзеров - неблагодарное дело.
---
"-" (дефис) тоже не должно быть... Неудачный скрин подобрал )
---
"-" (дефис) тоже не должно быть... Но и переноситься в "нечисловую" строку он тоже не должен? Должен просто отбрасываться, так?

А вот в должности. например, "инженер-технолог" - должен переноситься, да? И скобки в комментарии тоже неплохо бы убрать, верно?

Чувствуете, как интересно становится?

Короче, надо выводить этот винегрет в отдельную таблицу и, глядя на нее, подбирать оптимальный алгоритм деления на подстроки и их вычищения от мусора, чтобы алгоритм этот сработал на максимальном числе записей, не давая испорченных данных. А особо нестандартные случаи подчищать руками.

Вряд ли это подходящая задача для решения ее в рамках форума.
---
Задача изначально поставлена некорректно, об этом Вам уже написали.
Вот пример решения Вашей задачи, которую Вы ХОТЕЛИ поставить:

```1c
    &НаКлиенте
    Функция ПозицияСимволаИзСписка(СтрокаГдеИщем,СтрокаИскомыеСимволы)
    НайденнаяПозиция = СтрДлина(СтрокаГдеИщем)+1;
    Для Инд = 1 По СтрДлина(СтрокаИскомыеСимволы) Цикл
    ТекущийИндекс = Найти(СтрокаГдеИщем,Сред(СтрокаИскомыеСимволы,Инд,1));
    Если (ТекущийИндекс>0)и(ТекущийИндекс<НайденнаяПозиция) Тогда
    НайденнаяПозиция = ТекущийИндекс;
    КонецЕсли;
    КонецЦикла;
    Возврат НайденнаяПозиция;
    КонецФункции

    &НаКлиенте
    Функция СтрокуВМассивИзДвухСтрок(ИсходнаяСтрока)
    ПозицияПервогоЗначащегоСимволаИмени = ПозицияСимволаИзСписка(ИсходнаяСтрока,"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчш­щьыъэюяABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"­);
    НайденнаяПозиция = 0;
    Пока (ПозицияПервогоЗначащегоСимволаИмени>1)и(НайденнаяПозиция<>1) Цикл
    НайденнаяПозиция = ПозицияСимволаИзСписка(Сред(ИсходнаяСтрока,ПозицияПервогоЗначащегоСимволаИмени,1)," ):,");
    ПозицияПервогоЗначащегоСимволаИмени = ПозицияПервогоЗначащегоСимволаИмени-1;
    КонецЦикла;
    Строка1 = Лев(ИсходнаяСтрока,ПозицияПервогоЗначащегоСимволаИмени-1);
    Строка2 = Сред(ИсходнаяСтрока,ПозицияПервогоЗначащегоСимволаИмени);
    Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Строка2) Тогда
    Строка1 = Строка1+Строка2;
    Строка2 = ";
    КонецЕсли;
    МассивРезультат = Новый Массив;
    МассивРезультат.Добавить(Строка1);
    МассивРезультат.Добавить(Строка2);
    Возврат МассивРезультат;
    КонецФункции

    &НаКлиенте
    Процедура Команда1(Команда)
    МассивСтрок = СтрокуВМассивИзДвухСтрок(ИсходнаяСтрока);
    НомерТелефона = МассивСтрок[0];
    Должность = СокрЛП(Сред(МассивСтрок[1],2));
    КонецПроцедуры
```

Тут процедура Команда1 берёт строку ИсходнаяСтрока и заполняет из неё НомерТелефона и Должность.

Алгоритм такой:
1) находим первый символ кириллицы или латиницы (пояснение ведь должно содержать осмысленный текст?)
2) идём назад к началу строки и находим символ-разделитель (пользователь мог поставить пробел, или двоеточие, или запятую, или скобку... сами определите список допустимых разделителей)
3) Считаем, что всё, что до разделителя - это номер. Всё, что после - это пояснение.

Обратите внимание: номер сам может включать разделители. Пример: "+7 (495) 111 (22-33): Иванов А. Б." разделится на "+7 (495) 111 (22-33)" и "Иванов А. Б."

p.s. в коде длинная строка, и движок Инфостарта вставляет "<wbr>", это лишнее.
---
3) Считаем, что всё, что до разделителя - это номер. Всё, что после - это пояснение. Судя по (9) номер должен включать в себя только цифры, никаких "-" и "+".

Если так, то сделать все можно гораздо компактнее:

```1c
    СтрокаНомер=";
    СтрокаКомментарий=";
    стрДлина = СтрДлина(ИсходнаяСтрока);
    Для х = 1 По стрДлина Цикл
    симв = Сред(ИсходнаяСтрока, х, 1);
    Если ((симв >= "0") И (симв <= "9")) Тогда
    СтрокаНомер = СтрокаНомер + симв;
    ИначеЕсли (симв >= "А" И (симв <= "я")) Тогда
    СтрокаКомментарий = Сред(ИсходнаяСтрока, х);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Если (Прав(СтрокаКомментарий, 1) = ")") И (Сред(ИсходнаяСтрока, х-1, 1) = "(")) Тогда
    СтрокаКомментарий = Лев(СтрокаКомментарий, СтрДлина(СтрокаКомментарий) - 1);
    КонецЕсли;
```

А то потом жалобы - и почему 1С так медленно работает?

Заодно удаляются скобки, обрамляющие комментарий. Если они нужны, то алгоритм можно чуть-чуть изменить.

Но все равно, независимо от алгоритма, считаю, что надо писать обработку, которая считает в таблицу или в файл исходные данные, попытается обработать их, покажет результат обработки (номера и комментарии), чтобы понять - насколько алгоритм учитывает все варианты пользовательской фантазии и потом загрузит данные обратно в базу.
---
Вот пример разложения в подстроки с использованием БСП:

```1c
    Функция РазложитьНаМногострочнуюСВыделениемЦифр(ИсходнаяСтрока)
    МассивНеСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов(ИсходнаяСтрока,"0123456789");
    ТекущийОтрезок = ИсходнаяСтрока;
    Результат = ";
    Пока НЕ ПустаяСтрока(ТекущийОтрезок) Цикл
    Если МассивНеСтрок.Количество()=0 Тогда
    Результат = Результат+Символы.ПС+ТекущийОтрезок;
    ТекущийОтрезок = ";
    Иначе
    ИндексНеЦифровогоОтрезка = Найти(ТекущийОтрезок,МассивНеСтрок[0]);
    Результат = Результат+Символы.ПС+Лев(ТекущийОтрезок,ИндексНеЦифровогоОтрезка-1);
    Результат = Результат+Символы.ПС+МассивНеСтрок[0];
    ТекущийОтрезок = Сред(ТекущийОтрезок,ИндексНеЦифровогоОтрезка+СтрДлина(МассивНеСтрок[0]));
    МассивНеСтрок.Удалить(0);
    КонецЕсли;
    КонецЦикла;
    Результат = Сред(Результат,2); //первый символ ПС лишний
    Возврат Результат;
    КонецФункции
```

Тут алгоритм маленько оптимизирован: перебирает не посимвольно, а отрезками
---
задайте маску (формат) в самом поле "Номер", чтобы туда только цифры можно было вводить и будет вам счастье ))))
---
Надо делать проще.
Постфактум (раз в день или неделю) проверять введённые данные. И по результату жестоко ми^W извините, наказывать виновных.
Иные варианты не пройдут
---
Безусловно, рецепт хороший, просто отличный. У него только один недостаток, как и у способа из (11) - он никак не помогает разгрести 10 тысяч записей уже существующего бардака.
---
Ещё как поможет. Поднять журнал регистрации и раздать всем сестрам по серьгам. Пусть они руками разгребают.
---
Уффф! Одни верят во всемогущество программных методов, другие - административных. Ошибаются и те, и другие.

Во-первых, ваш совет не учитывает трудозатраты на разгребание журнала и выявление виновных по каждой из косячных записей.

Во-вторых, тысячи контрагентов не нарабатываются за неделю или месяц, часть сестер наверняка уже уволилась и придется их серьги раздавать другим. Или навешивать их на автора ветки, которому придется делать что? Правильно, писать обработку! Которая обработает все записи.

И какой тогда смысл зверствовать?