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

11.09.15

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

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

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

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

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

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

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

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4683    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    8711    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    56864    dimanich70    85    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    8002    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    71434    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    10003    ke.92@mail.ru    17    

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


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

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


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

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

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