Как организовать верификацию и стандартизацию телефонных номеров контрагентов в 1С:Бухгалтерия 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе эксплуатации 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. Извлекаем текущий номер из набора данных КИ контрагента.
  2. Очищаем его с помощью созданной ранее функции.
  3. Выполняем запрос к базе, исключая текущую ссылку (чтобы не находить самого себя при редактировании).
  4. Если найдено совпадение — выводим сообщение об ошибке и устанавливаем Отказ = Истина.

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	КонтрагентыКонтактнаяИнформация.Ссылка КАК Контрагент
    |ИЗ
    |	Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
    |ГДЕ
    |	КонтрагентыКонтактнаяИнформация.НомерТелефона = &НомерТелефона
    |	И КонтрагентыКонтактнаяИнформация.Ссылка <> &ТекущаяСсылка";

Запрос.УстановитьПараметр("НомерТелефона", ОчищенныйНомер);
Запрос.УстановитьПараметр("ТекущаяСсылка", Объект.Ссылка);
// ... логика обработки результата ...

Механизм SMS-верификации и подтверждения номера

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

Разберем по шагам реализацию Flash Call (звонок-сброс), так как это дешевле SMS:

Для хранения признака подтверждения лучше всего использовать механизм Дополнительных реквизитов (входит в БСП). Это позволит не изменять структуру типовой конфигурации (не добавлять новый реквизит в справочник), сохраняя возможность обновления.

Запрет на редактирование после подтверждения

Как только номер верифицирован, его случайное или намеренное изменение менеджером должно быть заблокировано. Проанализируем способы реализации:

  1. Программная блокировка в форме: В процедуре ПриЧтенииНаСервере или ПриСозданииНаСервере проверяем значение реквизита НомерПодтвержден. Если он равен Истина, устанавливаем свойство ТолькоПросмотр = Истина для элементов формы, отвечающих за ввод телефона.
  2. Проверка при записи: Даже если пользователь обойдет визуальную блокировку, подписка на событие ПередЗаписью должна сравнить старое значение номера и новое. Если номер подтвержден и он изменился — выдаем ошибку.

Если Объект.НомерПодтвержден И Объект.Модифицированность() Тогда
    // Проверка, изменился ли именно телефон в табличной части КИ
    // Если изменился — Отказ = Истина; Сообщение "Изменение подтвержденного номера запрещено!"
КонецЕсли;

Миграция исторических данных

Когда новая логика внедрена, возникает вопрос: что делать с тысячами старых записей? Напишем простую обработку, которая выполнит следующие действия:

  1. Переберет всех контрагентов.
  2. Прочитает текущее представление телефона.
  3. Применит функцию ОчиститьНомерТелефона.
  4. Запишет очищенный номер обратно в поля КИ (поля НомерТелефона, НомерТелефонаБезКодов).
  5. Пометит такие номера как "Требующие верификации" (флаг НомерПодтвержден = Ложь).

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

Резюме

Использование встроенных возможностей БСП в сочетании с регулярными выражениями и небольшими доработками форм позволяет превратить хаотичный список контактов в структурированный актив компании. Мы рекомендуем не "городить костыли" в виде новых регистров, а максимально использовать потенциал табличных частей КонтактнаяИнформация, дополняя их логикой проверки и защиты данных.

← На главную