При разработке отчетов на системе компоновки данных (СКД) часто возникает задача вывести примененные пользователем фильтры не в стандартном блоке, который 1С формирует автоматически, а в строго определенных ячейках макета. Например, это может быть «красивая» шапка отчета с логотипом компании или специфический подвал с расшифровкой подписей и указанием периода. Разберем подробно, как реализовать «заковыристый» вывод данных без единой строчки кода в модулях формы или объекта.
Первым делом проанализируем возможности вкладки «Макеты» в схеме компоновки данных. Это мощнейший инструмент, который позволяет полностью переопределить визуальное представление любой части отчета. Вместо того чтобы полагаться на стандартный вывод, мы создадим собственный шаблон для заголовка.
Рассмотрим по шагам процесс создания такого макета:
&ВыбранныйСклад.Важно помнить, что если мы хотим вывести именно значение отбора, который установил пользователь в стандартном окне фильтров, нам нужно предварительно «подготовить» это значение, сделав его доступным для макета.
Стандартная коллекция КомпоновщикНастроек.Настройки.Отбор сложно поддается прямому выводу в конкретную ячейку макета без кода. Поэтому наиболее эффективным методом является использование параметров. Выясним, как связать пользовательский отбор с параметром схемы:
Посмотрим на алгоритм настройки:
ПериодОтчета с типом СтандартныйПериод или Организация с типом ссылки.Теперь значение, которое введет пользователь, попадает в параметр ПараметрыДанных.Организация. В макете нам остается только прописать в ячейке выражение &Организация. Это позволяет разместить выбранное значение в любом месте — хоть в середине текстового предложения в шапке.
Бывают ситуации, когда нужно вывести не просто значение, а отформатированную строку. Например: «Отчет сформирован по складу Центральный за период Январь 2024». Для этого идеально подходят Вычисляемые поля.
Разберем пример выражения для вычисляемого поля:
"Отчет за период с " + Формат(ПараметрыДанных.НачалоПериода, "ДФ=dd.MM.yyyy") + " по " + Формат(ПараметрыДанных.КонецПериода, "ДФ=dd.MM.yyyy")
После создания такого поля, мы можем добавить его в отдельную группировку в самом верху структуры настроек отчета. Чтобы эта группировка не выглядела как строка таблицы, мы назначаем ей пустой детальный макет, где будет выводиться только наше вычисляемое поле в нужном формате.
Проанализируем ситуацию, когда нам нужно вывести представление периода в человекочитаемом виде (например, «Март 2024» вместо «01.03.2024 0:00:00»). В СКД есть встроенные функции, которые работают внутри выражений макета или вычисляемых полей:
ПредставлениеПериода(ДатаНачала, ДатаОкончания, "ФП=Истина") — превращает две даты в красивую строку.Представление(Значение) — получает строковое представление ссылки.Эти функции можно вставлять прямо в параметры макета. Например, в поле «Выражение параметра макета» мы можем написать:
"Выбранные фильтры: " + Представление(ПараметрыДанных.Магазин)
Для вывода значений в подвал (например, кто сформировал отчет или итоговые условия фильтрации в конце страницы), мы используем тот же механизм макетов, но выбираем «Макет подвала отчета».
Рассмотрим нюанс: если нужно вывести итоги, которые зависят от отборов, в подвале макета можно использовать агрегатные функции СКД, такие как Сумма(СуммаОборот) или Количество(Документ). СКД автоматически рассчитает их с учетом всех пользовательских настроек и выведет в те ячейки подвала, которые мы определили в макете.
Хотя в условии задачи указано отсутствие кода в модуле отчета, мы можем использовать функции Общих модулей (с флагами «Клиент», «Сервер», «Вызов сервера»). В выражениях СКД (вычисляемые поля или параметры макета) можно вызывать эти функции.
Пример использования функции общего модуля в выражении макета:
ОбщийМодульОтчетыСервер.СформироватьЗаголовокОтбора(КомпоновщикНастроек.Настройки.Отбор)
Это позволяет реализовать максимально сложную логику обработки коллекции отборов, при этом сам отчет останется «чистым» от кода, так как вся логика будет вынесена в общую библиотеку функций предприятия.
Подведем итог: для реализации «заковыристого» вывода пользовательских отборов нам необходимо комбинировать использование Параметров данных, которые связаны с полями отбора, и Собственных макетов. Это дает полную свободу в оформлении отчета, сохраняя все преимущества декларативного подхода СКД.