В процессе эксплуатации 1С:Бухгалтерия 3.0 (БП 3.0) многие компании сталкиваются с проблемой "грязных" данных в справочнике Контрагенты. Телефонные номера вводятся в произвольном формате: кто-то через "8", кто-то через "+7", с тире, скобками или пробелами. Это делает невозможным автоматическую рассылку SMS, корректную работу CRM-систем и интеграцию с IP-телефонией. Рассмотрим пошагово, как привести телефонные номера к единому стандарту, внедрить проверку на уникальность и реализовать механизм верификации через SMS или звонок.
Первоочередная задача — обеспечить ввод номера в едином формате, например, 7XXXXXXXXXX. Поскольку БП 3.0 построена на Библиотеке стандартных подсистем (БСП), контактная информация (КИ) хранится и обрабатывается специальными механизмами. Мы не рекомендуем отказываться от стандартного функционала КИ в пользу самописных регистров, так как это нарушит работу типовых отчетов и интеграций.
Для очистки номера от лишних символов (скобок, тире, пробелов) эффективнее всего использовать регулярные выражения. Проанализируем пример функции, которую можно разместить в общем модуле для обработки строковых данных:
Функция ОчиститьНомерТелефона(Знач ВходящийНомер) Экспорт
// Удаляем все символы, кроме цифр
РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.Global = Истина;
РегВыражение.IgnoreCase = Истина;
РегВыражение.Pattern = "[^\d]"; // Шаблон: всё, что не является цифрой
Результат = РегВыражение.Replace(ВходящийНомер, "");
// Преобразуем начальную восьмерку в семерку для РФ
Если Лев(Результат, 1) = "8" И СтрДлина(Результат) = 11 Тогда
Результат = "7" + Сред(Результат, 2);
КонецЕсли;
Возврат Результат;
КонецФункции
Эту функцию следует вызывать в модуле объекта контрагента или в подписке на событие ПередЗаписью. Проанализируем ситуацию: если менеджер вводит номер, система должна автоматически "причесать" его перед сохранением в базу данных.
Дублирование телефонных номеров — частая проблема, приводящая к путанице в базе клиентов. Чтобы избежать записи дублей, необходимо реализовать запрос к табличной части КонтактнаяИнформация справочника Контрагенты. Важно помнить, что поиск нужно вести именно по очищенному номеру, а не по представлению (строке со скобками).
Рассмотрим алгоритм проверки в подписке на событие:
Отказ = Истина.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| КонтрагентыКонтактнаяИнформация.Ссылка КАК Контрагент
|ИЗ
| Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
|ГДЕ
| КонтрагентыКонтактнаяИнформация.НомерТелефона = &НомерТелефона
| И КонтрагентыКонтактнаяИнформация.Ссылка <> &ТекущаяСсылка";
Запрос.УстановитьПараметр("НомерТелефона", ОчищенныйНомер);
Запрос.УстановитьПараметр("ТекущаяСсылка", Объект.Ссылка);
// ... логика обработки результата ...
Для подтверждения того, что номер принадлежит именно этому клиенту, используется механизм верификации. Выясним причину, почему это важно: это исключает ошибки ввода ("опечатался в одной цифре") и гарантирует актуальность базы для маркетинга.
Разберем по шагам реализацию Flash Call (звонок-сброс), так как это дешевле SMS:
HTTPСоединение), который инициирует звонок на номер клиента.НомерПодтвержден.Для хранения признака подтверждения лучше всего использовать механизм Дополнительных реквизитов (входит в БСП). Это позволит не изменять структуру типовой конфигурации (не добавлять новый реквизит в справочник), сохраняя возможность обновления.
Как только номер верифицирован, его случайное или намеренное изменение менеджером должно быть заблокировано. Проанализируем способы реализации:
ПриЧтенииНаСервере или ПриСозданииНаСервере проверяем значение реквизита НомерПодтвержден. Если он равен Истина, устанавливаем свойство ТолькоПросмотр = Истина для элементов формы, отвечающих за ввод телефона.ПередЗаписью должна сравнить старое значение номера и новое. Если номер подтвержден и он изменился — выдаем ошибку.
Если Объект.НомерПодтвержден И Объект.Модифицированность() Тогда
// Проверка, изменился ли именно телефон в табличной части КИ
// Если изменился — Отказ = Истина; Сообщение "Изменение подтвержденного номера запрещено!"
КонецЕсли;
Когда новая логика внедрена, возникает вопрос: что делать с тысячами старых записей? Напишем простую обработку, которая выполнит следующие действия:
ОчиститьНомерТелефона.НомерТелефона, НомерТелефонаБезКодов).НомерПодтвержден = Ложь).Важный момент: при массовой очистке могут возникнуть дубли. В этом случае обработка должна формировать лог-файл, чтобы администратор базы мог вручную объединить дублирующихся контрагентов.
Использование встроенных возможностей БСП в сочетании с регулярными выражениями и небольшими доработками форм позволяет превратить хаотичный список контактов в структурированный актив компании. Мы рекомендуем не "городить костыли" в виде новых регистров, а максимально использовать потенциал табличных частей КонтактнаяИнформация, дополняя их логикой проверки и защиты данных.