Как передать параметры в форму выбора, открываемую стандартной командой "Подбор" из формы "ВводЗначенийСпискомСФлажками"?

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

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

Почему нельзя "попасть в обработчик Подбор"?

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

Несмотря на отсутствие прямого доступа к обработчику, у нас есть несколько подходов для решения этой задачи. Рассмотрим их подробнее.

Решение 1: Создание собственной формы и реализации механизма подбора

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

  1. Создадим новую форму.

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

  2. Разместим на ней свой элемент для подбора.

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

  3. Реализуем обработчик команды подбора.

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

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

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

  4. Обработаем параметры в открываемой форме.

    В модуле открываемой формы выбора (например, Справочник.Номенклатура.ФормаВыбора), мы можем получить эти параметры в процедуре ПриСозданииНаСервере.

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

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

Решение 2: Использование процедуры ОбработкаПолученияФормы в модуле менеджера справочника

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

  1. Назначение и принцип работы ОбработкаПолученияФормы.

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

    Сигнатура процедуры:

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

    Поскольку стандартная команда "Подбор" из ВводЗначенийСпискомСФлажками не передает *произвольные* параметры, мы должны либо:

    1. Использовать стандартные параметры выбора:

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

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

    2. Определять логику отбора внутри самой ОбработкаПолученияФормы:

      Если нам не удается передать специфические параметры извне, мы можем написать логику в ОбработкаПолученияФормы, которая будет определять необходимый отбор на основании других косвенных признаков или просто применять заранее заданные фильтры.

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

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

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

Заключение

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

← На главную