Как программно привести номера телефонов к единому формату в 1С?

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

При импорте данных из внешних источников, таких как файлы Excel или текстовые документы, разработчики часто сталкиваются с проблемой «грязных» данных. Номера телефонов могут быть записаны в самых разных форматах: со скобками, с тире, начинаться на «8», «7» или вообще не иметь кода страны. Для корректной работы CRM-системы, интеграции с IP-телефонией или просто для эстетического единообразия в справочнике Партнеры или Контрагенты, необходимо привести эти данные к единой маске, например: +7(XXX)XXX-XX-XX.

В этой статье мы разберем несколько подходов к решению этой задачи — от простых манипуляций со строками до использования регулярных выражений и возможностей современных конфигураций 1С.

Метод 1: Базовый алгоритм обработки строк

Рассмотрим классический подход, предложенный опытными участниками форума. Если мы получаем данные из Excel, как в примере автора (Ехсел.Cells(СчетчикЦикла,8).value), нам сначала нужно очистить строку от всего лишнего и только потом накладывать нужный формат.

Разберем процесс по шагам:

  1. Очистка строки: Удаляем все символы, которые не являются цифрами (пробелы, скобки, тире, плюсы).
  2. Анализ длины: Проверяем, сколько цифр осталось. Обычно это 10 (без кода страны) или 11 (с кодом 7 или 8).
  3. Нормализация префикса: Если номер начинается с 8, заменяем её на 7.
  4. Наложение маски: Разбиваем очищенную строку на части и склеиваем в нужном нам виде.

Посмотрим на пример кода, который реализует эту логику:


Функция ПривестиНомерКФормату(Знач ВходящийНомер) Экспорт
    // 1. Очистка от мусора
    ТолькоЦифры = "";
    Для Индекс = 1 По СтрДлина(ВходящийНомер) Цикл
        Символ = Сред(ВходящийНомер, Индекс, 1);
        Если Найти("0123456789", Символ) > 0 Тогда
            ТолькоЦифры = ТолькоЦифры + Символ;
        КонецЕсли;
    КонецЦикла;

    // 2. Логика префиксов (для РФ)
    Длина = СтрДлина(ТолькоЦифры);
    Если Длина = 10 Тогда
        ТолькоЦифры = "7" + ТолькоЦифры;
    ИначеЕсли Длина = 11 Тогда
        Если Лев(ТолькоЦифры, 1) = "8" Тогда
            ТолькоЦифры = "7" + Сред(ТолькоЦифры, 2);
        КонецЕсли;
    КонецЕсли;

    // 3. Форматирование по маске +7(XXX)XXX-XX-XX
    Если СтрДлина(ТолькоЦифры) = 11 Тогда
        КодГорода = Сред(ТолькоЦифры, 2, 3);
        Тело1 = Сред(ТолькоЦифры, 5, 3);
        Тело2 = Сред(ТолькоЦифры, 8, 2);
        Тело3 = Сред(ТолькоЦифры, 10, 2);
        Возврат "+7(" + КодГорода + ")" + Тело1 + "-" + Тело2 + "-" + Тело3;
    КонецЕсли;

    Возврат ВходящийНомер; // Если не распознали, возвращаем как было
КонецФункции

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

Если мы работаем в современной среде 1С v8.3, использование циклов для перебора каждого символа — не самый эффективный путь. Проанализируем ситуацию: нам нужно быстро «выкусить» все нецифровые знаки. Здесь на помощь приходят регулярные выражения. Это значительно ускоряет обработку больших массивов данных из Excel.

Для реализации этого метода в Windows-окружении мы можем использовать объект VBScript.RegExp. Выясним, как это упрощает код:


РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.Global = Истина;
РегВыражение.IgnoreCase = Истина;
РегВыражение.Pattern = "\D"; // Ищем все, что НЕ является цифрой
ОчищенныйНомер = РегВыражение.Replace(ВходящаяСтрока, "");

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

Метод 3: Использование возможностей БСП

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

Функция УправлениеКонтактнойИнформацией.СформироватьНомерТелефона() позволяет преобразовывать строки в структурированные данные. Система сама умеет определять коды стран и применять маски, заданные в настройках программы. Если ваша задача — не просто вывести текст, а правильно записать его в базу 1С, лучше использовать штатные средства заполнения XML-структуры контактной информации.

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

Обработка сложных случаев: добавочные номера и мусор в строках

Выясним причину, по которой простые алгоритмы могут давать сбой. Часто в ячейках Excel встречаются записи вида: +7 495 123-45-67 доб. 12 или 8-916-111-22-33, спросить Марину.

В таких случаях рекомендуется:

Проверка на уникальность (Дедупликация)

Проанализируем еще один важный момент. Когда мы приводим все номера к виду +7(999)123-45-67, внезапно может выясниться, что один и тот же клиент заведен в базе несколько раз под разными именами.

Рекомендуем перед записью очищенного номера в объект Партнер выполнять поиск по базе. Сравнивать лучше именно «голые» цифры. Это позволит избежать дублирования информации и навести порядок в CRM-системе еще на этапе загрузки данных.

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

← На главную