Удаление всех символов, кроме цифр, в 1С – распространенная задача при обработке данных, например, при приведении телефонных номеров или артикулов к единому формату. Существует несколько способов решения этой задачи с использованием встроенных функций 1С. Рассмотрим основные методы.
Удаление нецифровых символов в 1С
1. Использование цикла и функции Сред()
Этот способ предполагает перебор каждого символа в строке и проверку, является ли он цифрой. Если символ не является цифрой, он удаляется.
Функция УдалитьНецифровыеСимволы(СтрокаИсточник)
Результат = "";
Для Счетчик = 1 По СтрДлина(СтрокаИсточник) Цикл
Символ = Сред(СтрокаИсточник, Счетчик, 1);
Если Найти("0123456789", Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Пример использования:
ИсходнаяСтрока = "+7 (916) 123-45-67";
ОчищеннаяСтрока = УдалитьНецифровыеСимволы(ИсходнаяСтрока);
Сообщить(ОчищеннаяСтрока); // Выведет "79161234567"
Преимущества:
- Простота и понятность кода.
- Не требует использования регулярных выражений или других сложных инструментов.
Недостатки:
- Может быть относительно медленным при обработке очень длинных строк.
- Требует написания цикла.
2. Использование регулярных выражений (если поддерживается в вашей версии 1С)
Начиная с версии 8.3.10, в 1С появилась поддержка регулярных выражений. Этот способ является более эффективным и лаконичным, особенно для сложных задач.
Функция УдалитьНецифровыеСимволыRegExp(СтрокаИсточник)
РегулярноеВыражение = Новый COMОбъект("VBScript.RegExp");
РегулярноеВыражение.Pattern = "[^0-9]"; // Все, кроме цифр
РегулярноеВыражение.Global = Истина;
Результат = РегулярноеВыражение.Replace(СтрокаИсточник, "");
Возврат Результат;
КонецФункции
// Пример использования:
ИсходнаяСтрока = "+7 (916) 123-45-67";
ОчищеннаяСтрока = УдалитьНецифровыеСимволыRegExp(ИсходнаяСтрока);
Сообщить(ОчищеннаяСтрока); // Выведет "79161234567"
Преимущества:
- Более эффективный код (особенно для длинных строк).
- Более лаконичный код.
- Возможность использования сложных шаблонов поиска и замены.
Недостатки:
- Требует понимания регулярных выражений.
- Работает только в версиях 1С, поддерживающих COM-объект "VBScript.RegExp" (начиная с 8.3.10).
- Зависимость от COM-объекта, что может потребовать дополнительных настроек на сервере 1С.
3. Использование СтрЗаменить() в цикле (альтернативный способ без RegExp)
Этот способ является альтернативой регулярным выражениям и подходит для версий 1С, не поддерживающих COM-объект VBScript.RegExp. Он предполагает замену каждого нецифрового символа на пустую строку с помощью функции СтрЗаменить().Функция УдалитьНецифровыеСимволыСтрЗаменить(СтрокаИсточник)
СимволыДляУдаления = "";
Для КодСимвола = 0 По 255 Цикл // Проходим по всем возможным символам
Символ = Символ(КодСимвола);
Если Найти("0123456789", Символ) = 0 Тогда // Если символ не цифра
СимволыДляУдаления = СимволыДляУдаления + Символ;
КонецЕсли;
КонецЦикла;
Результат = СтрокаИсточник;
Для Счетчик = 1 По СтрДлина(СимволыДляУдаления) Цикл
Символ = Сред(СимволыДляУдаления, Счетчик, 1);
Результат = СтрЗаменить(Результат, Символ, "");
КонецЦикла;
Возврат Результат;
КонецФункции
// Пример использования:
ИсходнаяСтрока = "+7 (916) 123-45-67";
ОчищеннаяСтрока = УдалитьНецифровыеСимволыСтрЗаменить(ИсходнаяСтрока);
Сообщить(ОчищеннаяСтрока); // Выведет "79161234567"
Преимущества:
- Работает в любой версии 1С.
- Не требует использования COM-объектов.
Недостатки:
- Может быть медленнее, чем использование регулярных выражений.
- Код более сложный, чем при использовании цикла и функции Сред().
- Создает строку СимволыДляУдаления, что может быть не оптимально для больших объемов данных.
4. Использование StringFunctionsClientServer (только для клиент-серверного варианта)
Если вы работаете в клиент-серверном варианте 1С, можно использовать библиотеку StringFunctionsClientServer, которая предоставляет функцию Substitute. Она позволяет удалить все символы, указанные в качестве второго аргумента.
//Внимание! Этот код будет работать только в клиент-серверном варианте 1С!
Функция УдалитьНецифровыеСимволыStringFunctions(СтрокаИсточник) Экспорт
Возврат StringFunctionsClientServer.Substitute(СтрокаИсточник, " ", Символы.ПС, Символы.ВК, "-", "(", ")", "+", ".");
КонецФункции
Преимущества:
- Простота использования.
- Оптимизированная работа на сервере.
Недостатки:
- Работает только в клиент-серверном варианте 1С.
- Ограниченная гибкость (нужно перечислять все символы для удаления).
- Если нужно удалять символы динамически, этот метод не подходит.
Выбор способа
Рекомендации:
- Если вы работаете в версии 1С 8.3.10 или выше, используйте регулярные выражения (способ 2). Это наиболее эффективный и лаконичный способ.
- Если вы работаете в более ранней версии 1С или не хотите использовать COM-объекты, используйте цикл и функцию Сред() (способ 1).
- Если вам нужно оптимизировать производительность и вы работаете в клиент-серверном варианте, используйте StringFunctionsClientServer (способ 4), но учитывайте ограниченную гибкость.
- Перед использованием любого способа протестируйте его на копии базы данных, чтобы убедиться, что он работает правильно и не приводит к нежелательным последствиям.
Важно! При выборе способа учитывайте версию вашей 1С, требования к производительности и ваши навыки программирования.