Разработка и Конфигурация · 11 мин
Как сделать автозаполнение поля в 1С
Как настроить автозаполнение поля в 1С: подбор при вводе, автоподбор из справочника, обработчики событий, программный код и типичные ошибки.
Автозаполнение поля — это механизм, который подсказывает пользователю подходящие значения при вводе текста: контрагента по первым буквам названия, номенклатуру по артикулу, сотрудника по фамилии. В 1С эта возможность реализуется двумя путями: штатными настройками поля ввода без программирования и программной обработкой событий, когда требуется нестандартная логика подбора.
Выбор способа зависит от задачи. Если нужно, чтобы при вводе текста в поле ссылочного типа (справочник, документ, перечисление) появлялся выпадающий список подходящих значений — достаточно настроить свойства поля в конфигураторе. Если требуется искать по нескольким полям сразу, фильтровать по сложному условию или подставлять значения из произвольного запроса — понадобится обработчик события АвтоПодбор.
Ниже разобраны оба подхода: настройка через конфигуратор, программная реализация с примерами кода, проверка результата и типичные ошибки, из-за которых автозаполнение не работает или тормозит ввод данных.
Как работает автоподбор в поле ввода 1С
В управляемых формах 1С поле ввода, связанное с реквизитом ссылочного типа, по умолчанию уже поддерживает автоподбор: пользователь начинает вводить текст, платформа выполняет поиск по справочнику и показывает выпадающий список совпадений. Поиск идёт по представлению объекта — обычно по наименованию или коду, в зависимости от настроек справочника.
За поведение отвечают два свойства поля ввода: «АвтоПодбор» (включает сам механизм) и «БыстрыйВыбор» (определяет, что при вводе открывается список выбора с найденными значениями). Дополнительно влияет свойство «РежимПолученияДанныхВыбора» — оно определяет, выполняется ли поиск на фоне или при каждом нажатии клавиши.
Важно понимать ограничение: штатный автоподбор ищет только по полям, указанным в настройках справочника (свойство «Поле поиска» и стандартные поля поиска). Если нужно искать контрагента по ИНН, телефону или адресу — потребуется либо добавить эти реквизиты в поля поиска, либо писать обработчик.
Настройка автозаполнения через конфигуратор без кода
Это базовый сценарий, который не требует программирования и подходит для большинства форм документов и справочников. Все действия выполняются в конфигураторе, в свойствах элемента формы.
- 1Откройте конфигуратор и найдите нужную форму (документа, справочника или обработки).
- 2Выделите поле ввода, для которого нужно автозаполнение, и откройте палитру свойств.
- 3Установите свойство АвтоПодбор в значение Истина.
- 4Установите свойство БыстрыйВыбор в значение Истина — при вводе будет открываться список найденных значений.
- 5Проверьте, что реквизит, связанный с полем, имеет ссылочный тип (справочник, документ).
- 6В свойствах соответствующего справочника проверьте настройку полей поиска.
- 7Сохраните конфигурацию, обновите конфигурацию базы данных и проверьте работу в режиме предприятия.
Если выпадающий список появляется, но находит не то, что нужно, откройте в конфигураторе свойства справочника и перейдите на закладку «Поле ввода по строке». Там перечислены реквизиты, по которым платформа ищет совпадения при вводе. Чтобы поиск работал по ИНН или артикулу, добавьте соответствующий реквизит в этот список.
Учтите: каждый добавленный в поиск реквизит увеличивает нагрузку при вводе, особенно в больших справочниках без индексации. Для реквизитов, включённых в поиск по строке, желательно включить индексирование, иначе на объёмных базах подбор будет заметно тормозить.
Программное автозаполнение через обработчик АвтоПодбор
Когда штатного поиска недостаточно — например, нужно искать по части телефона, по нескольким справочникам одновременно или формировать список по сложному запросу — используется обработчик события АвтоПодбор поля ввода. В нём вы сами формируете список значений, который увидит пользователь.
Обработчик создаётся через палитру свойств поля: в разделе «События» найдите АвтоПодбор и нажмите кнопку создания. Платформа сгенерирует процедуру в модуле формы. Типовой шаблон выглядит так:
&НаКлиенте
Процедура КонтрагентАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если СтрДлина(Текст) < 3 Тогда
Возврат; // не ищем по одной-двум буквам
КонецЕсли;
ДанныеВыбора = НайтиКонтрагентовНаСервере(Текст);
КонецПроцедуры
Ключевой приём — установить параметр СтандартнаяОбработка в Ложь, иначе платформа выполнит свой поиск поверх вашего. Сам поиск удобнее делать в серверной функции, где доступен запрос:
&НаСервереБезКонтекста
Функция НайтиКонтрагентовНаСервере(СтрокаПоиска)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 20
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование ПОДОБНО &СтрокаПоиска
| ИЛИ Контрагенты.ИНН ПОДОБНО &СтрокаПоиска";
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СтрокаПоиска + "%");
Результат = Новый СписокЗначений;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат.Добавить(Выборка.Ссылка);
КонецЦикла;
Возврат Результат;
КонецФункции
Обратите внимание на ограничение «ПЕРВЫЕ 20»: без него при совпадении тысяч записей выпадающий список будет формироваться долго, а пользователь всё равно не пролистает больше пары десятков позиций. Порог минимальной длины текста (2–3 символа) тоже снижает нагрузку — по одной букве находится слишком много лишнего.
Вызов серверной функции при каждом нажатии клавиши создаёт заметную нагрузку на сервер и сеть. Используйте параметр Ожидание обработчика: если он больше нуля, платформа сама задерживает вызов, пока пользователь не закончит печатать. Дополнительно ограничивайте поиск минимальной длиной строки.
Автозаполнение значением по умолчанию при создании объекта
Под автозаполнением часто понимают другую задачу: чтобы при создании нового документа или элемента справочника поле уже было заполнено — текущей датой, основной организацией, складом по умолчанию. Это решается не автоподбором, а обработчиками заполнения.
Для реквизитов объекта есть свойство «ЗначениеЗаполнения» в конфигураторе: оно задаёт константное значение, которое подставляется в новый объект. Для вычисляемых значений используется обработчик ОбработкаЗаполнения в модуле объекта:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Тогда
Ответственный = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
Организация = Справочники.Организации.НайтиПоНаименованию("Основная");
КонецЕсли;
КонецПроцедуры
На форме дополнительно можно дозаполнить поля в обработчике ПриСозданииНаСервере, но только для новых объектов — проверяйте параметр формы или признак ЭтоНовый, иначе перезапишете данные уже сохранённых документов.
Сравнение способов автозаполнения
Сравнение подходов
Подходит для типового поиска по наименованию или коду справочника. Не требует кода, работает из коробки. Ограничение: поиск только по полям, заданным в справочнике.
Подходит для поиска по произвольным реквизитам, нескольким таблицам, сложным условиям. Требует кода и контроля нагрузки на сервер.
Подходит для подстановки значений по умолчанию в новые объекты. Не связано с вводом текста пользователем.
Расширяет штатный автоподбор без кода (поиск по ИНН, артикулу). Влияет на все формы, где используется справочник.
Проверка результата и типичные ошибки
После настройки проверьте работу в режиме предприятия: откройте форму, начните вводить текст в поле и убедитесь, что выпадающий список появляется с ожидаемой задержкой и содержит правильные значения. Проверьте выбор значения из списка — после выбора в поле должна подставиться ссылка, а не просто текст.
Как проверить результат
Список открывается после ввода 2-3 символов без заметной паузы
Список не появляется или форма подвисает на несколько секунд
Находятся записи по всем нужным полям (наименование, ИНН)
Поиск работает только по наименованию, часть записей не находится
После выбора в поле — ссылка на объект, связанные поля заполняются
В поле остаётся текст, при записи возникает ошибка типа
Ввод не тормозит даже при быстрой печати
Каждое нажатие клавиши вызывает задержку — запрос слишком тяжёлый
Если автоподбор работает в толстом клиенте, но не работает в тонком или веб-клиенте, проверьте, что серверная функция объявлена с директивой &НаСервереБезКонтекста и не использует объекты, недоступные на сервере. Ошибки компиляции модуля формы часто проявляются именно как «молчаливое» отсутствие подсказок.
Часто задаваемые вопросы
Почему автоподбор не находит контрагента по ИНН, хотя ИНН заполнен?
Штатный автоподбор ищет только по полям, перечисленным в свойстве справочника «Поле ввода по строке». Откройте справочник Контрагенты в конфигураторе и добавьте реквизит ИНН в этот список. Альтернатива — обработчик АвтоПодбор с запросом по ИНН, если менять настройки справочника нельзя.
Можно ли сделать автозаполнение для поля со строковым типом, а не ссылкой?
Да, через обработчик АвтоПодбор: сформируйте СписокЗначений со строками и присвойте его параметру ДанныеВыбора, отключив стандартную обработку. Также для строкового поля работает свойство «СписокВыбора» — тогда подсказки берутся из фиксированного списка значений.
Как изменить количество символов, после которых начинается подбор?
Штатный порог задаётся платформой и напрямую не настраивается. В собственном обработчике АвтоПодбор вы контролируете это сами: проверяйте длину параметра Текст и прерывайте обработку, если символов меньше нужного числа.
Автоподбор тормозит на большом справочнике. Что делать?
Ограничьте выборку через ПЕРВЫЕ в запросе, включите индексирование для реквизитов поиска, задайте минимальную длину текста 3–4 символа и используйте параметр Ожидание, чтобы поиск запускался после паузы в печати, а не на каждую клавишу.
Как автоматически заполнить несколько связанных полей после выбора значения?
Используйте обработчик события ОбработкаВыбора или ПриИзменении поля: в нём по выбранной ссылке получите реквизиты объекта (запросом или через точку) и присвойте их другим полям формы. В типовых конфигурациях для этого часто есть готовые процедуры вида КонтрагентПриИзменении.
Работает ли автоподбор в мобильном клиенте и веб-клиенте?
Да, механизм автоподбора поддерживается во всех клиентах управляемого приложения. Но учитывайте, что в веб-клиенте каждый серверный вызов заметнее по времени, поэтому требования к оптимизации запроса и использованию параметра Ожидание становятся критичнее.
Что важно запомнить
Простое автозаполнение включается свойствами АвтоПодбор и БыстрыйВыбор поля ввода, а состав поиска настраивается в полях поиска справочника. Нестандартные сценарии решаются обработчиком АвтоПодбор с собственным запросом — обязательно отключайте стандартную обработку, ограничивайте выборку и используйте ожидание. Подстановку значений в новые объекты делайте через ОбработкаЗаполнения и всегда проверяйте, что объект новый, чтобы не испортить существующие данные.