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

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

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

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

Подготовка схемы компоновки данных (СКД)

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

Проанализируем пример корректного фрагмента запроса. Важно использовать необязательное условие в секции ГДЕ, чтобы СКД могла гибко управлять фильтрацией. Рекомендуется использовать конструкцию {ГДЕ Ссылка.* КАК Ссылка}. Это позволит компоновщику автоматически распознать поле и предложить его в списке доступных отборов.

Если вы хотите, чтобы отчет реагировал на параметры организаций или ссылок, запрос может выглядеть так:


ВЫБРАТЬ
    ЗаказНаПроизводствоТовары.Номенклатура КАК Номенклатура,
    ЗаказНаПроизводствоТовары.Количество КАК Количество,
    ЗаказНаПроизводствоТовары.Ссылка КАК Ссылка
ПОМЕСТИТЬ ДанныеТабличнойЧасти
ИЗ
    Документ.ЗаказНаПроизводство.Товары КАК ЗаказНаПроизводствоТовары
ГДЕ
    ЗаказНаПроизводствоТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.ЮвелирноеИзделие)
{ГДЕ
    (ЗаказНаПроизводствоТовары.Ссылка.ДокументОснование.Организация В (&Организации),
    ЗаказНаПроизводствоТовары.Ссылка.* КАК Ссылка)}

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

Решение 1: Использование стандартных процедур БСП для управления формой

Наиболее правильный и современный способ интеграции с БСП — использование предопределенных процедур в модуле отчета. Разберем по шагам, как настроить форму отчета при его открытии в контекстном режиме.

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


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

Во-вторых, в процедуре ПриСозданииНаСервере модуля отчета мы перехватываем параметр ОбъектыНазначения. Этот параметр автоматически передается подсистемой «Дополнительные отчеты и обработки» и содержит массив ссылок на выбранные в списке документы.


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

Этот метод хорош тем, что он использует внутренние механизмы Вариантов отчетов БСП. Система сама найдет в настройках компоновки поле «Ссылка» и применит к нему переданный массив документов.

Решение 2: Программная установка пользовательских настроек

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

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

Рассмотрим пример реализации через событие ПослеЗаполненияПанелиБыстрыхНастроек:


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

    СписокЗначенийОтбора = Новый СписокЗначений;
    СписокЗначенийОтбора.ЗагрузитьЗначения(ОбъектыНазначения);
    
    ОтборНастройки = Форма.Отчет.КомпоновщикНастроек.Настройки.Отбор;
    
    // Устанавливаем элемент отбора в основных настройках
    ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
        ОтборНастройки, 
        "Ссылка", 
        СписокЗначенийОтбора, 
        ВидСравненияКомпоновкиДанных.ВСписке,
        , 
        Истина, 
        РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ);

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

Анализ типичных проблем и рекомендации

В процессе реализации контекстных отчетов часто возникают следующие ситуации:

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

Проанализировав вышеописанные методы, можно сделать вывод: наиболее стабильным решением является использование штатного механизма БСП через Форма.ФормаПараметры.Отбор. Это минимизирует количество кода и позволяет избежать конфликтов с внутренними механизмами платформы 1С.

← На главную