Как в управляемых формах 1С отключить историю выбора для поля и настроить его на немедленное открытие формы выбора?

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

В процессе работы с управляемыми формами 1С мы часто сталкиваемся с необходимостью тонкой настройки полей ввода, особенно тех, которые используются для выбора значений из справочников или документов. Одной из распространённых задач является отключение стандартного механизма истории выбора, который при активизации поля может открывать выпадающий список ранее выбранных значений или окно с подсказкой «Введите строку для поиска». Наша цель — добиться того, чтобы при активизации незаполненного поля сразу открывалась форма выбора, минуя любые промежуточные шаги. Давайте разберем этот процесс подробно, шаг за шагом.

Понимание стандартного поведения поля выбора в 1С:УФ

Прежде чем перейти к решению, рассмотрим, как обычно ведут себя поля выбора в управляемых формах 1С и почему стандартное поведение может быть нежелательным. По умолчанию, когда мы активируем поле ввода, предназначенное для выбора значения:

  1. Если у поля есть история выбора, может появиться выпадающий список с последними значениями и кнопкой «Показать все».
  2. Если истории нет или она отключена, при активизации пустого поля часто появляется текстовая подсказка «Введите строку для поиска».
  3. Для открытия формы выбора обычно требуется нажать специальную кнопку выбора (иконку с многоточием) или нажать Enter.

Такое поведение может замедлять работу пользователя, особенно когда требуется быстро выбрать значение из большого справочника, и история выбора нерелевантна или даже вредна (например, из-за сложных отборов, которые история не учитывает, как в нашем случае с номенклатурой по разным видам).

Основные настройки свойств поля ввода для отключения истории и прямого открытия формы выбора

Для достижения желаемого результата нам потребуется настроить несколько ключевых свойств элемента формы — поля ввода. Перейдем в палитру свойств нашего поля ввода и изменим следующие параметры:

Шаг 1: Отключаем историю выбора и вспомогательные кнопки

Сначала мы отключим все, что может привести к появлению нежелательных выпадающих списков и дополнительных действий:

  1. Свойство ИсторияВыбораПриВводе (History of selection on input):

    Установим это свойство в значение Отключено (Disabled).

    Объяснение: Это свойство контролирует, будет ли платформа сохранять и отображать историю ранее выбранных значений для данного поля. Однако, как мы убедились на практике, само по себе оно не всегда полностью убирает выпадающее окно, особенно если в дело вступают другие механизмы, такие как быстрый выбор или программный автоподбор. Но это первый и важный шаг.

  2. Свойство КнопкаСоздания (Creation Button):

    Установим это свойство в значение Нет (No).

    Объяснение: Это предотвратит появление кнопки для создания нового элемента непосредственно в поле ввода, упрощая интерфейс.

  3. Свойство КнопкаВыпадающегоСписка (Dropdown list button):

    Установим это свойство в значение Нет (No).

    Объяснение: Эта кнопка может вызывать различные выпадающие списки, включая историю или быстрый выбор. Отключив её, мы дополнительно ограничиваем появление нежелательных окон.

  4. Свойство БыстрыйВыбор (Quick choice):

    Установим это свойство в значение Нет (No).

    Объяснение: Механизм быстрого выбора может показывать предопределенные элементы или элементы, недавно выбранные, если история выбора не полностью отключена. Установка в Нет полностью деактивирует этот механизм.

  5. Свойство КнопкаВыбора (DisplayChoiceButton):

    Убедимся, что это свойство установлено в значение ВПолеВвода (In the input field).

    Объяснение: Эта настройка является базовой и позволяет отображать кнопку выбора (иконку с многоточием) непосредственно в поле ввода, что крайне важно для того, чтобы пользователь мог вручную открыть форму выбора. В нашем случае, мы хотим, чтобы форма открывалась автоматически, но эта кнопка всё равно необходима как запасной вариант или для ситуации, когда поле уже заполнено.

Шаг 2: Настраиваем автоматическое открытие формы выбора для незаполненного поля

Теперь, когда мы избавились от нежелательных выпадающих списков, настроим поведение поля таким образом, чтобы при его активизации сразу открывалась форма выбора.

  1. Свойство РежимВыбораНеЗаполненного (Choice mode for empty field):

    Установим это свойство в значение ПриАктивизации (On Activation).

    Объяснение: Изначально это свойство часто установлено в ПриНажатииEnter (On Enter). Изменение на ПриАктивизации означает, что поле будет пытаться открыть форму выбора или выполнить другое действие, как только оно получит фокус. Это устраняет необходимость дополнительного нажатия Enter или кнопки выбора для незаполненного поля, но само по себе может приводить к появлению "Введите строку для поиска".

  2. Свойство АвтоВыборНеЗаполненного (Auto choice for empty field):

    Установим это свойство в значение Да (Yes).

    Объяснение: Это ключевое свойство для решения нашей задачи. Если оно установлено в Да, то при активизации пустого поля выбора платформа автоматически откроет форму выбора, без каких-либо промежуточных окон типа «Введите строку для поиска». В сочетании с РежимВыбораНеЗаполненного = ПриАктивизации это позволяет нам добиться желаемого поведения.

После применения этих настроек, при активизации незаполненного поля ввода, форма выбора должна открываться мгновенно, без показа истории или подсказок.

Сложные случаи: когда программный автоподбор мешает

Мы выяснили, что в некоторых случаях, даже при тщательной настройке свойств поля, окно истории или выпадающий список все равно может появляться. Это может произойти, если на форме реализован собственный механизм автоподбора через событие АвтоПодбор (AutoFill) для поля ввода.

Причина проблемы: Платформа 1С, при подсовывании собственного списка автоподбора в обработчике события АвтоПодбор, может неявно (и довольно настойчиво) подмешивать в этот список результаты поиска по истории, даже если свойство ИсторияВыбораПриВводе отключено для поля. Таким образом, если наш обработчик АвтоПодбор возвращает пустой список (потому что пользователь еще ничего не ввел), платформа может заполнить его данными из истории, и мы снова увидим нежелательное окно.

Решение: Чтобы избежать этого, нам нужно явно контролировать содержимое списка, передаваемого платформе в обработчике АвтоПодбор. Один из подходов — использовать стандартный автоподбор платформы в случае, если пользователь еще ничего не ввел в поле (то есть, строка поиска пуста), и только при вводе текста использовать собственный механизм.

Рассмотрим пример, как можно адаптировать обработчик АвтоПодбор:


&НаКлиенте
Процедура ПолеВводаНоменклатураАвтоПодбор(Элемент, Текст, СписокПредложений, СтандартнаяОбработка)
    // Отменяем стандартную обработку, чтобы полностью контролировать список
    СтандартнаяОбработка = Ложь;

    Если ПустаяСтрока(Текст) Тогда
        // Если текст для поиска пуст, используем стандартный механизм автоподбора платформы
        // для предотвращения показа нежелательной истории, если она все же каким-то образом 'просачивается'.
        // В данном случае, если все свойства поля настроены правильно,
        // этот блок может привести к тому, что ничего не будет показано,
        // но и история не появится.
        // Или, как вариант, можно здесь вообще ничего не делать и позволить полю открываться формой выбора
        // за счет АвтоВыборНеЗаполненного = Да.
        // Если же нужно все-таки что-то показывать, но без истории, то придется формировать список вручную
        // по своим правилам.
        СтандартнаяОбработка = Истина; // В данном случае, мы хотим вернуть платформе контроль,
                                       // если не хотим показывать свою историю,
                                       // но и не хотим, чтобы платформа показывала свою.
                                       // Это может быть нюансом поведения.

        // Более надежный вариант, если стандартная обработка все равно показывает историю:
        // Просто ничего не добавлять в СписокПредложений, тогда ничего и не отобразится,
        // а АвтоВыборНеЗаполненного сработает.
        Возврат;
    КонецЕсли;

    // Если пользователь начал вводить текст, формируем свой список предложений
    // с учетом необходимых отборов, но БЕЗ учета истории.
    // Пример:
    // Запрос = Новый Запрос;
    // Запрос.Текст =
    // "ВЫБРАТЬ
    // |    СправочникНоменклатура.Ссылка КАК Ссылка,
    // |    СправочникНоменклатура.Наименование КАК Представление
    // |ИЗ
    // |    Справочник.Номенклатура КАК СправочникНоменклатура
    // |ГДЕ
    // |    СправочникНоменклатура.Наименование ПОДОБНО &Текст + ""%""";
    // Запрос.УстановитьПараметр("Текст", Текст);
    //
    // РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    // Для Каждого СтрокаТЗ Из РезультатЗапроса Цикл
    //     СписокПредложений.Добавить(СтрокаТЗ.Ссылка, СтрокаТЗ.Представление);
    // КонецЦикла;
    
    // В данном примере мы предполагаем, что у вас есть серверный вызов для получения списка
    // по Тексту с вашими отборами.
    СписокЗначенийАвтоподбора = ПолучитьСписокДляАвтоподбораНаСервере(Текст, ПараметрыОтбора);
    Для Каждого ЭлементСписка Из СписокЗначенийАвтоподбора Цикл
        СписокПредложений.Добавить(ЭлементСписка.Значение, ЭлементСписка.Представление);
    КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ПолучитьСписокДляАвтоподбораНаСервере(ТекстПоиска, ПараметрыОтбора)
    СписокРезультатов = Новый СписокЗначений;
    // Здесь реализуйте свою логику запроса к справочнику с учетом
    // ТекстаПоиска и ПараметровОтбора, например, по ВидуНоменклатуры.
    // ...
    // Например:
    // Запрос = Новый Запрос;
    // Запрос.Текст = "ВЫБРАТЬ
    // |    Номенклатура.Ссылка,
    // |    Номенклатура.Наименование
    // |ИЗ
    // |    Справочник.Номенклатура КАК Номенклатура
    // |ГДЕ
    // |    Номенклатура.Наименование ПОДОБНО &ТекстПоиска
    // |    И Номенклатура.ВидНоменклатуры = &ВидНоменклатуры";
    // Запрос.УстановитьПараметр("ТекстПоиска", "%" + ТекстПоиска + "%");
    // Запрос.УстановитьПараметр("ВидНоменклатуры", ПараметрыОтбора.ВидНоменклатуры);
    // Результат = Запрос.Выполнить().Выгрузить();
    // Для Каждого Строка Из Результат Цикл
    //     СписокРезультатов.Добавить(Строка.Ссылка, Строка.Наименование);
    // КонецЦикла;
    Возврат СписокРезультатов;
КонецФункции

Таким образом, мы даем платформе понять, что при пустом тексте для автоподбора она не должна использовать свою логику, которая может включать историю. А при наличии текста — передаем свой, очищенный от истории список.

Поведение для заполненного поля

Даже после всех вышеописанных настроек, если поле ввода уже содержит выбранное значение и мы его активизируем (например, для изменения значения), может снова появиться подсказка «Введите строку для поиска». Это стандартное поведение платформы: она предлагает пользователю либо ввести текст для поиска нового значения, либо нажать кнопку выбора для открытия полной формы.

К сожалению, стандартными свойствами для уже заполненного поля, чтобы оно при активизации сразу открывало форму выбора, добиться этого без программного вмешательства крайне сложно. Для полного решения этой задачи нам потребуется перехватить событие НачалоВыбора (ChoiceBegin) поля ввода и программно открыть форму выбора:

  1. Событие НачалоВыбора (ChoiceBegin):

    Для поля ввода на форме создадим обработчик события НачалоВыбора.

    Объяснение: Это событие возникает непосредственно перед тем, как платформа начинает стандартный процесс выбора значения. Мы можем перехватить его, отменить стандартную обработку и программно открыть свою форму выбора.

  2. Программное открытие формы выбора:

    В обработчике события нам нужно будет отменить стандартную обработку и вызвать метод ОткрытьФормуВыбора() или Выбрать() для поля.

    
    &НаКлиенте
    Процедура ПолеВводаНоменклатураНачалоВыбора(Элемент, СтандартнаяОбработка)
        // Отменяем стандартную обработку, чтобы платформа не показывала 'Введите строку для поиска'
        СтандартнаяОбработка = Ложь;
    
        // Программно открываем форму выбора для данного элемента
        // Можно использовать метод Выбрать(), который откроет форму выбора объекта,
        // привязанного к данным поля.
        Элемент.Выбрать();
        // Если требуется передать отборы или открыть конкретную форму,
        // используем ОткрытьФорму() с ПараметрыВыбора.
        // Например:
        // ФормаВыбора = ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", , Элемент, , , , , РежимОткрытияОкна.БлокироватьВесьИнтерфейс);
        //
        // Или, если у нас есть специфичная форма выбора с параметрами:
        // ПараметрыФормы = Новый Структура("Отбор", ВашОтбор);
        // ОткрытьФорму("Справочник.Номенклатура.ФормаВыбораСОтбором", ПараметрыФормы, Элемент);
    Процедура
    

    Этот подход позволяет нам полностью контролировать процесс выбора даже для заполненного поля, обеспечивая желаемое поведение без лишних промежуточных окон.

Итоги и рекомендации

Для того чтобы поле выбора в управляемых формах 1С не показывало историю и сразу открывало форму выбора при активизации незаполненного поля, рекомендуем выполнить следующие настройки свойств:

  1. ИсторияВыбораПриВводе: Отключено
  2. КнопкаСоздания: Нет
  3. КнопкаВыпадающегоСписка: Нет
  4. БыстрыйВыбор: Нет
  5. КнопкаВыбора: ВПолеВвода (стандартно)
  6. РежимВыбораНеЗаполненного: ПриАктивизации
  7. АвтоВыборНеЗаполненного: Да (это критически важно)

При наличии собственного обработчика события АвтоПодбор, тщательно контролируйте список предложений, передаваемый платформе, чтобы исключить нежелательное появление истории. В случае с уже заполненным полем, для мгновенного открытия формы выбора потребуется программно перехватывать событие НачалоВыбора и вызывать метод Выбрать() или ОткрытьФорму().

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

← На главную