Нормализация телефонов покупателей. УНФ 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 час.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *