Поиск по номеру телефона в 1С можно встроить прямо в поле ввода. ОбработкаПолученияДанныхВыбора — обработчик в модуле менеджера объекта, который платформа вызывает, когда пользователь печатает в поле ввода и ждёт выпадающий список вариантов. Если в этом обработчике добавить запрос по контактной информации, то в поле «Контрагент» можно будет ввести несколько цифр телефона и сразу выбрать нужного клиента — в любой форме, где есть ссылка на справочник, без отдельных форм поиска.

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

Как работает ввод по строке

По умолчанию в поле ввода ссылки поиск идёт по полям, указанным в свойствах объекта метаданных («Ввод по строке»): обычно это код и наименование. Если пользователь помнит клиента по телефону, стандартный поиск ничего не найдёт.

Когда пользователь вводит текст, платформа:

  1. Вызывает ОбработкаПолученияДанныхВыбора в модуле менеджера, если он есть.
  2. Если обработчик установил СтандартнаяОбработка = Ложь, использует его ДанныеВыбора.
  3. Иначе выполняет стандартный поиск по полям ввода по строке.

В Параметры приходит структура с данными поиска: строка поиска (СтрокаПоиска), отбор из параметров выбора поля и другие настройки. Значит, обработчик может искать по любым данным, в том числе по табличной части контактной информации.

Поиск по номеру телефона 1С: поиск по реквизиту, которого нет среди полей ввода по строке
Поиск по номеру телефона 1С: поиск по реквизиту, которого нет среди полей ввода по строке

Где хранится телефон для поиска по номеру

В конфигурациях на БСП контактная информация хранится в табличной части КонтактнаяИнформация самого справочника. В ней есть тип и вид контакта, представление (номер в том виде, как его видит пользователь) и, в актуальных версиях БСП, отдельные поля для номера в нормализованном виде. Набор полей зависит от версии БСП, поэтому перед доработкой откройте табличную часть в конфигураторе и посмотрите, что есть у вас.

Для поиска удобнее всего поле, где номер хранится цифрами без скобок и дефисов. Если такого поля нет, ищите по представлению, но приготовьтесь к тому, что «912-34» и «91234» — разные строки.

Обработчик для собственного справочника

Если вы пишете обработчик с нуля (справочник не типовой или обработчика ещё нет), делайте полный поиск: по наименованию, по ИНН и по телефону.

1С
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

	СтрокаПоиска = СокрЛП(Параметры.СтрокаПоиска);
	Если ПустаяСтрока(СтрокаПоиска) Тогда
		Возврат; // Пустой ввод — стандартная обработка.
	КонецЕсли;

	СтандартнаяОбработка = Ложь;
	ДанныеВыбора = Новый СписокЗначений;

	ЦифрыТелефона = ТолькоЦифры(СтрокаПоиска);
	ИскатьПоТелефону = СтрДлина(ЦифрыТелефона) >= 5;

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 20
	|	Контрагенты.Ссылка КАК Ссылка,
	|	Контрагенты.Наименование КАК Наименование,
	|	"""" КАК Телефон
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|ГДЕ
	|	НЕ Контрагенты.ПометкаУдаления
	|	И (Контрагенты.Наименование ПОДОБНО &Строка СПЕЦСИМВОЛ ""~""
	|			ИЛИ Контрагенты.ИНН ПОДОБНО &Начало СПЕЦСИМВОЛ ""~"")
	|
	|ОБЪЕДИНИТЬ
	|
	|ВЫБРАТЬ ПЕРВЫЕ 20
	|	КИ.Ссылка,
	|	КИ.Ссылка.Наименование,
	|	КИ.Представление
	|ИЗ
	|	Справочник.Контрагенты.КонтактнаяИнформация КАК КИ
	|ГДЕ
	|	&ИскатьПоТелефону
	|	И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
	|	И НЕ КИ.Ссылка.ПометкаУдаления
	|	И КИ.НомерТелефона ПОДОБНО &Цифры";

	Запрос.УстановитьПараметр("Строка", "%" + ЭкранироватьДляПодобно(СтрокаПоиска) + "%");
	Запрос.УстановитьПараметр("Начало", ЭкранироватьДляПодобно(СтрокаПоиска) + "%");
	Запрос.УстановитьПараметр("Цифры", "%" + ЦифрыТелефона + "%");
	Запрос.УстановитьПараметр("ИскатьПоТелефону", ИскатьПоТелефону);

	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		ДанныеВыбора.Добавить(Выборка.Ссылка,
			ПредставлениеВарианта(Выборка.Наименование, Выборка.Телефон));
	КонецЦикла;

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

Поле НомерТелефона в примере — условное имя поля с цифрами номера; подставьте поле из вашей табличной части. Вспомогательные функции:

1С
// Оставляет в строке только цифры.
Функция ТолькоЦифры(Знач Строка)

	Результат = "";
	Для Позиция = 1 По СтрДлина(Строка) Цикл
		Символ = Сред(Строка, Позиция, 1);
		Если СтрНайти("0123456789", Символ) > 0 Тогда
			Результат = Результат + Символ;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;

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

// Экранирует служебные символы оператора ПОДОБНО.
Функция ЭкранироватьДляПодобно(Знач Строка)

	Для Каждого Символ Из СтрРазделить("~,%,_,[,],^", ",") Цикл
		Строка = СтрЗаменить(Строка, Символ, "~" + Символ);
	КонецЦикла;
	Возврат Строка;

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

// Формирует представление варианта: наименование и серым — найденный телефон.
Функция ПредставлениеВарианта(Наименование, Телефон)

	Если ПустаяСтрока(Телефон) Тогда
		Возврат Наименование;
	КонецЕсли;

	Возврат Новый ФорматированнаяСтрока(Наименование,
		Новый ФорматированнаяСтрока(" (" + Телефон + ")", , WebЦвета.Серый));

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

Экранирование важно: без него ввод 50% или ООО_Ромашка даст неожиданный результат или ошибку запроса. Тильда — сам спецсимвол, поэтому в функции она экранируется первой, до остальных символов.

Если контрагент нашёлся и по наименованию, и по телефону, в списке он будет дважды с разными представлениями. Для коротких списков это нормально: видно, по какому полю совпадение. Если мешает — убирайте дубли, собирая ссылки в соответствие перед заполнением ДанныеВыбора.

Типовой справочник: доработка через расширение

В типовых конфигурациях у справочника «Контрагенты» обычно уже есть ОбработкаПолученияДанныхВыбора — например, с поиском по ИНН и регистрационному номеру. Переписывать его не нужно: в расширении добавьте свой код после типового.

1С
&После("ОбработкаПолученияДанныхВыбора")
Процедура доп_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)

	// Добавлять можно, только если типовой код уже сформировал свой список.
	Если СтандартнаяОбработка Или ТипЗнч(ДанныеВыбора) <> Тип("СписокЗначений") Тогда
		Возврат;
	КонецЕсли;

	ЦифрыТелефона = ТолькоЦифры(Параметры.СтрокаПоиска);
	Если СтрДлина(ЦифрыТелефона) < 5 Тогда
		Возврат;
	КонецЕсли;

	Для Каждого Найденный Из НайтиПоТелефону(ЦифрыТелефона) Цикл
		Если ДанныеВыбора.НайтиПоЗначению(Найденный.Ссылка) = Неопределено Тогда
			ДанныеВыбора.Добавить(Найденный.Ссылка,
				ПредставлениеВарианта(Найденный.Наименование, Найденный.Телефон));
		КонецЕсли;
	КонецЦикла;

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

Функция НайтиПоТелефону — вторая часть запроса из предыдущего примера, вынесенная отдельно и возвращающая таблицу значений.

Если типовой обработчик в каких-то случаях оставляет СтандартнаяОбработка = Истина (например, при пустой строке поиска), список ещё не сформирован, и добавлять в него нечего. Тогда либо смиритесь, что телефон ищется только в тех сценариях, где типовой код сам формирует список, либо берите обработку целиком на себя — но учтите, что повторить всю логику типового поиска (отборы, параметры выбора, права) непросто.

Учитываем параметры выбора

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

1С
	Если Параметры.Свойство("Отбор") И Параметры.Отбор.Количество() > 0 Тогда
		Возврат; // Пусть работает типовая логика с отборами.
	КонецЕсли;

Производительность

Поиск по подстроке ПОДОБНО "%...%" не использует индекс. В базе с сотнями тысяч строк контактной информации это ощутимо, а обработчик вызывается при каждой паузе в наборе.

  • Ищите по телефону только при 5 и более цифрах.
  • Ограничивайте выдачу ПЕРВЫЕ 20.
  • Ищите по полю с нормализованным номером, а не по представлению.
  • Если база большая и поиск по телефону нужен постоянно, заведите регистр сведений с последними 7–10 цифрами номера как измерением и ищите по началу строки — так индекс работает.

Для замера используйте аудит производительности или хотя бы технологический журнал: если обработчик выполняется дольше нескольких сотен миллисекунд, пользователи начнут жаловаться.

Как проверить доработку

Проверяю поиск по телефону в нескольких сценариях — по ним же удобно принимать работу у разработчика:

  1. Поле «Контрагент» в документе реализации: ввести последние 5–7 цифр номера — нужный контрагент в списке, рядом серым виден номер.
  2. Ввод номера в разных форматах: с +7, с 8, со скобками и дефисами — результат одинаковый, потому что ищем по цифрам.
  3. Ввод части наименования и ИНН — поиск работает как раньше.
  4. Поле с отбором (например, договор контрагента или поле, где разрешены только покупатели) — недопустимые значения не появляются.
  5. Пользователь с ограниченными правами — нет ошибок доступа, видны только разрешённые контрагенты.
  6. Помеченные на удаление — не показываются.

Отдельно стоит замерить время ответа на большой базе: включите замер производительности и введите несколько номеров подряд. Если отклик заметно больше, чем у стандартного поиска по наименованию, переходите к варианту с отдельным регистром для нормализованных номеров.

Типичные ошибки

  • Нет СтандартнаяОбработка = Ложь. Ваш список игнорируется, работает стандартный поиск.
  • ДанныеВыбора не создан. При отключённой стандартной обработке нужно создать Новый СписокЗначений.
  • Нет РАЗРЕШЕННЫЕ. При ограничениях доступа на уровне записей запрос выдаст ошибку прав.
  • Не учтён отбор поля. В выпадающем списке появляются недопустимые значения.
  • Помеченные на удаление в выдаче. Добавьте условие на ПометкаУдаления.
  • Правка типового модуля менеджера. Делайте это в расширении с аннотацией &После.
Хороший поиск в поле ввода экономит пользователю открытие формы списка. Но обработчик вызывается на каждый ввод, поэтому быстрый запрос важнее полного.

Такие доработки удобства — поиск по телефону, ИНН, e-mail, артикулу — я делаю в рамках доработки 1С, для типовых конфигураций — через расширения.

Коротко

  • ОбработкаПолученияДанныхВыбора в модуле менеджера управляет вариантами выпадающего списка поля ввода.
  • Для поиска по телефону запросите табличную часть контактной информации по цифрам номера.
  • В типовых конфигурациях добавляйте поиск через расширение с &После, не ломая типовую логику.
  • Экранируйте строку для ПОДОБНО, учитывайте Параметры.Отбор и используйте РАЗРЕШЕННЫЕ.
  • Ограничивайте выдачу и ищите только при достаточном количестве цифр.