В процессе разработки конфигураций на платформе 1С часто возникает задача нормализации контактных данных. Одной из самых распространенных проблем является разнобой в форматах записи мобильных телефонов: пользователи могут вводить их через «8», «7», без кода страны, с пробелами, дефисами или в скобках. Для корректной работы SMS-рассылок или интеграций с телефонией нам необходимо привести эти данные к единому международному стандарту E.164 (например, +79991234567). Для организации рассылки по подготовленным контактам можно использовать расширение для универсальной отправки СМС.
В данной статье мы подробно разберем, как реализовать механизм преобразования и валидации номера телефона, используя различные подходы: от стандартных функций БСП до регулярных выражений и «ручного» парсинга строк. Подобный функционал востребован при автоматическом извлечении контактных данных из писем для быстрого создания контрагентов и заказов в 1С.
Если ваша конфигурация построена на базе БСП (что актуально для большинства современных решений, таких как 1С:ERP, 1С:УТ 11 или 1С:БП 3.0), в ней уже заложены мощные инструменты для работы с контактной информацией. Разберем, как ими воспользоваться.
Основным инструментом здесь выступает общий модуль УправлениеКонтактнойИнформацией. В нем содержатся функции, которые позволяют не только форматировать номер, но и разбирать его на составляющие (код страны, код города, номер).
Рассмотрим пример использования программного интерфейса БСП для нормализации номера:
// Пример приведения номера к международному формату через БСП
Функция НормализоватьНомерТелефонаБСП(Знач ВходящийНомер) Экспорт
// Очищаем номер от лишних символов (пробелы, скобки и т.д.)
ОчищенныйНомер = УправлениеКонтактнойИнформацией.ТолькоЦифры(ВходящийНомер);
// Если номер начинается с 8, заменяем на 7
Если Лев(ОчищенныйНомер, 1) = "8" Тогда
ОчищенныйНомер = "7" + Сред(ОчищенныйНомер, 2);
КонецЕсли;
// Проверяем корректность структуры через БСП (если доступно в версии)
// В некоторых версиях используется функция ПреобразоватьТелефон
Результат = УправлениеКонтактнойИнформациейСлужебный.ПреобразоватьТелефон(ОчищенныйНомер);
Возврат Результат;
КонецФункции
Важно помнить, что БСП хранит контактную информацию в виде XML или JSON строки во внутреннем реквизите ЗначенияПолей. Если вы работаете с типовой формой ввода, система сама применит нужные маски и правила валидации.
Если вы работаете в самописной конфигурации или не хотите зависеть от тяжелых модулей БСП, можно реализовать алгоритм «очистки» самостоятельно. Проанализируем последовательность действий, которую необходимо выполнить:
Посмотрим на программную реализацию этой логики:
Функция ПривестиНомерКФормату(Знач ИсходныйТекст) Экспорт
// Шаг 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" Тогда
Возврат "+" + ТолькоЦифры;
Иначе
// Номер некорректен или не является мобильным РФ
Возврат Неопределено;
КонецЕсли;
КонецФункции
Для более гибкой и быстрой проверки, особенно когда нужно проверить номер на соответствие сложному шаблону, выясним, как применить объект 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(Телефон, "");
Возврат Результат;
КонецФункции
При проектировании системы нормализации телефонов, проанализируем следующие важные аспекты: для масштабных задач по обработке информации в закрытых системах применяют программных роботов для автоматизации действий пользователя, настраивая сценарии проверки и переноса данных.
Сред(ТолькоЦифры, 2, 1) = "9" следует расширить или убрать.ПолеВвода) всегда лучше устанавливать Маску. Например, +7 (###) ###-##-##. Это значительно снизит вероятность ввода некорректных данных еще на этапе ввода.990).Выясним, какой метод выбрать. Если вы работаете в типовой конфигурации — БСП является приоритетом. Если вам нужна максимальная производительность и независимость от конфигурации — используйте регулярные выражения. Для простых задач вполне достаточно ручного перебора символов, так как он наиболее прозрачен для отладки.
Таким образом, мы разобрали основные подходы к форматированию мобильных номеров в 1С. Сочетание строгой валидации на входе и автоматического преобразования при записи позволит вам поддерживать базу контактов в идеальном порядке. Подобная точность данных критична, например, при настройке отправки SMS-уведомлений о заказах Wildberries по схеме FBS.