При работе в современных конфигурациях на платформе 1С:Предприятие 8.3 (таких как «Бухгалтерия предприятия 3.0» или «ERP») пользователи часто сталкиваются с удобным механизмом: при начале ввода текста в поле (например, «Договор») система мгновенно предлагает список подходящих элементов. Однако для разработчика поиск конкретного места в коде, где формируется этот список, может стать настоящим квестом. Разберем детально, как работает этот механизм «под капотом» и почему стандартный поиск по коду не всегда дает результат.
Прежде всего, нам необходимо понять, что большая часть магии автоподбора происходит на уровне платформы, а не программного кода. Проанализируем настройки объекта метаданных. В конфигураторе откроем справочник ДоговорыКонтрагентов и перейдем на вкладку Данные. Здесь нас интересует список «Ввод по строке».
По умолчанию там выбраны поля Наименование и Код. Когда пользователь начинает вводить текст в поле на форме, платформа автоматически генерирует SQL-запрос к базе данных, пытаясь найти совпадения в этих полях. Это происходит без участия встроенного языка, если разработчик специально не переопределил это поведение. Именно поэтому, просматривая модули, вы можете не найти явного формирования списка — платформа делает это за вас.
Если нам все же нужно вмешаться в процесс формирования списка или понять, какие фильтры накладываются, мы обращаемся к Модулю менеджера объекта. Рассмотрим процедуру ОбработкаПолученияДанныхВыбора, которая была представлена в обсуждении:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Если Параметры.Отбор.Свойство("Организация") Тогда
Если ЗначениеЗаполнено(Параметры.Отбор.Организация) Тогда
Параметры.Отбор.Организация = ОбщегоНазначенияБПВызовСервераПовтИсп.ГоловнаяОрганизация(Параметры.Отбор.Организация);
КонецЕсли;
КонецЕсли;
ЗначениеОтбора = ?(Параметры.Отбор.Свойство("ВидДоговора"), Параметры.Отбор.ВидДоговора, Неопределено);
ЕстьНедоступные = Ложь;
ДоступныеЗначения = Перечисления.ВидыДоговоровКонтрагентов.ПолучитьСписокДоступныхЗначений(
ЗначениеОтбора, ЕстьНедоступные);
Если ЕстьНедоступные Тогда
Если ДоступныеЗначения.Количество() = 0 Тогда
Параметры.Отбор.Вставить("ВидДоговора", Неопределено);
ИначеЕсли ДоступныеЗначения.Количество() = 1 Тогда
Параметры.Отбор.Вставить("ВидДоговора", ДоступныеЗначения[0].Значение);
Иначе
Параметры.Отбор.Вставить("ВидДоговора", Новый ФиксированныйМассив(ДоступныеЗначения.ВыгрузитьЗначения()));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализируем эту ситуацию. Обратите внимание, что в коде отсутствует строка СтандартнаяОбработка = Ложь;. Это критически важный момент. Когда этот флаг остается в значении Истина, платформа выполняет код процедуры (в данном случае корректирует фильтры по Организации и ВидуДоговора), а затем самостоятельно выполняет стандартный поиск по строке с учетом этих новых параметров отбора.
Таким образом, список формируется динамически: система берет ваш введенный текст «Договор 1», добавляет к нему условия ГДЕ Организация = ... и ГДЕ ВидДоговора В (...), и выполняет поиск по наименованию. Результат мы и видим во всплывающем окошке.
Выясним причину, по которой список может быть ограничен еще сильнее, чем это кажется из кода модуля менеджера. Рассмотрим свойства элемента формы в документе «Реализация». У поля Договор есть два важнейших свойства:
Контрагент и Организация. Это означает, что платформа автоматически передает в процедуру ОбработкаПолученияДанныхВыбора уже заполненную структуру Параметры.Отбор.Отбор.ПометкаУдаления(Ложь).Эти настройки визуально не видны в коде, но они определяют, какие именно данные будут искаться платформой при вводе текста.
В современных версиях «1С:Предприятие 8.3» поиск в полях ввода часто интегрирован с индексом полнотекстового поиска. Если в настройках программы включен ПП и индекс актуален, система может предлагать варианты, основываясь не только на прямом совпадении начала строки, но и на вхождении слов. Это объясняет, почему при вводе «Договор 1» система может предложить «Договор 11» или «Новый Договор 1». Платформа анализирует релевантность и выводит наиболее подходящие записи.
Если вам нужно «поймать» момент формирования списка и увидеть реальный запрос к базе, воспользуемся следующими методами:
DBMSSQL (для SQL-версии) или SDBL. В момент ввода текста в поле договора в журнале зафиксируется SQL-запрос. В нем вы увидите конструкцию LIKE '%Договор 1%' и все примененные условия WHERE.ОбработкаПолученияДанныхВыбора, что позволит проанализировать содержимое переменной Параметры.Справочник.ДоговорыКонтрагентов с теми же фильтрами, которые вы увидели в ОбработкаПолученияДанныхВыбора.Важный совет: Если вы хотите полностью изменить алгоритм формирования списка (например, искать договоры по дополнительному реквизиту), вам необходимо в процедуре ОбработкаПолученияДанныхВыбора установить СтандартнаяОбработка = Ложь; и самостоятельно сформировать массив или таблицу значений в переменной ДанныеВыбора. Только в этом случае стандартный механизм платформы будет отключен, и вы получите полный контроль над содержимым всплывающего списка.