Нормализация телефонов покупателей. УНФ 3
В УНФ прекрасно работала система лояльности по дисконтным картам, пока не внедрили CRM, где у клиента был личный кабинет на сайте.
Обнаружилось, что в контрагентах нет номера телефона, потому что его не всегда заносили в контрагента, порой оставляли в дисконтной карте.
Пришлось написать нормализацию. Клиенту нужен был формат телефона из 11 цифр, первая 8.
Номер телефона забивался в поле карты КодКартыШтрихкод, а иногда в контрагента.
Написал обработку, которая нормализирует телефоны, определяет статусы соответствия телефонов и устанавливает телефон контрагента при необходимости.
Также можно найти телефоны, различающиееся в контрагенте и карте.
Столкнулся с неприятной проблемой — если в фукнцию добавления контактной информации вместо даты передавать Неопределено, она все равно добавляет телефон, а не замещает. Ужасный недостаток типового кода!
Особенность обработки в том, что она оставляет только один телефон. Это нужно учитывать!
При первом запуске не ставьте галочку «Записывать», чтобы просто посмотреть, какие изменения будет совершать программа!
По идее, подобную нормализацию можно выполнять и в других конфигурациях на БСП. Я думал, будет сложнее и придется ковыряться с XML или JSON.
Код обработки:
&НаСервере Процедура СинхронизироватьНомераНаСервере() // Вставить содержимое обработчика. З = Новый Запрос( "ВЫБРАТЬ //ПЕРВЫЕ 2 | ДисконтныеКарты.Наименование КАК НаименованиеКарты, | ДисконтныеКарты.КодКартыШтрихкод КАК НомерКарты, | //ДисконтныеКарты.ВладелецКарты.Наименование КАК НаименованиеВладельцаКарты, | ДисконтныеКарты.ВладелецКарты.НомерТелефонаДляПоиска КАК ТелефонКонтрагентаДляПоиска, | ДисконтныеКарты.ВладелецКарты КАК Контрагент, | ДисконтныеКарты.Ссылка КАК Карта, | //КИ.Представление КАК Представление, | КИ.НомерТелефона КАК ТелефонКонтрагента | //КИ.Значение КАК НомерТелефонаXML |ИЗ | Справочник.ДисконтныеКарты КАК ДисконтныеКарты | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КИ | ПО ДисконтныеКарты.ВладелецКарты = КИ.Ссылка | И (КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонКонтрагента)) |ГДЕ | ДисконтныеКарты.ВладелецКарты.Покупатель"); ТЗ = З.Выполнить().Выгрузить(); Таблица.Очистить(); Для Каждого Строка ИЗ ТЗ Цикл НСтр = Таблица.Добавить(); ЗаполнитьЗначенияСвойств(НСтр, Строка); //Убираем пробелы НСтр.НомерКарты = СокрЛП(НСтр.НомерКарты); НСтр.ТелефонКонтрагента = СокрЛП(НСтр.ТелефонКонтрагента); //Сообщить(Строка.ТелефонКонтрагента); НСтр.ТелефонКонтрагентаДляПоиска = СокрЛП(НСтр.ТелефонКонтрагентаДляПоиска); Если НСтр.ТелефонКонтрагента = "" Тогда НСТр.ТелефонКонтрагентаНормализованный = ПривестиКФорматуНомераРФ(НСТр.ТелефонКонтрагентаДляПоиска); Иначе НСТр.ТелефонКонтрагентаНормализованный = ПривестиКФорматуНомераРФ(НСТр.ТелефонКонтрагента); КонецЕсли; НСТр.НомерТелефонаИзКарты = ПривестиКФорматуНомераРФ(НСтр.НомерКарты); Если НСТр.ТелефонКонтрагентаНормализованный = "" Тогда //Если телефон контрагента не заполнен Если НСТр.НомерТелефонаИзКарты = "" Тогда НСтр.Статус = "Номера в карте нет"; Иначе НСтр.Статус = "Установить номер из карты"; УстановитьНомерКонтрагента(НСтр.Контрагент, НСТр.НомерТелефонаИзКарты); КонецЕсли; Иначе Если НСТр.ТелефонКонтрагентаНормализованный <> НСТр.ТелефонКонтрагента ИЛИ Найти(НСтр.ТелефонКонтрагентаДляПоиска, ",") <> 0 Тогда НСтр.Статус = "Нормализовать телефон контрагента"; УстановитьНомерКонтрагента(НСтр.Контрагент, НСТр.ТелефонКонтрагентаНормализованный); ИначеЕсли НСТр.НомерТелефонаИзКарты <> НСТр.ТелефонКонтрагентаНормализованный Тогда Если НСТр.НомерТелефонаИзКарты <> "" Тогда НСтр.Статус = "Различаются номера в карте и контрагенте"; Иначе НСтр.Статус = "Телефон есть в контрагенте, нет в карте"; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура УстановитьНомерКонтрагента(Контрагент, НомерТелефона) Экспорт Сообщить("Установить у контрагента: " + Контрагент + " телефон: " + НомерТелефона); Если НЕ Записывать Тогда Возврат; КонецЕсли; //На пустую дату, Замещать = истина Попытка УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(Контрагент, НомерТелефона, Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента, '00010101', Истина); Исключение Сообщить(" Произошла ошибка: " + ОписаниеОшибки()); КонецПопытки; КонецПроцедуры Функция ПривестиКФорматуНомераРФ(Номер) Если ПоФорматуНомераРФ8(Номер) Тогда Возврат Номер; КонецЕсли; Если ПоФорматуНомераРФ9(Номер) Тогда Возврат "8" + Номер; КонецЕсли; Если ПоФорматуНомераРФ7(Номер) Тогда Возврат "8" + Сред(Номер, 2); КонецЕсли; КонецФункции Функция ПоФорматуНомераРФ8(Номер) Возврат СтрДлина(Номер) = 11 И СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Номер) И Лев(Номер, 1) = "8"; КонецФункции Функция ПоФорматуНомераРФ9(Номер) Возврат СтрДлина(Номер) = 10 И СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Номер) И Лев(Номер, 1) = "9"; КонецФункции Функция ПоФорматуНомераРФ7(Номер) Возврат СтрДлина(Номер) = 11 И СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Номер) И Лев(Номер, 1) = "7"; КонецФункции &НаКлиенте Процедура СинхронизироватьНомера(Команда) СинхронизироватьНомераНаСервере(); КонецПроцедуры &НаКлиенте Процедура ТаблицаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) ТекущаяСтрока = Элемент.ДанныеСтроки(ВыбраннаяСтрока); Если Поле.Имя = "ТаблицаКонтрагент" Тогда ПоказатьЗначение(, ТекущаяСтрока.Контрагент); ИначеЕсли Поле.Имя = "ТаблицаКарта" Тогда ПоказатьЗначение(, ТекущаяСтрока.Карта); Конецесли; КонецПроцедуры
Среда: 3.0.6.200 Объем: 1.5 час.




Свежие комментарии