Часто в процессе работы с системой 1С возникает необходимость ускорить ввод данных в табличные части документов или справочников. Стандартно платформа предлагает поиск по коду или наименованию, однако на практике пользователям бывает удобнее вводить данные по другим признакам: артикулу, штрихкоду, ИНН или любому другому дополнительному реквизиту. В этой статье мы подробно разберем, как реализовать механизм, при котором ввод значения в поле ввода автоматически подтягивает нужный элемент, основываясь на данных пользовательского реквизита.
Для начала рассмотрим самый простой и эффективный способ реализации данной задачи, который заложен в ядро платформы 1С:Предприятие. Этот механизм называется «Ввод по строке». Проанализируем последовательность действий, которые необходимо выполнить в конфигураторе:
Контрагенты или Номенклатура).ДопРеквизит), имеет подходящий тип (Строка или Число).Индексировать. Выберем значение «Индексировать» или, что еще лучше для производительности на больших списках, «Индексировать с дополнительным упорядочиванием». Без выполнения этого условия реквизит просто не появится в списке доступных для ввода по строке.ДопРеквизит.Разберем, что произойдет после этих манипуляций. Когда пользователь начнет вводить цифры или текст в поле справочника в режиме «1С:Предприятие», система будет одновременно просматривать Наименование, Код и ваш ДопРеквизит. Если будет найдено уникальное совпадение, система сразу подставит элемент. Если совпадений будет несколько, откроется список выбора.
Проанализируем ситуацию, когда данные в разных полях могут пересекаться. Например, код элемента — «25», и значение дополнительного реквизита другого элемента — тоже «25». В этом случае критически важен порядок реквизитов в списке «Ввод по строке».
Система проверяет поля сверху вниз. Если вы хотите, чтобы поиск по ДопРеквизит был приоритетнее, чем по стандартному коду, переместите его в самый верх списка в настройках конфигуратора. Также стоит обратить внимание на свойство поля ввода на форме — «Способ поиска при вводе по строке». Рассмотрим два варианта:
Бывают случаи, когда стандартных настроек недостаточно. Например, если нам нужно искать данные с учетом определенных условий (только по активным записям) или выполнять поиск по данным из связанных регистров сведений. В таких случаях мы используем обработчик события ОбработкаПолученияДанныхВыбора в модуле менеджера справочника.
Выясним, как это работает на практике. Рассмотрим пример кода, который перехватывает стандартный поиск и добавляет свою логику:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
// Если пользователь ничего не ввел, работаем штатно
Если ПустаяСтрока(Параметры.СтрокаПоиска) Тогда
Возврат;
КонецЕсли;
// Отключаем стандартный механизм поиска, чтобы реализовать свой
СтандартнаяОбработка = Ложь;
// Создаем запрос для поиска по нашему реквизиту
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 10
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ДопРеквизит ПОДОБНО &СтрокаПоиска + ""%""";
Запрос.УстановитьПараметр("СтрокаПоиска", Параметры.СтрокаПоиска);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаРезультатов = РезультатЗапроса.Выгрузить();
// Формируем список выбора для пользователя
СписокПоиска = Новый СписокЗначений;
Для Каждого Строка Из ТаблицаРезультатов Цикл
СписокПоиска.Добавить(Строка.Ссылка, Строка.Наименование);
КонецЦикла;
ДанныеВыбора = СписокПоиска;
КонецПроцедуры
Использование этого метода позволяет сделать поиск максимально гибким. Мы можем искать «Пупкина», вводя «25», даже если число «25» хранится в другой таблице или является результатом вычисления.
В управляемом интерфейсе (8.3) есть дополнительные свойства элементов формы, которые влияют на удобство подбора. Рассмотрим их подробнее:
Важный нюанс: поиск по строке не будет работать эффективно, если реквизит имеет тип «Строка неограниченной длины». Старайтесь всегда ограничивать длину строковых реквизитов, по которым планируется поиск, чтобы система могла корректно построить индексы в базе данных SQL.
Часто задачу поиска по дополнительному коду решают через регистры сведений. Проанализируем ситуацию: у одного товара может быть несколько артикулов или штрихкодов. В этом случае хранить их в реквизитах справочника неудобно. Мы создаем регистр сведений Штрихкоды, где одно из измерений — Штрихкод, а ресурс — Номенклатура.
В этом случае в событии ОбработкаПолученияДанныхВыбора, которое мы рассмотрели выше, запрос будет обращаться не к справочнику Номенклатура, а к регистру Штрихкоды, соединяя его со справочником. Это обеспечит моментальный подбор «Пупкина» при вводе любого из связанных с ним кодов.
Таким образом, мы рассмотрели как базовые настройки конфигурации, не требующие написания кода, так и продвинутые методы программной разработки. Использование индексации и механизма «Ввод по строке» — это стандарт де-факто для обеспечения комфортной работы пользователей в системе 1С.