Консультация Беларусь
Консультация Россия
Блог

Учимся работать с маской телефона

Постановка задачи:

В справочнике "Информационные карты" хранятся карты покупателей разных видов, в том числе дисконтные карты. Изначально в справочнике нет возможности хранить номер телефона клиента. Такую возможность нужно реализовать. Также нужна возможность удобного поиска по информационным картам по номеру телефона. При этом нужно добавить маску номера 994 (xx) xxx-xx-xx.

Исходные данные:

1. Бухгалтерия предприятия 3.0.71.83
2. Платформа 8.3.16.1224

Решение задачи:

Часть 1. Хранение номера телефона в базе данных и отображение на форме:

Если мы сохраним маску на уровне реквизита справочника, то в базе данных телефон будет храниться с маской:


и нам будет не удобно делать поиск, так как маски могут использоваться разные.  Оператор запросто может запутаться, в каком формате вводить номер телефона для поиска.

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


Разберем саму маску. "\9\9\4" означает, что мы хотим, чтобы маска начиналась с цифр 994. Круглые скобки нужны для удобства восприятия, а цифра "9" в маске означает, что можно ввести произвольный символ цифры.

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

Модуль объекта:


Модуль менеджера:


Телефон на форме с маской выглядит так:


В базе данных хранится в виде:


Таким образом первая часть задачи решена.

Часть 2. Вывод телефона с маской на форму:

Что получилось на данный момент:

1. Мы добавили маску для телефона на уровне элемента формы;

2. Мы научились сохранять телефон в базу в виде цифр.

Если мы протестируем работу формы на данном этапе, то обнаружим, что телефон, который вводился пользователем как:


после сохранения информации будет отображаться как:


Почему так происходит?

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


В функцию ПреобразоватьСтрокуПоМаске() передаем телефон, содержащий только цифры, и маску. В цикле проходим по каждому символу маски:


Если текущий символ маски равен "\", то пропускаем его. Если текущий символ - цифра, выводим цифру из номера телефона по порядку. Для всех остальных символов - выводим символ "как есть".

Далее в модуле формы элемента справочника в процедуре ПриСозданииНаСервере() прописываем код, который преобразует телефон из базы данных в телефон по маске:



Далее чтобы телефон по маске корректно отображался при всех событиях формы в модуле формы элемента справочника прописываем:



Таким образом задача решена. С одной стороны оператору удобно делать поиск карты по номеру телефон без маски:


С другой стороны номер телефона хранится в базе в удобном для поиска виде. При этом на форме номер телефона выводится в виде, удобном для пользователя.

Ссылки:

  1. Код модуля объекта справочника "Информационные карты"
  2. Код модуля менеджера справочника "Информационные карты"
Программирование