Как убрать автоматический быстрый выбор при программном открытии формы в 1С

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

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

Анализ проблемы: почему появляется быстрый выбор?

Рассмотрим стандартную ситуацию. У нас есть таблица значений с колонкой Номенклатура. Мы хотим, чтобы при нажатии на кнопку выбора (или клавишу F4) открывалась форма выбора, где отображаются только товары, закрепленные за определенным цехом. Разработчик пишет код в обработчике НачалоВыбора, устанавливает СтандартнаяОбработка = Ложь, но быстрый выбор всё равно появляется.

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

Разбор критической ошибки в коде

Посмотрим на пример кода, который вызывает проблему:


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

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

Пошаговое решение проблемы

Чтобы корректно реализовать выбор с отбором и исключить появление списка быстрого выбора, выполним следующие шаги:

  1. Откажитесь от использования параметра ДанныеВыбора. Если ваша цель — открыть полноценную форму, не передавайте в этот параметр никаких значений.
  2. Создайте локальную переменную для хранения результатов отбора. Вместо того чтобы передавать список в ДанныеВыбора, используйте обычную переменную внутри процедуры.
  3. Настройте свойства элемента формы. Убедитесь, что у поля ввода в палитре свойств параметр БыстрыйВыбор установлен в значение Нет, а РежимВыбораИзСписка также выключен.

Реализация правильного кода

Проанализируем исправленный вариант реализации, где мы разделяем получение данных и открытие формы:


&НаКлиенте
Процедура ТаблицаНоменклатураНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартный механизм
    
    // Проверяем обязательные условия (например, заполнение цеха)
    Если НЕ ЗначениеЗаполнено(Объект.Цех) Тогда
        Сообщить("Необходимо выбрать цех!");
        Возврат;
    КонецЕсли;

    // Получаем список ссылок для отбора (не используя ДанныеВыбора!)
    СписокДляОтбора = ПолучитьСписокНоменклатурыПоЦеху(Объект.Цех);
    
    // Параметры для открытия формы выбора
    ПараметрыВыбора = Новый Структура;
    
    // Формируем фиксированные настройки отбора
    Отбор = Новый Структура("Ссылка", СписокДляОтбора);
    ПараметрыВыбора.Вставить("Отбор", Отбор);
    ПараметрыВыбора.Вставить("ЗакрыватьПриВыборе", Истина);
    
    // Открываем форму с нужными параметрами
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыВыбора, Элемент);

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

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

Важные свойства элемента формы, влияющие на выбор

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

Использование события ОбработкаПолученияДанныхВыбора

Рассмотрим ситуацию, когда вам все же нужен быстрый выбор, но вы хотите им управлять. Для этого существует событие ОбработкаПолученияДанныхВыбора в модуле менеджера объекта (например, справочника). Оно срабатывает автоматически, когда пользователь вводит текст в поле или нажимает кнопку выпадающего списка.

Если же ваша задача — строго запретить быстрый выбор в конкретном месте конфигурации, лучше всего использовать подход с программным открытием формы в событии НачалоВыбора и обязательной установкой СтандартнаяОбработка = Ложь. При этом крайне важно следить за тем, чтобы параметр ДанныеВыбора не инициализировался как Новый СписокЗначений.

Заключение

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

← На главную