Ввод контрагента по номеру телефона

11.09.15

Разработка - Универсальные функции

Стандартный функционал поиска контрагента позволяет подбирать по ИНН, Код, Наименование. Очень удобно вводить контрагента, зная его номер телефона. Для этого нужно сделать небольшие правки в коде.

Для этого используем документ "Счет на оплату покупателю", как пример.

Для начала нужно дописать процедуру окончания ввода текста элемента управления формы документа поля ввода контрагента.

Процедура КонтрагентОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
	
	// ФантичПоискНомера / обработаем введенный телефон
	Цифры = "0123456789";
	СтрКоличество = СтрДлина(Текст);
	
	тел = "";
	Для Счетчик = 1 По СтрКоличество Цикл
		Если НЕ Найти(Цифры,Сред(Текст,Счетчик,1)) = 0 Тогда
			тел = тел + Сред(Текст,Счетчик,1);
		КонецЕсли;
	КонецЦикла;
	
	Если СтрДлина(тел) = 10 Тогда // это телефон
		КодСтраны = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнойКодСтраныТелефона");
		Если ПустаяСтрока(КодСтраны) Тогда
			Сообщить("Для текущего пользователя не указан код страны телефона! Поиск по номеру невозможен.");
		Иначе
			Текст = КодСтраны + " ("+Лев(тел,3)+") " + УправлениеКонтактнойИнформацией.ПривестиНомерТелефонаКШаблону(Прав(тел,7));
		КонецЕсли;
	КонецЕсли;
	// ФанКонец //
	
	РезультатЗапроса = ПроцедурыПоискаПоСтроке.ПолучитьРезультатЗапросаАвтоподбора(Текст, Новый Структура, Тип("СправочникСсылка.Контрагенты"), 1);
	
	Если НЕ РезультатЗапроса.Пустой() Тогда
		ПроцедурыПоискаПоСтроке.ОкончаниеВводаТекстаВЭлементеУправления(Элемент, Текст, Значение, СтандартнаяОбработка, Новый Структура, ЭтаФорма, Тип("СправочникСсылка.Контрагенты"), мОбработкаПоискаПоСтрокеКонтрагента, мТекстПоискаПоСтрокеКонтрагента, мПоследнееЗначениеЭлементаПоискаПоСтрокеКонтрагента, Ложь);
		Возврат;
	КонецЕсли; 
	
	УправлениеКонтактами.РегистрироватьНовогоКонтрагента(Элемент, Текст, Значение, СтандартнаяОбработка, мОбработкаПоискаПоСтрокеКонтрагента, мТекстПоискаПоСтрокеКонтрагента, мПоследнееЗначениеЭлементаПоискаПоСтрокеКонтрагента, ЭтаФорма, Контрагент, КонтактноеЛицоКонтрагента, Модифицированность, ДанныеНезарегистрированногоКонтрагента);

КонецПроцедуры

 
Теперь заменить функцию ПолучитьРезультатЗапросаАвтоподбора в общем модуле ПроцедурыПоискаПоСтроке:

Функция ПолучитьРезультатЗапросаАвтоподбора(Знач Текст, СтруктураПараметров, ТипСправочника, КоличествоЭлементов) Экспорт
		
	ВеткаМетаданных = ПолучитьВеткуМетаданныхПоТипу(ТипСправочника);
	Если ВеткаМетаданных = "" Тогда
		Возврат Неопределено;
	КонецЕсли;
	ПустаяСсылкаТипа = Новый(ТипСправочника);
	
	МетаданныеОбъекта = ПустаяСсылкаТипа.Метаданные();
	
	КоллекцияПоискаПоПодстроке = МетаданныеОбъекта.ВводПоСтроке;
	
	Если КоллекцияПоискаПоПодстроке.Количество() = 0 Тогда
		Возврат Неопределено;
	КонецЕсли; 
	
	ИмяТаблицыСправочника = МетаданныеОбъекта.Имя;
	ИмяТаблицыОграничений = ?(КоллекцияПоискаПоПодстроке.Количество() = 1, "ТаблицаВложенногоЗапроса", "ТаблицаСправочника");
	
	СтрокаОтборовПоСтруктуре = "";
	
	Запрос = СоздатьЗапросДляСпискаАвтоподбора(Текст, СтрокаОтборовПоСтруктуре, СтруктураПараметров, ИмяТаблицыОграничений);
	
	СтрокаПолей = "
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ " + Строка(КоличествоЭлементов) + "
	|	ТаблицаВложенногоЗапроса.Ссылка КАК Ссылка,
	|";
	
	Если МетаданныеОбъекта.ДлинаНаименования > 0 Тогда
		СтрокаПолей = СтрокаПолей + "
		|	ТаблицаВложенногоЗапроса.Ссылка.Наименование КАК Наименование,";
	КонецЕсли;
	
	Если МетаданныеОбъекта.ДлинаКода > 0 Тогда
		СтрокаПолей = СтрокаПолей + "
		|	ТаблицаВложенногоЗапроса.Ссылка.Код КАК Код,";
	КонецЕсли; 
	
	Если КоллекцияПоискаПоПодстроке.Количество() = 1 Тогда
		
		ЭлементКоллекции = КоллекцияПоискаПоПодстроке[0];
		ТипЗначенияПоиска = ОпределитьТипОграниченийПоПолю(ЭлементКоллекции.Имя, МетаданныеОбъекта);
		
		Если ЭлементКоллекции.Имя <> "Наименование" И ЭлементКоллекции.Имя <> "Код" Тогда
			СтрокаПолей = СтрокаПолей + "
			|	ТаблицаВложенногоЗапроса.Ссылка." + ЭлементКоллекции.Имя + " КАК " + ЭлементКоллекции.Имя;
		КонецЕсли;
		
		Запрос.Текст = Лев(СтрокаПолей, (СтрДлина(СтрокаПолей) - 1)) + "
		|ИЗ
		|	" + ВеткаМетаданных + "." + ИмяТаблицыСправочника + " КАК ТаблицаВложенногоЗапроса
		|ГДЕ ";
		
		ОграничениеПоПолю = СформироватьОграничениеПоПолюВхождениеВНачало("ТаблицаВложенногоЗапроса." + ЭлементКоллекции.Имя, ТипЗначенияПоиска);
		
		ОграничениеПоПолю = ОграничениеПоПолю + "
		|	И НЕ ТаблицаВложенногоЗапроса.ПометкаУдаления ";
		
		Запрос.Текст = Запрос.Текст +"
		|	" + ОграничениеПоПолю + СтрокаОтборовПоСтруктуре;
	
	Иначе
		
		ПервыйЭлемент = Истина;
		СтрокаТаблиц = "";
		Для каждого ЭлементКоллекции Из КоллекцияПоискаПоПодстроке Цикл
			
			ТипЗначенияПоиска = ОпределитьТипОграниченийПоПолю(ЭлементКоллекции.Имя, МетаданныеОбъекта);
			
			Если ЭлементКоллекции.Имя <> "Наименование" И ЭлементКоллекции.Имя <> "Код" Тогда
				СтрокаПолей = СтрокаПолей + "
				|	ТаблицаВложенногоЗапроса.Ссылка." + ЭлементКоллекции.Имя + " КАК " + ЭлементКоллекции.Имя + ",";
			КонецЕсли;
			
			Если НЕ ПервыйЭлемент Тогда
				СтрокаТаблиц = СтрокаТаблиц + "
				|
				|	ОБЪЕДИНИТЬ ВСЕ
				|";
			КонецЕсли; 
			ПервыйЭлемент = Ложь;
			
			СтрокаТаблиц = СтрокаТаблиц + "
			|	ВЫБРАТЬ  ПЕРВЫЕ " + Строка(КоличествоЭлементов) + "
			|		ТаблицаСправочника.Ссылка КАК Ссылка" + 
			 ?(ТипСправочника = Тип("СправочникСсылка.Контрагенты"),",
			|       NULL КАК Представление // Фантич Добавим для сходства количества полей","
			|") + " 
			|	ИЗ
			|		" + ВеткаМетаданных + "." + ИмяТаблицыСправочника + " КАК ТаблицаСправочника
			|	ГДЕ ";
			
			
			ОграничениеПоПолю = СформироватьОграничениеПоПолюВхождениеВНачало("ТаблицаСправочника." + ЭлементКоллекции.Имя, ТипЗначенияПоиска);
			
			ОграничениеПоПолю = ОграничениеПоПолю + "
			|	И НЕ ТаблицаСправочника.ПометкаУдаления ";
		
			СтрокаТаблиц = СтрокаТаблиц +"
			|	" + ОграничениеПоПолю + СтрокаОтборовПоСтруктуре;		
		КонецЦикла;
		
		// ФАНТИЧ добавим номер телефона в запрос
		Если ТипСправочника = Тип("СправочникСсылка.Контрагенты") Тогда
			СтрокаТаблиц = СтрокаТаблиц + "
			|
			|	ОБЪЕДИНИТЬ ВСЕ
			|
			|	ВЫБРАТЬ  ПЕРВЫЕ " + Строка(КоличествоЭлементов) + "
			|
			|	КИ.Объект.Ссылка КАК Ссылка,
			|   ВЫРАЗИТЬ(КИ.Представление КАК СТРОКА(100))
			| ИЗ
			|	РегистрСведений.КонтактнаяИнформация КАК КИ
			| ГДЕ ";
			
			ОграничениеПоПолю = СформироватьОграничениеПоПолюВхождениеВНачало("КИ.Представление", ТипЗначенияПоиска);
			
			ОграничениеПоПолю = ОграничениеПоПолю + "
			|	И КИ.Объект ССЫЛКА Справочник.Контрагенты
			|	И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)";
			
			СтрокаТаблиц = СтрокаТаблиц +"
			|	" + ОграничениеПоПолю + СтрокаОтборовПоСтруктуре;
			
			СтрокаПолей = СтрокаПолей + "
			|	ТаблицаВложенногоЗапроса.Представление,";
		КонецЕсли;
		//  ФанКонец
		
		Запрос.Текст = Лев(СтрокаПолей, (СтрДлина(СтрокаПолей) - 1)) + "
		|ИЗ
		|
		|	(
		|" + СтрокаТаблиц + "
		|	) КАК ТаблицаВложенногоЗапроса";
	
	КонецЕсли; 
	
	Возврат Запрос.Выполнить();

КонецФункции

 
Если у вас все номера записаны в правильно формате, то можно тестировать!

номер телефона ввод по номеру телефона

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2894    2    John_d    11    

56

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    5052    atdonya    22    

51

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    4104    ke.92@mail.ru    16    

62

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    9393    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2238    25    progmaster    8    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16360    142    sapervodichka    112    

130

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7356    quazare    8    

110
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Taktic 39 14.09.15 09:03 Сейчас в теме
Однако изящное начало:


Цифры = "0123456789";
СтрКоличество = СтрДлина(Текст);

тел = "";
Для Счетчик = 1 По СтрКоличество Цикл
Если НЕ Найти(Цифры,Сред(Текст,Счетчик,1)) = 0 Тогда
тел = тел + Сред(Текст,Счетчик,1);
КонецЕсли;
КонецЦикла;


Есть предложение - нужно создать таблицу значений, поместить в каждую строку "цифру", потом поместить ТЗ во временную таблицу и запросом в цикле определить есть ли текущий символ в этой ТЗ.
2. Boudybuilder 35 30.05.18 23:21 Сейчас в теме
3. Taktic 39 31.05.18 14:42 Сейчас в теме
Я бы сделал так:
Если Символ>="0" И Символ=<"9" Тогда

Но и Ваш вариант я потом встретил в типовом ЗУП.
4. Boudybuilder 35 01.06.18 18:17 Сейчас в теме
(3) Ну вот. А меня засмеяли.
5. Taktic 39 04.06.18 18:45 Сейчас в теме
(4) Некогда Дмитрий Гончаров на курсах признал, что в типовых конфигурациях частенько встречается далеко не идеальный код.

Имхо, особенно не стоит учится у разработчиков бюджетной бухгалтерии.
6. Boudybuilder 35 06.06.18 08:13 Сейчас в теме
(5) я тоже полностью с Вами согласен!
Оставьте свое сообщение