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

Где хранится телефон для поиска по номеру
В конфигурациях на БСП контактная информация хранится в табличной части КонтактнаяИнформация самого справочника. В ней есть тип и вид контакта, представление (номер в том виде, как его видит пользователь) и, в актуальных версиях БСП, отдельные поля для номера в нормализованном виде. Набор полей зависит от версии БСП, поэтому перед доработкой откройте табличную часть в конфигураторе и посмотрите, что есть у вас.
Для поиска удобнее всего поле, где номер хранится цифрами без скобок и дефисов. Если такого поля нет, ищите по представлению, но приготовьтесь к тому, что «912-34» и «91234» — разные строки.
Обработчик для собственного справочника
Если вы пишете обработчик с нуля (справочник не типовой или обработчика ещё нет), делайте полный поиск: по наименованию, по ИНН и по телефону.
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
СтрокаПоиска = СокрЛП(Параметры.СтрокаПоиска);
Если ПустаяСтрока(СтрокаПоиска) Тогда
Возврат; // Пустой ввод — стандартная обработка.
КонецЕсли;
СтандартнаяОбработка = Ложь;
ДанныеВыбора = Новый СписокЗначений;
ЦифрыТелефона = ТолькоЦифры(СтрокаПоиска);
ИскатьПоТелефону = СтрДлина(ЦифрыТелефона) >= 5;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 20
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование,
| """" КАК Телефон
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ПометкаУдаления
| И (Контрагенты.Наименование ПОДОБНО &Строка СПЕЦСИМВОЛ ""~""
| ИЛИ Контрагенты.ИНН ПОДОБНО &Начало СПЕЦСИМВОЛ ""~"")
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ ПЕРВЫЕ 20
| КИ.Ссылка,
| КИ.Ссылка.Наименование,
| КИ.Представление
|ИЗ
| Справочник.Контрагенты.КонтактнаяИнформация КАК КИ
|ГДЕ
| &ИскатьПоТелефону
| И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
| И НЕ КИ.Ссылка.ПометкаУдаления
| И КИ.НомерТелефона ПОДОБНО &Цифры";
Запрос.УстановитьПараметр("Строка", "%" + ЭкранироватьДляПодобно(СтрокаПоиска) + "%");
Запрос.УстановитьПараметр("Начало", ЭкранироватьДляПодобно(СтрокаПоиска) + "%");
Запрос.УстановитьПараметр("Цифры", "%" + ЦифрыТелефона + "%");
Запрос.УстановитьПараметр("ИскатьПоТелефону", ИскатьПоТелефону);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДанныеВыбора.Добавить(Выборка.Ссылка,
ПредставлениеВарианта(Выборка.Наименование, Выборка.Телефон));
КонецЦикла;
КонецПроцедурыПоле НомерТелефона в примере — условное имя поля с цифрами номера; подставьте поле из вашей табличной части. Вспомогательные функции:
// Оставляет в строке только цифры.
Функция ТолькоЦифры(Знач Строка)
Результат = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Если СтрНайти("0123456789", Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Экранирует служебные символы оператора ПОДОБНО.
Функция ЭкранироватьДляПодобно(Знач Строка)
Для Каждого Символ Из СтрРазделить("~,%,_,[,],^", ",") Цикл
Строка = СтрЗаменить(Строка, Символ, "~" + Символ);
КонецЦикла;
Возврат Строка;
КонецФункции
// Формирует представление варианта: наименование и серым — найденный телефон.
Функция ПредставлениеВарианта(Наименование, Телефон)
Если ПустаяСтрока(Телефон) Тогда
Возврат Наименование;
КонецЕсли;
Возврат Новый ФорматированнаяСтрока(Наименование,
Новый ФорматированнаяСтрока(" (" + Телефон + ")", , WebЦвета.Серый));
КонецФункцииЭкранирование важно: без него ввод 50% или ООО_Ромашка даст неожиданный результат или ошибку запроса. Тильда — сам спецсимвол, поэтому в функции она экранируется первой, до остальных символов.
Если контрагент нашёлся и по наименованию, и по телефону, в списке он будет дважды с разными представлениями. Для коротких списков это нормально: видно, по какому полю совпадение. Если мешает — убирайте дубли, собирая ссылки в соответствие перед заполнением ДанныеВыбора.
Типовой справочник: доработка через расширение
В типовых конфигурациях у справочника «Контрагенты» обычно уже есть ОбработкаПолученияДанныхВыбора — например, с поиском по ИНН и регистрационному номеру. Переписывать его не нужно: в расширении добавьте свой код после типового.
&После("ОбработкаПолученияДанныхВыбора")
Процедура доп_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
// Добавлять можно, только если типовой код уже сформировал свой список.
Если СтандартнаяОбработка Или ТипЗнч(ДанныеВыбора) <> Тип("СписокЗначений") Тогда
Возврат;
КонецЕсли;
ЦифрыТелефона = ТолькоЦифры(Параметры.СтрокаПоиска);
Если СтрДлина(ЦифрыТелефона) < 5 Тогда
Возврат;
КонецЕсли;
Для Каждого Найденный Из НайтиПоТелефону(ЦифрыТелефона) Цикл
Если ДанныеВыбора.НайтиПоЗначению(Найденный.Ссылка) = Неопределено Тогда
ДанныеВыбора.Добавить(Найденный.Ссылка,
ПредставлениеВарианта(Найденный.Наименование, Найденный.Телефон));
КонецЕсли;
КонецЦикла;
КонецПроцедурыФункция НайтиПоТелефону — вторая часть запроса из предыдущего примера, вынесенная отдельно и возвращающая таблицу значений.
Если типовой обработчик в каких-то случаях оставляет СтандартнаяОбработка = Истина (например, при пустой строке поиска), список ещё не сформирован, и добавлять в него нечего. Тогда либо смиритесь, что телефон ищется только в тех сценариях, где типовой код сам формирует список, либо берите обработку целиком на себя — но учтите, что повторить всю логику типового поиска (отборы, параметры выбора, права) непросто.
Учитываем параметры выбора
Поле ввода может передавать отбор: например, только покупатели или только контрагенты конкретной организации. Он приходит в Параметры.Отбор. Если вы полностью заменяете стандартную обработку, этот отбор нужно применить и в своём запросе — иначе пользователь увидит в поле договора контрагента, которого там быть не должно. Самый простой вариант — для полей с отбором не вмешиваться:
Если Параметры.Свойство("Отбор") И Параметры.Отбор.Количество() > 0 Тогда
Возврат; // Пусть работает типовая логика с отборами.
КонецЕсли;Производительность
Поиск по подстроке ПОДОБНО "%...%" не использует индекс. В базе с сотнями тысяч строк контактной информации это ощутимо, а обработчик вызывается при каждой паузе в наборе.
- Ищите по телефону только при 5 и более цифрах.
- Ограничивайте выдачу
ПЕРВЫЕ 20. - Ищите по полю с нормализованным номером, а не по представлению.
- Если база большая и поиск по телефону нужен постоянно, заведите регистр сведений с последними 7–10 цифрами номера как измерением и ищите по началу строки — так индекс работает.
Для замера используйте аудит производительности или хотя бы технологический журнал: если обработчик выполняется дольше нескольких сотен миллисекунд, пользователи начнут жаловаться.
Как проверить доработку
Проверяю поиск по телефону в нескольких сценариях — по ним же удобно принимать работу у разработчика:
- Поле «Контрагент» в документе реализации: ввести последние 5–7 цифр номера — нужный контрагент в списке, рядом серым виден номер.
- Ввод номера в разных форматах: с
+7, с8, со скобками и дефисами — результат одинаковый, потому что ищем по цифрам. - Ввод части наименования и ИНН — поиск работает как раньше.
- Поле с отбором (например, договор контрагента или поле, где разрешены только покупатели) — недопустимые значения не появляются.
- Пользователь с ограниченными правами — нет ошибок доступа, видны только разрешённые контрагенты.
- Помеченные на удаление — не показываются.
Отдельно стоит замерить время ответа на большой базе: включите замер производительности и введите несколько номеров подряд. Если отклик заметно больше, чем у стандартного поиска по наименованию, переходите к варианту с отдельным регистром для нормализованных номеров.
Типичные ошибки
- Нет
СтандартнаяОбработка = Ложь. Ваш список игнорируется, работает стандартный поиск. ДанныеВыборане создан. При отключённой стандартной обработке нужно создатьНовый СписокЗначений.- Нет
РАЗРЕШЕННЫЕ. При ограничениях доступа на уровне записей запрос выдаст ошибку прав. - Не учтён отбор поля. В выпадающем списке появляются недопустимые значения.
- Помеченные на удаление в выдаче. Добавьте условие на
ПометкаУдаления. - Правка типового модуля менеджера. Делайте это в расширении с аннотацией
&После.
Хороший поиск в поле ввода экономит пользователю открытие формы списка. Но обработчик вызывается на каждый ввод, поэтому быстрый запрос важнее полного.
Такие доработки удобства — поиск по телефону, ИНН, e-mail, артикулу — я делаю в рамках доработки 1С, для типовых конфигураций — через расширения.
Коротко
ОбработкаПолученияДанныхВыборав модуле менеджера управляет вариантами выпадающего списка поля ввода.- Для поиска по телефону запросите табличную часть контактной информации по цифрам номера.
- В типовых конфигурациях добавляйте поиск через расширение с
&После, не ломая типовую логику. - Экранируйте строку для
ПОДОБНО, учитывайтеПараметры.Отбори используйтеРАЗРЕШЕННЫЕ. - Ограничивайте выдачу и ищите только при достаточном количестве цифр.




