Где в 1С формируется список выбора при вводе наименования договора?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При работе в современных конфигурациях на платформе 1С:Предприятие 8.3 (таких как «Бухгалтерия предприятия 3.0» или «ERP») пользователи часто сталкиваются с удобным механизмом: при начале ввода текста в поле (например, «Договор») система мгновенно предлагает список подходящих элементов. Однако для разработчика поиск конкретного места в коде, где формируется этот список, может стать настоящим квестом. Разберем детально, как работает этот механизм «под капотом» и почему стандартный поиск по коду не всегда дает результат.

1. Механизм «Ввод по строке» на уровне метаданных

Прежде всего, нам необходимо понять, что большая часть магии автоподбора происходит на уровне платформы, а не программного кода. Проанализируем настройки объекта метаданных. В конфигураторе откроем справочник ДоговорыКонтрагентов и перейдем на вкладку Данные. Здесь нас интересует список «Ввод по строке».

По умолчанию там выбраны поля Наименование и Код. Когда пользователь начинает вводить текст в поле на форме, платформа автоматически генерирует SQL-запрос к базе данных, пытаясь найти совпадения в этих полях. Это происходит без участия встроенного языка, если разработчик специально не переопределил это поведение. Именно поэтому, просматривая модули, вы можете не найти явного формирования списка — платформа делает это за вас.

2. Работа процедуры ОбработкаПолученияДанныхВыбора

Если нам все же нужно вмешаться в процесс формирования списка или понять, какие фильтры накладываются, мы обращаемся к Модулю менеджера объекта. Рассмотрим процедуру ОбработкаПолученияДанныхВыбора, которая была представлена в обсуждении:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    Если Параметры.Отбор.Свойство("Организация") Тогда
        Если ЗначениеЗаполнено(Параметры.Отбор.Организация) Тогда
            Параметры.Отбор.Организация = ОбщегоНазначенияБПВызовСервераПовтИсп.ГоловнаяОрганизация(Параметры.Отбор.Организация);
        КонецЕсли;
    КонецЕсли;
    
    ЗначениеОтбора    = ?(Параметры.Отбор.Свойство("ВидДоговора"), Параметры.Отбор.ВидДоговора, Неопределено);
    ЕстьНедоступные   = Ложь;
    ДоступныеЗначения = Перечисления.ВидыДоговоровКонтрагентов.ПолучитьСписокДоступныхЗначений(
        ЗначениеОтбора, ЕстьНедоступные);
    Если ЕстьНедоступные Тогда
        Если ДоступныеЗначения.Количество() = 0 Тогда
            Параметры.Отбор.Вставить("ВидДоговора", Неопределено);
        ИначеЕсли ДоступныеЗначения.Количество() = 1 Тогда
            Параметры.Отбор.Вставить("ВидДоговора", ДоступныеЗначения[0].Значение);
        Иначе
            Параметры.Отбор.Вставить("ВидДоговора", Новый ФиксированныйМассив(ДоступныеЗначения.ВыгрузитьЗначения()));
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

Таким образом, список формируется динамически: система берет ваш введенный текст «Договор 1», добавляет к нему условия ГДЕ Организация = ... и ГДЕ ВидДоговора В (...), и выполняет поиск по наименованию. Результат мы и видим во всплывающем окошке.

3. Связи параметров выбора и параметры выбора на форме

Выясним причину, по которой список может быть ограничен еще сильнее, чем это кажется из кода модуля менеджера. Рассмотрим свойства элемента формы в документе «Реализация». У поля Договор есть два важнейших свойства:

  1. Связи параметров выбора (ChoiceParameterLinks): Здесь обычно указана связь с полем Контрагент и Организация. Это означает, что платформа автоматически передает в процедуру ОбработкаПолученияДанныхВыбора уже заполненную структуру Параметры.Отбор.
  2. Параметры выбора (ChoiceParameters): Здесь могут быть жестко прописаны условия, например, Отбор.ПометкаУдаления(Ложь).

Эти настройки визуально не видны в коде, но они определяют, какие именно данные будут искаться платформой при вводе текста.

4. Влияние полнотекстового поиска (ПП)

В современных версиях «1С:Предприятие 8.3» поиск в полях ввода часто интегрирован с индексом полнотекстового поиска. Если в настройках программы включен ПП и индекс актуален, система может предлагать варианты, основываясь не только на прямом совпадении начала строки, но и на вхождении слов. Это объясняет, почему при вводе «Договор 1» система может предложить «Договор 11» или «Новый Договор 1». Платформа анализирует релевантность и выводит наиболее подходящие записи.

5. Как отследить формирование списка на практике?

Если вам нужно «поймать» момент формирования списка и увидеть реальный запрос к базе, воспользуемся следующими методами:

  1. Технологический журнал: Настройте сбор событий DBMSSQL (для SQL-версии) или SDBL. В момент ввода текста в поле договора в журнале зафиксируется SQL-запрос. В нем вы увидите конструкцию LIKE '%Договор 1%' и все примененные условия WHERE.
  2. Замер производительности: Включите замер в конфигураторе и введите текст в поле. Несмотря на то что поиск делает платформа, вы увидите обращения к серверу и выполнение процедуры ОбработкаПолученияДанныхВыбора, что позволит проанализировать содержимое переменной Параметры.
  3. Консоль запросов: Попробуйте воспроизвести логику вручную, написав запрос к таблице Справочник.ДоговорыКонтрагентов с теми же фильтрами, которые вы увидели в ОбработкаПолученияДанныхВыбора.

Важный совет: Если вы хотите полностью изменить алгоритм формирования списка (например, искать договоры по дополнительному реквизиту), вам необходимо в процедуре ОбработкаПолученияДанныхВыбора установить СтандартнаяОбработка = Ложь; и самостоятельно сформировать массив или таблицу значений в переменной ДанныеВыбора. Только в этом случае стандартный механизм платформы будет отключен, и вы получите полный контроль над содержимым всплывающего списка.

← На главную