Как убрать автозаполнение и настроить свою форму выбора в отборе компоновщика настроек 1С

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

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

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

Выясняем причину проблемы: почему двоится выбор?

Проанализируем ситуацию. Когда мы выводим коллекцию отборов компоновщика на форму, система по умолчанию включает свойство автозаполнения колонок для этой таблицы формы. Из-за этого колонки генерируются динамически «на лету» во время работы приложения. Попытки перехватить события через обработчик ПриАктивизацииЯчейки приводят к тому, что событие срабатывает, но стандартное системное действие (вывод истории ввода или стандартный интерактивный выбор) не отменяется, так как у этого события на уровне таблицы нет параметра СтандартнаяОбработка.

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

Способ 1. Отключение автозаполнения колонок таблицы формы и ручная настройка

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

Разберем этот процесс по шагам:

  1. Откройте управляемую форму, на которой размещена таблица отбора компоновщика настроек.
  2. Выделите элемент формы типа Таблица, отображающий отбор (например, с именем КомпоновщикНастройкиОтбор).
  3. В палитре свойств найдите флажок Автозаполнение колонок (или кнопку командной панели «Добавить колонки») и снимите его.
  4. После снятия этого флага платформа самостоятельно добавит в дерево элементов формы все стандартные колонки: ЛевоеЗначение, ВидСравнения, ПравоеЗначение, Использование и другие.
  5. Теперь эти колонки стали полноценными элементами формы, доступными для настройки в конфигураторе. Найдите добавленное поле ввода КомпоновщикНастройкиОтборПравоеЗначение.
  6. Перейдите в свойства этого поля ввода и настройте поведение истории выбора:
    • Установите свойство История выбора при вводе в значение Не использовать. Это полностью исключит появление кэшированных данных при клике на поле.
    • Свойство Кнопка выпадающего списка переведите в значение Нет, чтобы скрыть стрелку быстрого выбора.
    • Свойство Кнопка выбора установите в значение Да, чтобы оставить только кнопку с тремя точками для вызова нашей формы.
  7. Создайте для этого поля событие НачалоВыбора на клиенте.

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


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

Обратите внимание на строку СтандартнаяОбработка = Ложь;. Без этой инструкции платформа проигнорирует наш вызов и попытается открыть форму выбора по умолчанию параллельно с нашей.

Способ 2. Программная настройка автозаполняемой колонки (без отключения автозаполнения)

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

Посмотрим на пример реализации такого подхода:


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

Теперь опишем подключаемый клиентский метод. Он должен располагаться в модуле этой же формы с директивой компиляции &НаКлиенте:


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

Этот способ крайне элегантен: он не перегружает интерфейс формы в конфигураторе ручной версткой колонок и обеспечивает высокую гибкость при обновлении конфигурации.

Способ 3. Использование связей параметров выбора на уровне схемы компоновки данных (СКД)

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

Проанализируем этот механизм:

  1. Откройте схему компоновки данных (СКД) вашего отчета в конфигураторе.
  2. Перейдите на вкладку Наборы данных.
  3. Найдите поле, для которого пользователи будут настраивать отбор, и обратите внимание на свойства в правой части таблицы полей.
  4. Используйте колонку Параметры выбора: здесь вы можете жестко задать параметры, которые будут всегда передаваться в форму выбора этого объекта (например, признак проведения документов или пометка удаления).
  5. Используйте колонку Связи параметров выбора: этот инструмент незаменим, когда параметры выбора одного поля зависят от значения другого поля. Например, если в отборе выбрана конкретная организация, то при выборе банковского счета в этой же таблице отборов платформа автоматически передаст выбранную организацию в качестве параметра-владельца.

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

Способ 4. Глобальное отключение быстрого выбора на уровне метаданных

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

Для этого в дереве метаданных конфигуратора найдите нужный прикладной объект (например, справочник или документ) и перейдите в его свойства:

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

Заключение

Мы подробно разобрали несколько способов решения проблемы с автозаполнением и кастомным выбором в таблице отборов компоновщика настроек. Выбор конкретного метода зависит от архитектуры вашей задачи:

← На главную