Проверка контрагента по номеру телефона перед записью

Программирование - Практика программирования

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

Код писался на УНФ 1.6.12.4. Но подойдет и для любой другой. Чуток подправить под конфу, если надо и все.

1) Создать серверный общий модуль.

2) Создать подписку на событие объекта справочника. Указать в ней следующую процедуру:

Ну и весь код общего модуля. При желании можно добавить еще какую-нибудь проверку.

#Область ПодпискиНаСобытия

Процедура aspect_ПередЗаписьюСправочникаПередЗаписью(Источник, Отказ) Экспорт
	
	Если ТипЗнч(Источник) = Тип("СправочникОбъект.Контрагенты") Тогда
		Если НЕ ЗначениеЗаполнено(Источник.Ссылка) Тогда
			Если ЗначениеЗаполнено(Источник.НомерТелефона) Тогда
				// необходимо произвести поиск по этому номеру телефона, предварительно обработав его
				// т.к. номер может быть введен по-разному
				ТаблицаСообщений = Новый ТаблицаЗначений;
				ТаблицаСообщений.Колонки.Добавить("ТекстСообщения", Новый ОписаниеТипов("Строка"));
				ТаблицаСообщений.Колонки.Добавить("Контрагент"    , Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
				НомерТелефонаДляПроверки = ПреобразоватьНомерТелефонаДляПроверки(Источник.НомерТелефона);
				Запрос = Новый Запрос;
				Запрос.Текст =
				"ВЫБРАТЬ
				|	Контрагенты.Ссылка КАК Ссылка,
				|	Контрагенты.НомерТелефона КАК НомерТелефона
				|ИЗ
				|	Справочник.Контрагенты КАК Контрагенты
				|ГДЕ
				|	НЕ Контрагенты.ЭтоГруппа
				|	И НЕ Контрагенты.НомерТелефона = &ПустойНомерТелефона";
				Запрос.УстановитьПараметр("ПустойНомерТелефона", "");
				РезультатЗапроса = Запрос.Выполнить();
				Если НЕ РезультатЗапроса.Пустой() Тогда
					ВыборкаЗапроса = РезультатЗапроса.Выбрать();
					Пока ВыборкаЗапроса.Следующий() Цикл
						ТекущийНомерТелефона = ПреобразоватьНомерТелефонаДляПроверки(ВыборкаЗапроса.НомерТелефона);
						Для i=1 По СтрЧислоСтрок(ТекущийНомерТелефона) Цикл
							Для m=1 По СтрЧислоСтрок(НомерТелефонаДляПроверки) Цикл
								Если СтрПолучитьСтроку(ТекущийНомерТелефона, i) = СтрПолучитьСтроку(НомерТелефонаДляПроверки, m) Тогда
									ТекстСообщения = "Номер телефона: '" + СтрПолучитьСтроку(НомерТелефонаДляПроверки, m) + "' уже привязан к контрагенту: '" + Строка(ВыборкаЗапроса.Ссылка) + "'";
									НоваяСтрока = ТаблицаСообщений.Добавить();
									НоваяСтрока.ТекстСообщения = ТекстСообщения;
									НоваяСтрока.Контрагент     = ВыборкаЗапроса.Ссылка;
									Отказ = Истина;
								КонецЕсли;
							КонецЦикла;
						КонецЦикла;
					КонецЦикла;
				КонецЕсли;
				
				Если ТаблицаСообщений.Количество() > 0 Тогда
					ТекстСообщения = "Открыть контрагента можно двойным нажатием ЛКМ";
					ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
					Для каждого СтрокаСообщения Из ТаблицаСообщений Цикл
						ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщения.ТекстСообщения, СтрокаСообщения.Контрагент, , , );
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

Функция ПреобразоватьНомерТелефонаДляПроверки(НомерТелефона)
	
	НомерТелефонаДляПроверки = НомерТелефона;
	
	НомерТелефонаДляПроверки = СтрЗаменить(НомерТелефонаДляПроверки, " ", "");
	НомерТелефонаДляПроверки = СтрЗаменить(НомерТелефонаДляПроверки, "+", "");
	НомерТелефонаДляПроверки = СтрЗаменить(НомерТелефонаДляПроверки, "(", "");
	НомерТелефонаДляПроверки = СтрЗаменить(НомерТелефонаДляПроверки, ")", "");
	НомерТелефонаДляПроверки = СтрЗаменить(НомерТелефонаДляПроверки, "-", "");
	НомерТелефонаДляПроверки = СтрЗаменить(НомерТелефонаДляПроверки, ",", Символы.ПС);
	
	Возврат НомерТелефонаДляПроверки;
	
КонецФункции

 

См. также

Автор запретил комментарии