При работе с контактной информацией в конфигурациях «1С:Предприятие» разработчики часто сталкиваются с необходимостью изменить стандартный формат ввода номера телефона. Например, заменить стандартную маску (xxx) xxx xx xx на более строгую и универсальную +7 (xxx) xxx-xx-xx. Сложность этой задачи заключается в том, что в современных конфигурациях (особенно построенных на Библиотеке стандартных подсистем — БСП) поля контактной информации создаются на форме динамически. Их невозможно просто открыть в конфигураторе и поменять свойство в палитре свойств.
В этой статье мы подробно разберем, как устроена работа с масками контактной информации, и рассмотрим два основных способа решения этой задачи: через пользовательский интерфейс (для современных версий БСП) и программным путем в коде управляемой формы.
Проанализируем архитектуру хранения контактной информации в 1С. Поля для ввода адресов, телефонов и email-адресов обычно не являются стандартными реквизитами справочника (например, справочника Клиенты или Контрагенты). Они хранятся в табличных частях или в специальном табличном регистре сведений СоставКонтактнойИнформации.
Когда пользователь открывает карточку клиента, срабатывает программный механизм БСП. Процедура УправлениеКонтактнойИнформацией.ПриСозданииНаСервере обращается к метаданным, считывает настройки для конкретного вида контактной информации и динамически «рисует» элементы на форме (поля ввода, надписи, группы). Поскольку на этапе разработки в конфигураторе этих полей физически не существует, стандартным визуальным способом задать им маску ввода невозможно. Для быстрого поиска и изучения процедур библиотеки подойдёт справочник по методам БСП с практическими примерами.
---
Если вы работаете в современной конфигурации (например, «Управление торговлей 11», «ERP Управление предприятием 2», «Бухгалтерия предприятия 3.0»), разработчики 1С уже предусмотрели штатный механизм настройки масок прямо в режиме «1С:Предприятие». Изменять код программы для этого не требуется.
Рассмотрим этот процесс по шагам:
+7 (999) 999-99-99.---
Если вы работаете в старой конфигурации (например, на платформе 8.3.6, как у автора вопроса на форуме) или в полностью самописной системе, где нет гибкой настройки видов КИ в пользовательском режиме, решать задачу придется с помощью программирования.
Поскольку поля формы создаются динамически при создании формы на сервере, нам необходимо перехватить этот момент, дождаться, пока БСП создаст нужные элементы управления, найти среди них наше поле ввода телефона и принудительно назначить ему маску. Для исследования структуры и параметров созданных полей в режиме предприятия можно использовать инструмент для редактирования свойств элементов открытых форм.
Выполним следующие действия в модуле формы элемента (например, формы элемента справочника Клиенты):
ПриСозданииНаСервере.УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, "ГруппаКонтактнаяИнформация");.Рассмотрим подробный пример реализации:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Вызов стандартного механизма, который динамически создает элементы КИ на форме
УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, "ГруппаКонтактнаяИнформация");
// Нам необходимо определить точное имя динамически созданного элемента.
// Обычно БСП формирует имя по шаблону: "КонтактнаяИнформация_ИмяВидаКИ"
// или использует уникальный идентификатор вида контактной информации.
// Самый надежный способ узнать имя - поставить точку останова ниже этой строки
// и посмотреть коллекцию "Элементы" в табло отладчика.
ИмяЭлементаТелефона = "КонтактнаяИнформация_ТелефонКлиента";
// Ищем элемент на форме по его имени
ЭлементТелефон = Элементы.Найти(ИмяЭлементаТелефона);
Если ЭлементТелефон <> Неопределено Тогда
// Устанавливаем маску ввода для найденного поля
ЭлементТелефон.Маска = "+7 (999) 999-99-99";
КонецЕсли;
КонецПроцедуры
Если в вашей конфигурации используется старая версия БСП, имя элемента может содержать GUID вида контактной информации (например, КонтактнаяИнформация_СправочникКлиенты_Телефон_9b581b85_7d11_43cb_9df7_df7618efbc75). Чтобы не привязываться к жесткому имени с уникальным идентификатором, мы можем обойти коллекцию элементов формы циклом и найти поле по типу или по совпадению подстроки:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, "ГруппаКонтактнаяИнформация");
// Обходим циклом все элементы формы в группе контактной информации
Для Каждого Элемент Из Элементы Цикл
// Проверяем, что элемент является Полем Ввода и его имя содержит ключевое слово "Телефон"
Если ТипЗнч(Элемент) = Тип("ПолеФормы")
И Элемент.Вид = ВидПоляФормы.ПолеВвода
И Найти(ВРег(Элемент.Имя), "ТЕЛЕФОН") > 0 Тогда
// Назначаем маску всем полям ввода телефона на форме
Элемент.Маска = "+7 (999) 999-99-99";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
---
При настройке масок ввода на платформе «1С:Предприятие» очень важно учитывать правила интерпретации символов самой платформой. Некоторые символы являются служебными:
9 — любая цифра;# — любая цифра или знак регулировки (+ или -);a — любая буква латиницы (регистр не важен);h — шестнадцатеричная цифра;@ — любой алфавитно-цифровой символ.Важный нюанс с девятками: если в вашей маске должна присутствовать статичная девятка, которая не должна заменяться пользователем при вводе (например, международный телефонный код некоторых стран, содержащий девятку, или код оператора), перед ней необходимо поставить экранирующий символ обратного слэша \.
Например, если вам нужно задать маску для телефона Азербайджана (код страны +994), правильная запись маски в 1С будет выглядеть следующим образом:
+\9\94 (99) 999-99-99
Если не поставить экранирование перед первыми девятками, платформа воспримет их как места для ввода любых произвольных цифр пользователем.
Для кода России +7 экранирование не требуется, так как семерка не является управляющим спецсимволом в логике масок 1С. Маска +7 (999) 999-99-99 отработает абсолютно корректно.
---
Применение маски существенно облегчает пользователям визуальный ввод информации. Однако сохранение номера телефона в базу данных вместе со скобками, дефисами и пробелами может усложнить последующую работу с базой. Поиск по номеру телефона, интеграция с IP-телефонией (CRM) и отправка SMS-сообщений требуют наличия «чистого» номера, состоящего только из цифр.
Рекомендуем внедрить процедуру очистки номера телефона перед записью объекта в базу данных. Для этого в модуле объекта (например, справочника Клиенты) перед записью можно использовать простую функцию удаления всех лишних символов:
// Функция оставляет в строке только цифры
Функция ОчиститьНомерТелефона(Знач ИсходныйНомер) Экспорт
Результат = "";
Для Индекс = 1 По СтрДлина(ИсходныйНомер) Цикл
Символ = Сред(ИсходныйНомер, Индекс, 1);
Если Найти("0123456789", Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Используя эту функцию в подписках на событие ПередЗаписью или непосредственно в модуле объекта, вы обеспечите порядок в вашей базе данных. На форме пользователи будут видеть красивый отформатированный номер благодаря маске +7 (999) 999-99-99, а в базе данных будет храниться чистая строка вида 79999999999, что значительно упростит интеграцию с внешними сервисами.