Как преобразовать номер мобильного телефона к формату +79000000000 и проверить его корректность в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки конфигураций на платформе 1С часто возникает задача нормализации контактных данных. Одной из самых распространенных проблем является разнобой в форматах записи мобильных телефонов: пользователи могут вводить их через «8», «7», без кода страны, с пробелами, дефисами или в скобках. Для корректной работы SMS-рассылок или интеграций с телефонией нам необходимо привести эти данные к единому международному стандарту E.164 (например, +79991234567). Для организации рассылки по подготовленным контактам можно использовать расширение для универсальной отправки СМС.

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

Метод 1. Использование возможностей БСП (Библиотеки стандартных подсистем)

Если ваша конфигурация построена на базе БСП (что актуально для большинства современных решений, таких как 1С:ERP, 1С:УТ 11 или 1С:БП 3.0), в ней уже заложены мощные инструменты для работы с контактной информацией. Разберем, как ими воспользоваться.

Основным инструментом здесь выступает общий модуль УправлениеКонтактнойИнформацией. В нем содержатся функции, которые позволяют не только форматировать номер, но и разбирать его на составляющие (код страны, код города, номер).

Рассмотрим пример использования программного интерфейса БСП для нормализации номера:


// Пример приведения номера к международному формату через БСП
Функция НормализоватьНомерТелефонаБСП(Знач ВходящийНомер) Экспорт
    
    // Очищаем номер от лишних символов (пробелы, скобки и т.д.)
    ОчищенныйНомер = УправлениеКонтактнойИнформацией.ТолькоЦифры(ВходящийНомер);
    
    // Если номер начинается с 8, заменяем на 7
    Если Лев(ОчищенныйНомер, 1) = "8" Тогда
        ОчищенныйНомер = "7" + Сред(ОчищенныйНомер, 2);
    КонецЕсли;
    
    // Проверяем корректность структуры через БСП (если доступно в версии)
    // В некоторых версиях используется функция ПреобразоватьТелефон
    Результат = УправлениеКонтактнойИнформациейСлужебный.ПреобразоватьТелефон(ОчищенныйНомер);
    
    Возврат Результат;
КонецФункции

Важно помнить, что БСП хранит контактную информацию в виде XML или JSON строки во внутреннем реквизите ЗначенияПолей. Если вы работаете с типовой формой ввода, система сама применит нужные маски и правила валидации.

Метод 2. Ручная обработка строки (универсальный алгоритм)

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

  1. Удаление мусора: исключаем из строки все символы, кроме цифр.
  2. Анализ префикса: обрабатываем ситуации с «8», «7» и номерами без кода страны.
  3. Проверка длины: для мобильных номеров РФ итоговая длина должна составлять 11 цифр.
  4. Валидация второй цифры: согласно правилам выделения DEF-кодов, мобильные номера начинаются на «9».

Посмотрим на программную реализацию этой логики:


Функция ПривестиНомерКФормату(Знач ИсходныйТекст) Экспорт
    
    // Шаг 1: Оставляем только цифры
    ТолькоЦифры = "";
    Для Позиция = 1 По СтрДлина(ИсходныйТекст) Цикл
        Символ = Сред(ИсходныйТекст, Позиция, 1);
        Если СтрНайти("0123456789", Символ) > 0 Тогда
            ТолькоЦифры = ТолькоЦифры + Символ;
        КонецЕсли;
    КонецЦикла;
    
    // Шаг 2: Обработка кода страны
    Длина = СтрДлина(ТолькоЦифры);
    
    Если Длина = 10 И Лев(ТолькоЦифры, 1) = "9" Тогда
        // Номер вида 9031234567 -> добавляем 7
        ТолькоЦифры = "7" + ТолькоЦифры;
    ИначеЕсли Длина = 11 Тогда
        Если Лев(ТолькоЦифры, 1) = "8" Тогда
            // Номер вида 89031234567 -> меняем 8 на 7
            ТолькоЦифры = "7" + Сред(ТолькоЦифры, 2);
        КонецЕсли;
    КонецЕсли;
    
    // Шаг 3: Финальная проверка и добавление плюса
    Если СтрДлина(ТолькоЦифры) = 11 И Сред(ТолькоЦифры, 2, 1) = "9" Тогда
        Возврат "+" + ТолькоЦифры;
    Иначе
        // Номер некорректен или не является мобильным РФ
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции

Метод 3. Использование регулярных выражений (RegExp)

Для более гибкой и быстрой проверки, особенно когда нужно проверить номер на соответствие сложному шаблону, выясним, как применить объект VBScript.RegExp. Этот способ хорош тем, что позволяет одной командой удалить все лишнее или проверить структуру номера.

Рассмотрим пример функции, которая проверяет номер на соответствие формату мобильного телефона РФ:


Функция НомерТелефонаВалиден(Знач Телефон) Экспорт
    
    RegExp = Новый COMОбъект("VBScript.RegExp");
    
    // Паттерн: возможный +, затем 7 или 8, возможные скобки/тире,
    // затем обязательно 9, и еще 9 цифр с возможными разделителями
    RegExp.Pattern = "^(\+7|7|8)?[\s\-]?\(?9\d{2}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}$";
    RegExp.IgnoreCase = Истина;
    RegExp.Global = Ложь;
    
    Возврат RegExp.Test(Телефон);
    
КонецФункции

Чтобы не только проверить, но и очистить номер с помощью регулярных выражений, мы можем использовать метод Replace. Проанализируем ситуацию, когда нам нужно быстро удалить все нецифровые символы:


Функция ОчиститьСимволыRegExp(Знач Телефон)
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.Pattern = "[^\d]"; // Найти всё, что НЕ является цифрой
    RegExp.Global = Истина;
    
    Результат = RegExp.Replace(Телефон, "");
    Возврат Результат;
КонецФункции

Нюансы и важные замечания

При проектировании системы нормализации телефонов, проанализируем следующие важные аспекты: для масштабных задач по обработке информации в закрытых системах применяют программных роботов для автоматизации действий пользователя, настраивая сценарии проверки и переноса данных.

  1. Городские номера: Помните, что номера могут начинаться не только на «9» (мобильные), но и на «4» (например, Москва 495, 499). Если ваша система должна поддерживать и городские номера, условие Сред(ТолькоЦифры, 2, 1) = "9" следует расширить или убрать.
  2. Международные звонки: Если ваши клиенты могут быть не только из России, жесткая привязка к длине в 11 символов и коду «7» будет ошибочной. В этом случае необходимо использовать справочник кодов стран.
  3. Маски ввода: Для удобства пользователя на уровне интерфейса (в свойствах ПолеВвода) всегда лучше устанавливать Маску. Например, +7 (###) ###-##-##. Это значительно снизит вероятность ввода некорректных данных еще на этапе ввода.
  4. DEF-коды: Для максимально точной проверки можно загрузить в систему реестр выделенных диапазонов номеров. Это позволит отличить реальный мобильный номер от выдуманного (например, проверить, существует ли код 990).

Выясним, какой метод выбрать. Если вы работаете в типовой конфигурации — БСП является приоритетом. Если вам нужна максимальная производительность и независимость от конфигурации — используйте регулярные выражения. Для простых задач вполне достаточно ручного перебора символов, так как он наиболее прозрачен для отладки.

Таким образом, мы разобрали основные подходы к форматированию мобильных номеров в 1С. Сочетание строгой валидации на входе и автоматического преобразования при записи позволит вам поддерживать базу контактов в идеальном порядке. Подобная точность данных критична, например, при настройке отправки SMS-уведомлений о заказах Wildberries по схеме FBS.

← На главную