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

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

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

Почему не применяется форма выбора из параметров редактирования СКД

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

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

Способ 1. Ограничение списка значений через ДоступныеЗначения

Если цель заключается в том, чтобы дать пользователю возможность выбирать только из ограниченного списка элементов (полученного, например, запросом), не обязательно переопределять форму выбора. Разберем по шагам, как программно ограничить доступные значения поля отбора.

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


СписокКонтрагентов = Новый СписокЗначений;
// Заполняем список значениями из запроса или функции
СписокКонтрагентов.ЗагрузитьЗначения(ПолучитьМассивРазрешенныхКонтрагентов());

ПолеОтбора = КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Контрагент");
Если ПолеОтбора <> Неопределено Тогда
    ПолеОтбора.ДоступныеЗначения = СписокКонтрагентов;
КонецЕсли;

Рассмотрим важные нюансы этого подхода:

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

Способ 2. Перехват события НачалоВыбора в обычном приложении

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

На форме отчета найдем табличное поле, отображающее отбор настроек СКД, и назначим обработчик события НачалоВыбора:


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

Способ 3. Использование события ОбработкаПолученияФормы

Если требуется, чтобы нестандартная форма выбора открывалась не только в одном отчете, но и централизованно в других местах конфигурации, выясним, как переопределить ее на уровне метаданных объекта. В модуле менеджера соответствующего справочника определим обработчик:


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

Способ 4. Использование параметров выбора и связей параметров в управляемом приложении

Если отчет работает на управляемых формах, создание отдельной формы выбора чаще всего избыточно. Для фильтрации элементов в форме выбора на уровне СКД лучше использовать штатные свойства поля:

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

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

← На главную