При разработке интерфейсов на управляемых формах 1С программисты часто сталкиваются с ситуацией, когда стандартного функционала выбора недостаточно. Например, требуется открыть форму справочника с жестким фильтром, который зависит от других реквизитов формы. Однако иногда вместо ожидаемого открытия полноценного окна выбора под полем ввода внезапно всплывает список «быстрого выбора», который мешает пользователю. В этой статье мы подробно разберем причину возникновения этой проблемы и выясним, как правильно настроить программное открытие формы без лишних визуальных эффектов.
Рассмотрим стандартную ситуацию. У нас есть таблица значений с колонкой Номенклатура. Мы хотим, чтобы при нажатии на кнопку выбора (или клавишу F4) открывалась форма выбора, где отображаются только товары, закрепленные за определенным цехом. Разработчик пишет код в обработчике НачалоВыбора, устанавливает СтандартнаяОбработка = Ложь, но быстрый выбор всё равно появляется.
Проанализируем код, который часто становится причиной такой ошибки. Ключевой момент здесь кроется во взаимодействии с параметром ДанныеВыбора. В платформе 1С этот параметр предназначен специально для того, чтобы сформировать список значений, который будет показан пользователю в виде выпадающего меню прямо под полем ввода. Как только в коде происходит обращение к этому параметру и его заполнение, платформа считает, что вы хотите использовать механизм «быстрого выбора».
Посмотрим на пример кода, который вызывает проблему:
Процедура ТаблицаНоменклатураНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Вызов серверной процедуры, которая заполняет ДанныеВыбора
НачалоВыбораНаСервере(ДанныеВыбора);
// Программное открытие формы
ФормаВыбора = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора",, Элемент);
// ... установка отборов ...
ФормаВыбора.Открыть();
КонецПроцедуры
В данном примере выполняется двойное действие. С одной стороны, процедура НачалоВыбораНаСервере(ДанныеВыбора) наполняет список ссылок и возвращает его в параметр ДанныеВыбора. С другой стороны, вызывается метод Открыть() для формы. Платформа отрабатывает оба сценария: показывает выпадающий список (так как ДанныеВыбора заполнены) и открывает форму. Чтобы убрать быстрый выбор, параметр ДанныеВыбора должен оставаться в значении Неопределено.
Чтобы корректно реализовать выбор с отбором и исключить появление списка быстрого выбора, выполним следующие шаги:
ДанныеВыбора. Если ваша цель — открыть полноценную форму, не передавайте в этот параметр никаких значений.ДанныеВыбора, используйте обычную переменную внутри процедуры.БыстрыйВыбор установлен в значение Нет, а РежимВыбораИзСписка также выключен.Проанализируем исправленный вариант реализации, где мы разделяем получение данных и открытие формы:
&НаКлиенте
Процедура ТаблицаНоменклатураНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный механизм
// Проверяем обязательные условия (например, заполнение цеха)
Если НЕ ЗначениеЗаполнено(Объект.Цех) Тогда
Сообщить("Необходимо выбрать цех!");
Возврат;
КонецЕсли;
// Получаем список ссылок для отбора (не используя ДанныеВыбора!)
СписокДляОтбора = ПолучитьСписокНоменклатурыПоЦеху(Объект.Цех);
// Параметры для открытия формы выбора
ПараметрыВыбора = Новый Структура;
// Формируем фиксированные настройки отбора
Отбор = Новый Структура("Ссылка", СписокДляОтбора);
ПараметрыВыбора.Вставить("Отбор", Отбор);
ПараметрыВыбора.Вставить("ЗакрыватьПриВыборе", Истина);
// Открываем форму с нужными параметрами
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыВыбора, Элемент);
КонецПроцедуры
В этом коде мы используем метод ОткрытьФорму вместо ПолучитьФорму. Это более современный и рекомендуемый подход для управляемых форм, так как он позволяет передать структуру параметров (включая отборы) сразу при инициализации формы.
Помимо программного кода, на поведение поля ввода влияют настройки в конфигураторе. Проанализируем наиболее важные из них:
Ложь.Нет, если хотите ограничить действия пользователя только выбором из формы.Рассмотрим ситуацию, когда вам все же нужен быстрый выбор, но вы хотите им управлять. Для этого существует событие ОбработкаПолученияДанныхВыбора в модуле менеджера объекта (например, справочника). Оно срабатывает автоматически, когда пользователь вводит текст в поле или нажимает кнопку выпадающего списка.
Если же ваша задача — строго запретить быстрый выбор в конкретном месте конфигурации, лучше всего использовать подход с программным открытием формы в событии НачалоВыбора и обязательной установкой СтандартнаяОбработка = Ложь. При этом крайне важно следить за тем, чтобы параметр ДанныеВыбора не инициализировался как Новый СписокЗначений.
Мы выяснили, что основной причиной появления нежелательного быстрого выбора является некорректная работа с параметрами события НачалоВыбора. Помните: ДанныеВыбора — это инструмент для создания выпадающего списка «под полем», а ОткрытьФорму — для открытия полноценного диалогового окна. Совмещение этих механизмов приводит к конфликтам интерфейса. Используйте предложенные рекомендации и структуру кода, чтобы сделать работу ваших пользователей в 1С комфортной и предсказуемой.