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

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

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

Суть проблемы: Неожиданное поведение при подборе значений

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

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

Где искать решение: Параметры редактирования поля схемы компоновки данных

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

Один из участников обсуждения на форуме правильно отметил, что


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

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

Программное управление формой выбора (ПараметрыРедактирования.ФормаВыбора)

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

Разберем по шагам, как это сделать:

  1. Получаем доступ к схеме компоновки данных: Если схема создается программно, у нас уже есть объект типа СхемаКомпоновкиДанных. Если же схема загружается из макета, мы сначала должны ее загрузить.
  2. Находим нужное поле: Мы должны найти объект ПолеКомпоновкиДанных, соответствующий нашему полю "Номенклатура" (или любому другому справочнику) в наборах данных схемы.
  3. Добавляем или изменяем параметр ФормаВыбора: К коллекции ПараметрыРедактирования этого поля мы добавляем новый параметр или изменяем существующий с именем "ФормаВыбора", указывая в качестве его значения полный путь к нужной форме.

Посмотрим на пример, как это может выглядеть в коде 1С:


// Предположим, у нас уже есть объект СхемаКомпоновкиДанных
// и мы хотим настроить поле "Номенклатура" в первом наборе данных.

// 1. Получаем доступ к первому набору данных (или ищем по имени)
НаборДанных = СхемаКомпоновкиДанных.НаборыДанных[0]; 

// 2. Находим поле "Номенклатура" в этом наборе данных
Для Каждого ПолеСКД Из НаборДанных.Поля Цикл
    Если ПолеСКД.Имя = "Номенклатура" Тогда
        // 3. Получаем доступ к коллекции ПараметрыРедактирования
        ПараметрыРедактированияПоля = ПолеСКД.ПараметрыРедактирования;

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

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

Передача параметров в форму выбора (ПараметрыРедактирования.ПараметрыВыбора)

Часто возникает необходимость не просто открыть определенную форму, но и передать в нее какие-либо параметры, чтобы форма могла скорректировать свой вывод или логику фильтрации. Например, мы можем захотеть, чтобы форма подбора показывала только элементы без групп, или чтобы были применены какие-то специфические фильтры. Для этого используется свойство ПараметрыВыбора, которое также находится в ПараметрахРедактирования поля СКД.

Свойство ПараметрыВыбора принимает в качестве значения объект типа Структура или Массив, который будет передан в открываемую форму. Открываемая форма (в частности, в процедуре ОбработкаПолученияФормы или через параметры, передаваемые в ее конструктор) может затем прочитать эти параметры и соответствующим образом скорректировать свой вывод. Именно об этом шла речь в сообщении пользователя, который заметил:


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

Рассмотрим пример программной установки ПараметровВыбора:


// ... (получаем доступ к полю "Номенклатура", как в предыдущем примере)

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

// 2. Добавляем новый параметр для ПараметрыВыбора
ПараметрПараметрыВыбора = ПараметрыРедактированияПоля.Добавить();
ПараметрПараметрыВыбора.Имя = "ПараметрыВыбора";
ПараметрПараметрыВыбора.Значение = ПараметрыФормы; // Передаем нашу структуру

// ... (остальной код)

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


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

Динамическая фильтрация списка выбора (ПараметрыРедактирования.СвязиПараметровВыбора)

В более сложных сценариях нам может понадобиться, чтобы список выбора для одного поля зависел от значения, выбранного в другом поле отбора. Например, чтобы при выборе "Договора" сначала был выбран "Контрагент". Для этого используются СвязиПараметровВыбора, которые также находятся в ПараметрахРедактирования.

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

Рассмотрим пример, как это может быть настроено программно:


// ... (получаем доступ к полю "Договор", например)

// 1. Создаем объект СвязиПараметровВыбора
СвязьПараметровВыбора = ПолеСКД.ПараметрыРедактирования.СвязиПараметровВыбора.Добавить();

// 2. Указываем, какой параметр формы будет связан
// Например, параметр "Отбор.Владелец" в форме выбора Договоров
СвязьПараметровВыбора.Параметр = "Отбор.Владелец"; 

// 3. Указываем, откуда брать значение для этого параметра.
// Это может быть поле отбора КомпоновщикаНастроек "Контрагент",
// или параметр отчета "Контрагент", если он есть.
СвязьПараметровВыбора.Поле = "Контрагент"; // Имя поля в отборах или параметрах отчета

// ... (остальной код)

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

Алгоритм работы кнопки "Подбор" в окне "Список значений"

Подводя итог, когда в компоновщике настроек мы устанавливаем вид сравнения "В списке" и нажимаем кнопку "Подбор" в окне "Список значений", происходит следующее:

  1. Система обращается к свойствам поля схемы компоновки данных, соответствующего элементу отбора (например, "Номенклатура").
  2. Она проверяет коллекцию ПараметрыРедактирования этого поля.
  3. Если в ПараметрахРедактирования задано свойство ФормаВыбора, открывается форма по указанному пути. В противном случае открывается стандартная форма выбора для данного типа справочника.
  4. Если в ПараметрахРедактирования задано свойство ПараметрыВыбора, его значение (Структура или Массив) передается в открываемую форму, которая может использовать их для своей настройки (фильтрации, установки режимов и т.д.).
  5. Если заданы СвязиПараметровВыбора, система также формирует дополнительные фильтры для открываемой формы, основываясь на значениях других полей отчета или параметров.

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

Мы видим, что на первый взгляд сложная проблема с неожиданным поведением форм подбора имеет вполне логичное и управляемое решение. Используя ПараметрыРедактирования полей схемы компоновки данных, мы получаем полный контроль над процессом выбора элементов справочников, делая наши отчеты и обработки более гибкими и user-friendly.

← На главную