Как отформатировать строку по маске
Например, есть необходимость имеющийся номер телефона «9031234523» или «+79031234567» преобразовать к формату «+7 (903) 123 45 67». Как это легко и быстро сделать штатными средствами 1С без использования регулярных выражений |
Автор статьи: askharlov | Редакторы: Последняя редакция №3 от 01.11.17 | История URL: http://kb.mista.ru/article.php?id=953 |
Ключевые слова: формат, маска, регулярные выражения
Входящие параметры:
— НомерТелефона. Например: «79031232334»
Дополнительный инструментарий:
— Элемент формы поле вода «Телефон» с установленной маской. Например: «+7 (999) 999 99 99»
Результат:
— НомерТелефонаСМаской
Пример кода:
МаскаТелефона = ЭлементыФормы.Телефон.Маска;
КвоЦифрВМаске = 0;
Если НЕ ПустаяСтрока(МаскаТелефона) Тогда
Для НомерСимволаМаски = 1 По СтрДлина(МаскаТелефона) Цикл
ТекущийСимволМаски = Сред(МаскаТелефона, НомерСимволаМаски, 1);
Если ТекущийСимволМаски = "9" Тогда
КвоЦифрВМаске = КвоЦифрВМаске + 1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если КвоЦифрВМаске = 0 Тогда
ТелефонДляМаски = НомерТелефона;
Иначе
ТелефонДляМаски = Прав(НомерТелефона, КвоЦифрВМаске);
КонецЕсли;
ЭлементыФормы.Телефон.Значение = ТелефонДляМаски; // применяем маску
НомерТелефонаСМаской = ЭлементыФормы.Телефон.Значение; // получаем строку с маской
Естественно, если в НомерТелефона присутствуют нецифровые символы (например пробелы или «(« или
«)»), то можно предварительно его обработать, оставив только цифры
При заполнении телефонов в контактной информации партнеров, контрагентов, контактных и физических лиц система не делает никакой проверки ни по длине номера (количеству цифр), ни по шаблону (маске). Можно использовать или не использовать в телефоне пробелы, тире, круглые скобки и т.п. В случае, если у вас подключена телефония или настроена отправка смс из информационной базы, отсутствие стандартизации и шаблонизации при вводе телефонов может привести к различным сбоям. Например, отправка смс перестает работать, если в номере телефона присутствуют любые символы, кроме цифр.
Эта разработка решает несколько задач:
- позволяет для конкретного справочника настроить шаблон ввода телефона (маску),
- выводит список уже заведенных в базе элементов справочников, телефон в которых не соответствует настроенной маске,
- обрабатывает все имеющиеся в базе телефоны для соответствия настроенной маске,
- проверяет перед записью элементов справочников корректность ввода телефона (соответствие шаблону).
После добавления расширения в базу появляется новая команда в разделе Администрирование.
Нажав на команду, получаем список настроек стандартизации телефонных номеров, создаем новую настройку.
В настройке нужно выбрать справочник и ввести шаблон телефонного номера (в шаблоне должно быть 10 русских символов Х, которые при обработке заменяются на конкретные цифры).
Если вам нужно применять шаблон только к мобильным номерам, устанавливайте признак Только сотовые.
Выделив нужную настройку в списке, можем посмотреть список некорректных телефонов по данной настройке.
Для исправления некорректных номеров выделяем нужную настройку в списке и нажимаем Изменить по шаблону.
По окончании появится протокол.
Далеко не все некорректные телефоны отредактированы — в некоторых просто не хватает цифр, а другие не относятся к сотовым телефонам.
Если при создании (или редактировании) элемента справочника ввести номер телефона не по шаблону, разработка автоматически его изменит и приведет в соответствие с шаблоном.
Для корректной работы расширения необходимо отключить Безопасный режим:
Используя данное расширение, вы легко наведете порядок в своей телефонной базе и защитите себя от сбоев в работе телефонии и при отправке смс, вызванных некорректным форматом номера телефона.
Релиз 1.1.1.2 от 15.09.2020
Добавлен контроль уникальности телефонного номера перед записью справочников.
К примеру, перед записью партнера разработка будет проверять, существует ли в базе другой партнер с таким же телефоном. Если да, то новый не запишется, и будет показано уведомление.
Для корректной работы расширения режим совместимости вашей конфигурации должен быть не ниже 8.3.12.
Содержание:
1. Что такое поле Маска ввода
2. Ограничения в масках ввода в 1С
1. Что такое поле Маска ввода
В данной статье будет описано, что такое поле «Маска ввода» в 1С. Также будут приведены все форматы и ограничители, которые доступны в поле «Маска ввода».
Когда в системе 1С есть поле ввода, которое имеет тип «строка», то в таком случае к нему есть возможность применить маску ввода данных. Данная функция отвечает за форматирование внешнего вида информации и за её количество. Маска ввода может находить практическое применение: маска ввода даты, маска ввода номера телефона, кода из сообщения.
Сама маска ввода может быть задана и при помощи конфигуратора, и текстом программы.
2. Ограничения в масках ввода в 1С
Рассмотрим, какие существуют форматы и ограничители свойств масок ввода в системе 1С.
Форматы-ограничители для поля «Маска ввода»:
· 9 – вводиться могут только цифры;
· # — вводиться могут все цифры, пробел и знаки «+» и «-»;
· h – вводиться могут только шестеричные цифры;
· @ — вводиться могут буквенные символы, при этом все они будут становиться верхним регистром;
· N – вводиться могут любые буквенные символы, регистр при этом не меняется;
· U – аналогично «@» — можно вводить буквенные символы, и они будут преобразованы в верхний регистр;
· I – можно вводить любые символы, но все они будут преобразованы в верхний регистр;
· X – вводиться могут любые символы латиницы.
Чтобы запретить вводить какой-либо конкретный знак, это нужно прописать до того, как сделать маску ввода.
Символы «.», «(», «)», «-» и «,» также могут быть прописаны в маске ввода, с их помощью происходит форматирование строки. Рассмотрим примеры заданий масок ввода:
Пример №1: пусть нужно сделать маску ввода телефона, при этом, в нём должен присутствовать код города. В таком случае в системе 1С нужно написать маску ввода «9 (999) 999 99 99».
Пример №2: пусть нужно вводить в поле информацию кода накладной, вида «код.подразделение.месяц.год», в этом случае маска ввода будет выглядеть следующим образом – «UUUU.99.9999».
Замечание: при задании маски ввода её длина должна соответствовать длине строки. В случае, когда в строке может быть несколько форматов, потребуется написать несколько масок ввода — через точку с запятой.
Пример №3: пусть нужно ввести либо мобильный номер телефона, либо домашний (городской), тогда маска ввода номера будет выглядеть следующим образом – «9 (999) 999 99 99;999-99-99».
Если поместить значение из маски ввода в текст, который имеет привязку к данному полю, то значения преобразуются следующим образом: если в маске ввода символ «@», при этом в строке находится пробел, то пробел будет удалён.
Если в маске ввода есть только символы «@», то из текста все значения (которые не специальные символы) будут удалены после крайнего блока, заполненного символами «@».
Пример №4: пусть есть маска ввода следующего вида – «@@.@@.@@», а текст ввели «35. 3. .», данный текст будет преобразован в «35.3».
Чтобы прописать в маске ввода один из символов, который является специальным, необходимо перед данным символом поставить «».
В данной статье было описано, что такое маска ввода в 1С, а также описаны все критерии, параметры и форматирование масок ввода с примерами того, как они работают на практике.
Специалист компании «Кодерлайн»
Айдар Фархутдинов
На php
Источник:
<?php /** * Проверка корректности телефонного номера (с кодом города) в начале строки. * Пример строки с корректным тел. номером: "8-495-1234567, 111-22-33 (*620)". * * Функция умеет форматировать тел. номер в международный формат. * Пример строки с форматированным тел. номером : "+7 (495) 123-45-67, 111-22-33 (*620)". * * @param string $s тел. номер * @param array &$parsed массив частей тел. номера с ключами: * zone -- зона, например: +7 * code -- код города, например: 495 (целое число типа int) * number -- номер, например: 1234567 (целое число типа int) * main -- тел. номер в международном формате * extra -- остаток после тел. номера * all -- тел. номер в международном формате + остаток * @param string $hyphen дефис для форматироания тел. номера в международном формате * @param string $space пробел для форматироания тел. номера в международном формате * @return bool возвращает TRUE, если тел. номер корректный и FALSE в противном случае. * * @link http://ru.wikipedia.org/wiki/Телефонный_код_страны * * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ * @author Nasibullin Rinat <n a s i b u l l i n at starlink ru> * @charset ANSI * @version 3.1.0 */ function phone_number_check($s, &$parsed = null, $hyphen = "xe2x80x93", $space = "xc2xa0") { static $trans = array( #DEPRECATED: #'-' => ' ', #'(' => ' ', #')' => ' ', "t" => ' ', # [TAB] "xc2xa0" => ' ', # UTF-8 "xe2x88x92" => '-', # UTF-8 − "xe2x80x93" => '-', # UTF-8 – "xe2x80x94" => '-', # UTF-8 — ); #коды номеров городских телефонов России #TODO дополнить список с крупными городами России static $city_codes = array( 495 => '', #Москва 499 => '', #Москва 496 => '', #Московская область 812 => '', #Санкт-Петербург ); /* Примеры правильных тел. номеров: #3 #4 #5 #6 (812) 571-84-78 (4922) 33-64-32 (41322) 977-17 */ $s = trim(preg_replace('/x20x20+/s', ' ', strtr($s, $trans))); #вырезаем лишние пробелы if (! preg_match('/^ (?!-) (?P<zone>+d|8)? #1 зона или код выхода на межгород (необязательно) (?:x20?(|(-|^)) #2 (?P<code>d{3,5}) #3 код города или региона для мобильного номера (?(2)-|)x20?) #условные подмаски (d{2,3}) #4 первая группа -? (d{2}) #5 вторая группа ( #6 -? (d{2}) #7 третья группа (необязательно) )? (?!d) (.*) #8 $/sx', $s, $m)) return false; $zone = ($m['zone'] === '' || $m['zone'] === '8' ? '+7' : $m['zone']); $code = $m['code']; $number = $m[4] . $m[5] . @$m[7]; if (strlen($code . $number) !== 10) return false; #всего д.б. 10 цифр! /* Номер __городского__ телефона НЕ может начинаться с нуля или восьмёрки (мобильный может) 0 зарезервирован за спецслужбами (01, 02, 03, 04, 09) 8 зарезервирован за кодом междугородного вызова */ if (array_key_exists($code, $city_codes) && preg_match('/^[08]/s', $number)) return false; #защита "от дурака" для номеров типа 222-22-22 if (preg_match('/^(d)\1{6,}/s', $number)) return false; #форматируем тел. номер в международный формат $main = str_replace('-', $hyphen, $zone . $space . '(' . $code . ')' . $space . $m[4] . '-' . $m[5] . (array_key_exists(7, $m) ? '-' . $m[7] : '') ); $parsed = array( 'zone' => $zone, 'code' => intval($code), 'number' => intval($number), 'main' => $main, 'extra' => $m[8], 'all' => $main . $m[8], ); #d($parsed); return true; } ?>