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

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

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

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

Подход первый: Перехват события НачалоВыбора через модуль формы

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

Суть метода заключается в следующем: мы определяем, что пользователь пытается выбрать значение из СправочникСсылка.ЗначенияСвойствОбъектов, вычисляем текущее выбранное свойство (владельца) и принудительно устанавливаем его в отбор формы выбора перед тем, как она будет показана.

Рассмотрим пошаговую реализацию:

  1. В модуле формы отчета нам необходимо переопределить обработчик события НачалоВыбора для колонки, отвечающей за правое значение отбора.
  2. Внутри обработчика проверяем тип значения и формируем запрос к ПланВидовХарактеристик.СвойстваОбъектов, чтобы найти нужную ссылку на свойство.
  3. Устанавливаем найденную ссылку как ВыборПоВладельцу для элемента управления.

Вот пример кода, который можно использовать в модуле формы:


Процедура ОтборПравоеЗначениеНачалоВыбора(Элемент, СтандартнаяОбработка)
    Если ТипЗнч(ЭлементыФормы.Отбор.ТекущаяСтрока.ПравоеЗначение) = Тип("СправочникСсылка.ЗначенияСвойствОбъектов") Тогда
        // Проверяем, что отбор ведется по характеристике
        Если Лев(ЭлементыФормы.Отбор.ТекущаяСтрока.ЛевоеЗначение, 27) = "ХарактеристикаНоменклатуры." Тогда
            Запрос = Новый Запрос;
            Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ ПланВидовХарактеристик.СвойстваОбъектов 
            |ГДЕ НазначениеСвойства = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_ХарактеристикиНоменклатуры)
            |И Наименование = &Наименование";
            
            Запрос.УстановитьПараметр("Наименование", Сред(ЭлементыФормы.Отбор.ТекущаяСтрока.ЛевоеЗначение, 28));
            Результат = Запрос.Выполнить().Выбрать();
            
            Если Результат.Следующий() Тогда
                Элемент.ВыборПоВладельцу = Результат.Ссылка;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Подход второй: Использование принудительного открытия формы выбора

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

Для реализации этого метода:

  1. В процедуре ПриОткрытии формы привяжите свой метод к событию НачалоВыбора колонки табличного поля.
  2. В методе-обработчике установите СтандартнаяОбработка = Ложь.
  3. Получите форму выбора справочника ЗначенияСвойствОбъектов.
  4. Установите отбор в полученной форме и вызовите ОткрытьМодально().

Пример кода для реализации через ОткрытьМодально:


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

Важные рекомендации и предостережения

При работе с такими программными решениями важно учитывать следующие аспекты:

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

← На главную