При импорте данных из внешних источников, таких как файлы Excel или текстовые документы, разработчики часто сталкиваются с проблемой «грязных» данных. Номера телефонов могут быть записаны в самых разных форматах: со скобками, с тире, начинаться на «8», «7» или вообще не иметь кода страны. Для корректной работы CRM-системы, интеграции с IP-телефонией или просто для эстетического единообразия в справочнике Партнеры или Контрагенты, необходимо привести эти данные к единой маске, например: +7(XXX)XXX-XX-XX.
В этой статье мы разберем несколько подходов к решению этой задачи — от простых манипуляций со строками до использования регулярных выражений и возможностей современных конфигураций 1С.
Рассмотрим классический подход, предложенный опытными участниками форума. Если мы получаем данные из Excel, как в примере автора (Ехсел.Cells(СчетчикЦикла,8).value), нам сначала нужно очистить строку от всего лишнего и только потом накладывать нужный формат.
Разберем процесс по шагам:
Посмотрим на пример кода, который реализует эту логику:
Функция ПривестиНомерКФормату(Знач ВходящийНомер) Экспорт
// 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;
КонецЕсли;
Возврат ВходящийНомер; // Если не распознали, возвращаем как было
КонецФункции
Если мы работаем в современной среде 1С v8.3, использование циклов для перебора каждого символа — не самый эффективный путь. Проанализируем ситуацию: нам нужно быстро «выкусить» все нецифровые знаки. Здесь на помощь приходят регулярные выражения. Это значительно ускоряет обработку больших массивов данных из Excel.
Для реализации этого метода в Windows-окружении мы можем использовать объект VBScript.RegExp. Выясним, как это упрощает код:
РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.Global = Истина;
РегВыражение.IgnoreCase = Истина;
РегВыражение.Pattern = "\D"; // Ищем все, что НЕ является цифрой
ОчищенныйНомер = РегВыражение.Replace(ВходящаяСтрока, "");
После такой очистки нам остается только применить логику замены первой восьмерки на семерку и вставить форматирующие символы. Этот способ надежнее и работает быстрее на больших файлах.
Программистам, работающим с типовыми конфигурациями (УТ 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С лучше комбинировать регулярные выражения для очистки и стандартные механизмы БСП для хранения информации.