В современных конфигурациях «1С:Предприятие 8» (таких как ERP, КА, УТ, CRM, УНФ), разработанных на базе «Библиотеки стандартных подсистем» (БСП), механизм работы с контактной информацией претерпел серьезные изменения. Номера телефонов и адреса теперь хранятся в виде сложных структур (в формате JSON) и выводятся на управляемые формы динамически.
Часто перед разработчиками и администраторами встает задача изменить стандартную маску ввода телефона (например, дефолтную +7 (999) 999-99-99) на упрощенный «плоский» формат без лишних символов (например, 79999999999). Это упрощает ручной ввод номеров, интеграцию с SMS-серверами, IP-телефонией, а также позволяет пользователям легко копировать «чистый» номер телефона из карточки клиента. В этой статье мы подробно разберем четыре эффективных способа решения этой задачи: от стандартной пользовательской настройки до продвинутого программирования динамических элементов формы.
Прежде чем открывать конфигуратор или создавать расширение, проверим стандартные возможности системы. Начиная с актуальных редакций БСП, разработчики платформы добавили встроенный механизм управления масками номеров телефонов прямо в пользовательском режиме «1С:Предприятие».
Давайте выполним настройку по шагам:
79999999999. Обратите внимание, что в синтаксисе масок 1С символ 9 означает обязательный ввод любой цифры, а первая семерка будет отображаться статично как постоянный префикс.Если маску необходимо жестко зафиксировать в коде конфигурации (например, при написании обработчиков обновления информационной базы, первоначального заполнения или при программном создании новых видов контактной информации), мы можем воспользоваться штатным программным API, предоставляемым БСП.
Для этих целей используется общий модуль УправлениеКонтактнойИнформацией. Рассмотрим пример кода, который решает эту задачу:
// Получаем параметры нужного нам вида контактной информации
ПараметрыВида = УправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Телефон);
ПараметрыВида.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента; // Укажите нужный элемент справочника КИ
// Задаем требуемую маску ввода телефона
ПараметрыВида.МаскаНомераТелефона = "79999999999";
// Записываем обновленные свойства вида контактной информации обратно в базу данных
УправлениеКонтактнойИнформацией.УстановитьСвойстваВидаКонтактнойИнформации(ПараметрыВида);
Этот способ позволяет избежать ручной работы в пользовательском интерфейсе и гарантирует, что настройки применятся централизованно для всех узлов распределенной информационной базы.
Часто разработчики совершают ошибку, пытаясь напрямую обратиться к элементам формы по имени реквизита объекта (например, через обращение к табличной части КонтактнаяИнформация, как это показано в неудачных попытках на форумах). Проблема в том, что элементы контактной информации создаются на форме динамически во время вызова процедуры УправлениеКонтактнойИнформацией.ПриСозданииНаСервере. Имена этих элементов генерируются автоматически по особым внутренним алгоритмам БСП.
Чтобы переопределить маску для таких динамически созданных полей формы на лету (например, только для определенного документа или в зависимости от прав текущего пользователя), нам нужно обратиться к специальной служебной коллекции формы. Давайте разберем правильный алгоритм в обработчике ПриСозданииНаСервере модуля формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Сначала вызываем стандартный механизм БСП, который строит поля КИ на форме
// ... (стандартный вызов процедур БСП)
// После инициализации вызываем нашу процедуру переопределения масок
УстановитьМаскиДляПолейТелефона();
КонецПроцедуры
&НаСервере
Процедура УстановитьМаскиДляПолейТелефона()
// Проверяем наличие служебного реквизита описания КИ на форме
Если Не ОбщегоНазначенияКлиентСервер.ЕстьСвойство(ЭтаФорма, "КонтактнаяИнформацияОписаниеДополнительныхРеквизитов") Тогда
Возврат;
КонецЕсли;
ОписаниеРеквизитовКИ = ЭтаФорма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
// Находим все строки описания реквизитов, относящиеся к телефонам
ПараметрыОтбора = Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон);
СтрокиТелефонов = ОписаниеРеквизитовКИ.НайтиСтроки(ПараметрыОтбора);
Для Каждого Стр Из СтрокиТелефонов Цикл
// Реальное динамическое имя элемента формы хранится в колонке "ИмяРеквизита"
ИмяЭлементаФормы = Стр.ИмяРеквизита;
// Безопасно находим элемент на форме и переопределяем его маску
Если Элементы.Найти(ИмяЭлементаФормы) <> Неопределено Тогда
Элементы[ИмяЭлементаФормы].Маска = "79999999999";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот программный подход обеспечивает максимальную гибкость и позволяет управлять отображением полей ввода динамически, не затрагивая глобальные настройки справочников.
Давайте проанализируем важную архитектурную проблему: изменение маски ввода на «плоский» вид (79999999999) решает задачу удобного копирования номера пользователями, но может нарушить стандартные системные механизмы БСП. К ним относятся автоопределение операторов связи, интеграция со встроенной телефонией (софтфонами), рассылка SMS через системных провайдеров и авторазбор телефонных кодов стран и городов. Все эти подсистемы ожидают от КИ наличия четко структурированных данных.
Если ваша единственная цель — предоставить пользователям возможность копировать номер телефона без скобок и дефисов или выводить «чистый» номер в динамические списки документов (как упоминалось в сообщении №25 на форуме), правильнее сохранить стандартное структурированное хранение КИ, а для плоского копирования использовать избыточный реквизит или вычисляемое поле.
Давайте рассмотрим два варианта реализации такой очистки номеров.
Вариант А. Разбор хранящегося JSON-представления контактной информации
В современных конфигурациях БСП контактная информация хранится в базе данных в формате JSON. Мы можем извлечь из этой структуры чистые составляющие номера (без пробелов, плюсов и скобок) при помощи штатных функций общего модуля БСП:
// Передаем значение КИ (строку JSON из табличной части или регистра) в метод БСП
ДанныеТелефона = УправлениеКонтактнойИнформацией.СведенияОТелефоне(ЗначениеКИ);
// Полученная структура содержит свойства: КодСтраны, КодГорода, НомерТелефона
// Собираем из них чистый номер телефона:
ЧистыйНомер = СтрШаблон("%1%2%3", ДанныеТелефона.КодСтраны, ДанныеТелефона.КодГорода, ДанныеТелефона.НомерТелефона);
// При необходимости удаляем лидирующий плюс из кода страны
ЧистыйНомер = СтрЗаменить(ЧистыйНомер, "+", "");
Вариант Б. Функция принудительной очистки от нецифровых знаков
Если перед нами стоит задача быстро очистить произвольную строку представления телефона (например, для записи в созданный нами избыточный реквизит карточки клиента или документа при записи), воспользуемся следующей универсальной функцией очистки:
Функция ПолучитьОчищенныйНомерТелефона(Знач ИсходныйТекст) Экспорт
Результат = "";
// Проходим циклом по всей длине строки и оставляем только цифры
Для Индекс = 1 По СтрДлина(ИсходныйТекст) Цикл
Символ = Сред(ИсходныйТекст, Индекс, 1);
Если Найти("0123456789", Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
// Корректируем российские номера: если номер начинается с 8 при общей длине 11 цифр, меняем ее на 7
Если Лев(Результат, 1) = "8" И СтрДлина(Результат) = 11 Тогда
Результат = "7" + Сред(Результат, 2);
КонецЕсли;
Возврат Результат;
КонецФункции
Этот подход позволяет хранить в базе данных красивый, отформатированный и структурированный телефон для корректной интеграции с телефонией, и в то же время держать в соседней колонке списка или в скрытом реквизите «чистый» цифровой аналог для мгновенного копирования пользователями.
Мы подробно разобрали, как решать проблему кастомизации масок ввода контактной информации в современных программных продуктах 1С. Выбор конкретного метода зависит от ваших архитектурных задач: