Как отключить выпадающий список у поля ввода в 1С?

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

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

Проанализируем типовую ситуацию: в табличной части документа есть колонка, где пользователь должен либо выбрать номенклатуру из справочника, либо, если нужной позиции нет, ввести ее наименование вручную как обычную строку. При этом создавать новый элемент справочника ему запрещено. Более того, для уже выбранной номенклатуры должна быть возможность изменить ее текстовое представление прямо в документе, не затрагивая саму ссылку на элемент справочника. В таком сценарии выпадающий список, который появляется при вводе текста, теряет смысл и только путает пользователя.

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

Решение 1: Проверка и удаление обработчика события "АвтоПодбор"

Начнем с самого неочевидного, но, как оказалось, действенного решения, которое и помогло автору исходной темы. Иногда причина появления выпадающего списка кроется там, где ее не ожидаешь. Если ваше поле ввода имеет тип Строка, но при вводе текста все равно появляется пустой список выбора, скорее всего, проблема в наличии обработчика события АвтоПодбор.

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

Пошаговые действия:

  1. Откройте форму в конфигураторе.
  2. Выберите проблемный элемент (поле ввода).
  3. Откройте палитру свойств (обычно Ctrl+Shift+P).
  4. Перейдите на вкладку "События".
  5. Найдите событие АвтоПодбор. Если напротив него указана процедура-обработчик, попробуйте ее удалить (нажмите на лупу и кнопку "Очистить").

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

Решение 2: Архитектурный подход — разделение данных и представления

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

Алгоритм реализации:

  1. Настройка колонок. Добавьте в табличную часть два реквизита: НоменклатураПредставление (Строка) и Номенклатура (Ссылка). В редакторе формы выведите на форму только колонку "НоменклатураПредставление", а вторую скройте, убрав у нее свойство "Видимость".
  2. Настройка кнопки выбора. Для видимой строковой колонки установите свойство КнопкаВыбора = Да. Это позволит пользователю инициировать выбор из справочника.
  3. Обработка выбора. Создайте для строковой колонки обработчик события НачалоВыбора. В нем нужно программно открыть форму выбора номенклатуры и обработать результат.

Пример кода для события НачалоВыбора (подготовить его поможет консоль кода с ИИ-помощником):


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

    // Создаем описание оповещения для обработки результата выбора
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораНоменклатуры", ЭтаФорма, Элемент.ТекущиеДанные);

    // Открываем форму выбора справочника
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",, Элемент, Оповещение);
КонецПроцедуры

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


&НаКлиенте
Процедура ПослеВыбораНоменклатуры(РезультатВыбора, ДополнительныеПараметры) Экспорт
    // Если пользователь что-то выбрал (а не просто закрыл форму)
    Если НЕ РезультатВыбора = Неопределено Тогда
        // ДополнительныеПараметры - это ТекущиеДанные строки, которые мы передали
        ТекущаяСтрока = ДополнительныеПараметры;

        // Заполняем обе наши колонки
        ТекущаяСтрока.Номенклатура = РезультатВыбора;
        ТекущаяСтрока.НоменклатураПредставление = РезультатВыбора.Наименование;
    КонецЕсли;
КонецПроцедуры

Преимущества этого подхода:

Решение 3: Простая настройка свойств (если ручной ввод не нужен)

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

Установите следующие свойства для поля ввода (можно использовать редактор форм в режиме предприятия):

  1. КнопкаВыпадающегоСписка = Нет — это напрямую скроет кнопку с треугольником, отвечающую за выпадающий список.
  2. РедактированиеТекста = Нет — это ключевой момент. Запрет редактирования текста автоматически отключает и механизм автоподбора, и, соответственно, выпадающий список.
  3. КнопкаВыбора = Да — оставляет кнопку с тремя точками для открытия формы выбора.
  4. ОтображениеКнопкиВыбора = В поле — делает кнопку выбора более заметной.
  5. БыстрыйВыбор = Нет — отключает возможность выбора из списка без открытия полной формы.
  6. ИсторияВыбораПриВводе = Нет — отключает показ истории ранее выбранных значений.

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

Решение 4: Полный программный контроль через событие "НачалоВыбора"

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

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

Пример реализации для поля "Характеристика":

Сначала отключаем стандартные механизмы в свойствах поля: РежимВыбораИзСписка = Ложь и РедактированиеТекста = Ложь (если применимо).

Затем создаем обработчик события НачалоВыбора.


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

    // Получаем владельца для отбора (например, номенклатуру из текущей строки)
    ВладелецХарактеристики = Элемент.ТекущиеДанные.Номенклатура;

    // Готовим параметры для открытия нашей формы
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор.Владелец", ВладелецХарактеристики);

    // Готовим оповещение для получения результата
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораХарактеристики", ЭтаФорма, Элемент.ТекущиеДанные);

    // Открываем нужную нам форму с нужными параметрами
    ОткрытьФорму("Справочник.ХарактеристикиНоменклатуры.ФормаВыбора", ПараметрыФормы, Элемент, ОписаниеОповещения);
КонецПроцедуры

И процедура-обработчик результата:


&НаКлиенте
Процедура ПослеВыбораХарактеристики(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
    Если РезультатЗакрытия <> Неопределено Тогда
        // Записываем выбранное значение в текущую строку табличной части
        ДополнительныеПараметры.Характеристика = РезультатЗакрытия;
    КонецЕсли;
КонецПроцедуры

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

← На главную