Разработка контекстных отчетов в экосистеме Библиотеки стандартных подсистем (БСП) имеет свои особенности. Контекстный отчет — это отчет, который вызывается из формы списка или формы объекта (например, документа) и автоматически фильтруется по выбранным элементам. Основная сложность часто заключается в том, чтобы передать массив ссылок (объекты назначения) так, чтобы Система компоновки данных (СКД) корректно их восприняла, а пользователь увидел примененные отборы в интерфейсе. Для решения этой задачи можно использовать инструмент для переноса отборов из динамического списка в отчет СКД.
Рассмотрим подробнее, как реализовать этот механизм, разберем типичные ошибки и проанализируем работающие программные решения.
Прежде чем приступать к программному коду в модуле отчета, необходимо правильно настроить запрос в СКД. Для того чтобы поле отбора было доступно подсистеме БСП, оно должно быть явно определено в расширении языка запросов.
Проанализируем пример корректного фрагмента запроса. Важно использовать необязательное условие в секции ГДЕ, чтобы СКД могла гибко управлять фильтрацией. Рекомендуется использовать конструкцию {ГДЕ Ссылка.* КАК Ссылка}. Это позволит компоновщику автоматически распознать поле и предложить его в списке доступных отборов.
Если вы хотите, чтобы отчет реагировал на параметры организаций или ссылок, запрос может выглядеть так:
ВЫБРАТЬ
ЗаказНаПроизводствоТовары.Номенклатура КАК Номенклатура,
ЗаказНаПроизводствоТовары.Количество КАК Количество,
ЗаказНаПроизводствоТовары.Ссылка КАК Ссылка
ПОМЕСТИТЬ ДанныеТабличнойЧасти
ИЗ
Документ.ЗаказНаПроизводство.Товары КАК ЗаказНаПроизводствоТовары
ГДЕ
ЗаказНаПроизводствоТовары.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.ЮвелирноеИзделие)
{ГДЕ
(ЗаказНаПроизводствоТовары.Ссылка.ДокументОснование.Организация В (&Организации),
ЗаказНаПроизводствоТовары.Ссылка.* КАК Ссылка)}
Обратите внимание на псевдоним КАК Ссылка внутри фигурных скобок. Это критически важно для того, чтобы поле появилось в наборе данных компоновки. Если псевдоним не указан, поле может быть недоступно для программной установки отбора через механизмы БСП.
Наиболее правильный и современный способ интеграции с БСП — использование предопределенных процедур в модуле отчета. Разберем по шагам, как настроить форму отчета при его открытии в контекстном режиме.
Во-первых, нам необходимо переопределить настройки формы в процедуре ОпределитьНастройкиФормы. Здесь мы указываем системе, что отчет должен формироваться сразу и что мы будем обрабатывать событие создания на сервере.
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.ФормироватьСразу = Истина;
Настройки.РазрешеноИзменятьВарианты = Ложь;
Настройки.События.ПриСозданииНаСервере = Истина;
КонецПроцедуры
Во-вторых, в процедуре ПриСозданииНаСервере модуля отчета мы перехватываем параметр ОбъектыНазначения. Этот параметр автоматически передается подсистемой «Дополнительные отчеты и обработки» и содержит массив ссылок на выбранные в списке документы.
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
ОбъектыНазначения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Форма.Параметры, "ОбъектыНазначения");
Если ОбъектыНазначения <> Неопределено Тогда
// Передаем отбор напрямую в параметры формы отчета БСП
Форма.ФормаПараметры.Отбор.Вставить("Ссылка", ОбъектыНазначения);
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он использует внутренние механизмы Вариантов отчетов БСП. Система сама найдет в настройках компоновки поле «Ссылка» и применит к нему переданный массив документов.
Иногда требуется более тонкая настройка, например, когда стандартный механизм не видит поле или нужно вывести отбор именно в панель быстрых настроек для пользователя. В этом случае мы можем программно модифицировать КомпоновщикНастроек.
Выясним причину, почему прямой отбор в настройках может не работать: часто он попадает в «основные настройки», которые перекрываются «пользовательскими настройками». Чтобы избежать дублирования и добиться видимости, нужно найти идентификатор пользовательской настройки и обновить значение именно там. Для быстрой настройки взаимодействия элементов формы с компоновкой пригодится решение для стыковки элементов управляемой формы и пользовательских настроек СКД.
Рассмотрим пример реализации через событие ПослеЗаполненияПанелиБыстрыхНастроек:
Процедура ПослеЗаполненияПанелиБыстрыхНастроек(Форма, ПараметрыОбновления) Экспорт
ОбъектыНазначения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Форма.Параметры, "ОбъектыНазначения");
Если ОбъектыНазначения = Неопределено Тогда
Возврат;
КонецЕсли;
СписокЗначенийОтбора = Новый СписокЗначений;
СписокЗначенийОтбора.ЗагрузитьЗначения(ОбъектыНазначения);
ОтборНастройки = Форма.Отчет.КомпоновщикНастроек.Настройки.Отбор;
// Устанавливаем элемент отбора в основных настройках
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
ОтборНастройки,
"Ссылка",
СписокЗначенийОтбора,
ВидСравненияКомпоновкиДанных.ВСписке,
,
Истина,
РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ);
// Синхронизируем с пользовательскими настройками
ПользовательскиеНастройки = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;
Для Каждого Элемент Из ОтборНастройки.Элементы Цикл
Если Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка") Тогда
Идентификатор = Элемент.ИдентификаторПользовательскойНастройки;
ЭлементПольз = ПользовательскиеНастройки.Элементы.Найти(Идентификатор);
Если ЭлементПольз <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(ЭлементПольз, Элемент);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В процессе реализации контекстных отчетов часто возникают следующие ситуации:
ПриСозданииНаСервере, и через КомпоновщикНастроек, в итоговом запросе могут появиться два одинаковых условия. БСП сама умеет обрабатывать контекстные вызовы, поэтому старайтесь использовать только один механизм.КомпоновщикНастроек.ФиксированныеНастройки. Это гарантирует, что фильтр будет применен «жестко» и не будет виден в пользовательском интерфейсе.СведенияОВнешнейОбработке() вид отчета должен быть указан как ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОтчетаКонтекстный(), а в таблицу назначений должны быть добавлены типы объектов (например, Документ.ЗаказНаПроизводство).Проанализировав вышеописанные методы, можно сделать вывод: наиболее стабильным решением является использование штатного механизма БСП через Форма.ФормаПараметры.Отбор. Это минимизирует количество кода и позволяет избежать конфликтов с внутренними механизмами платформы 1С.