Разработка сложной отчетности в платформе 1С:Предприятие 8 часто требует от программиста нестандартных решений. Стандартный конструктор отчетов позволяет быстро создать простую таблицу, но бизнес-задачи нередко диктуют необходимость отображения нескольких разнородных блоков данных на одном листе печати. Например, руководителю может потребоваться видеть сводную таблицу продаж и детализацию по менеджерам одновременно, без перехода между вкладками или отдельными формами.
Реализация такого функционала возможна средствами Системы Компоновки Данных (СКД). Это мощный инструмент, который позволяет гибко управлять структурой вывода, однако его возможности по объединению независимых отчетов не всегда очевидны для начинающих разработчиков. В данной статье мы разберем технические нюансы создания многоблочной структуры, настройки связей и управления видимостью элементов.
Вы узнаете, как правильно организовать наборы данных, чтобы они не конфликтовали друг с другом, и как использовать возможности макетов для красивого оформления итогового документа. Мы не будем рассматривать сложные запросы с объединениями, а сосредоточимся именно на архитектуре отчета внутри конфигуратора.
Концептуальное понимание структуры отчета
Прежде чем приступать к практической реализации, необходимо четко понимать, что в терминах СКД понятие"два отчета" трансформируется в понятие"несколько областей вывода" или"разделов". Система не создает два независимых объекта метаданных, а формирует единую структуру, состоящую из логических блоков. Каждый такой блок опираается на свой Набор данных.
Ключевым элементом здесь является правильная организация иерархии. Если вы попытаетесь просто добавить два запроса в один набор данных без разделения, система попытается построить единое дерево результатов, что приведет к ошибке или некорректному выводу ("декартово произведение"). Поэтому фундаментальным правилом является изоляция источников данных для каждого визуального блока.
Для разделения логики формирования разных частей отчета используются Разделы (Sections). Именно они позволяют сказать системе:"здесь выводи блок А, а ниже — блок Б". Без использования разделов или группировок верхнего уровня реализовать задачу корректно практически невозможно.
⚠️ Внимание: Не пытайтесь объединять результаты двух разных запросов в одну таблицу результатов на уровне СУБД, если у них разная структура колонок. Это приведет к потере данных или ошибкам выполнения. Используйте разделение на уровне макета СКД.
Настройка наборов данных и запросов
Первым шагом в конфигураторе является создание схемы компоновки данных. В дереве метаданных найдите элемент СхемаКомпоновкиДанных и откройте его редактор. Здесь вам предстоит создать два независимых набора данных. Назовите их, например, НаборДанных1 и НаборДанных2, чтобы избежать путаницы в дальнейшем.
Для каждого набора данных необходимо прописать свой текст запроса. Важно понимать, что переменные запроса (параметры) в СКД являются общими для всей схемы, если не настроено иное. Это означает, что отбор по периоду или организации, введенный пользователем в форме отчета, должен корректно передаваться в оба запроса.
Рассмотрим пример настройки запросов. В первом запросе мы получаем агрегированные данные, а во втором — детальные записи. Синтаксис запросов 1С позволяет использовать одни и те же параметры:
ВЫБРАТЬ
Контрагенты.Наименование КАК Контрагент,
СУММА(Продажи.Сумма) КАК СуммаПродаж
ИЗ
Документ.РеализацияТоваровУслуг.Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Продажи.Контрагент = Контрагенты.Ссылка
ГДЕ
Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Контрагенты.Наименование
Во втором наборе данных запрос может быть совершенно иным, например, выбирающим список товаров. Главное — убедиться, что имена полей, которые вы планируете использовать в макете, уникальны в контексте каждого набора или четко сопоставлены.
- 📊 Используйте псевдонимы полей (
КАК) для унификации имен колонок, если планируете выводить их в похожих таблицах. - ⚙️ Проверяйте типы данных возвращаемых полей: числовые значения не должны смешиваться со строковыми в вычисляемых полях.
- 🔗 Убедитесь, что параметры
&НачалоПериодаи&КонецПериодаобъявлены в разделе"Параметры" схемы компоновки данных.
Для упрощения отладки сложных запросов временно выведите каждый набор данных в отдельный табличный документ. Это поможет понять, верно ли формируется выборка до применения макета.
Конструирование макета и разделов
Самая важная часть работы происходит в редакторе макета. Именно здесь визуализируется структура"двух отчетов". По умолчанию СКД создает одну область"ОбластьДанных". Вам нужно изменить эту структуру, добавив разделы.
В дереве макета создайте два элемента типа Раздел. Назовите их осмысленно, например,"Раздел_Сводный" и"Раздел_Детальный". Внутри каждого раздела разместите свою область данных. Важно привязать каждую область данных к соответствующему набору данных, созданному на предыдущем этапе.
Настройка привязки осуществляется через свойства элемента в палитре свойств. Для области данных внутри первого раздела выберите в свойстве НаборДанных значение НаборДанных1. Аналогично поступите со вторым разделом. Это гарантирует, что первая таблица заполнится данными первого запроса, а вторая — второго.
| Элемент макета | Тип элемента | Привязанный набор данных | Назначение |
|---|---|---|---|
| Корень | Макет | - | Контейнер всего отчета |
| Раздел_Сводный | Раздел | - | Блок для агрегированных данных |
| ОбластьДанных1 | Область данных | НаборДанных1 | Вывод первой таблицы |
| Раздел_Детальный | Раздел | - | Блок для детализации |
| ОбластьДанных2 | Область данных | НаборДанных2 | Вывод второй таблицы |
Между разделами можно вставлять текстовые заголовки или пустые строки для визуального разделения блоков. Для этого используйте элемент Текстовое поле в дереве макета, размещая его между разделами.
Управление параметрами и отборами
Когда в отчете присутствует несколько наборов данных, управление фильтрами становится критически важным. Пользователь ожидает, что при выборе конкретного склада данные обновятся во всех таблицах отчета одновременно.
В свойствах каждого набора данных существует вкладка"Отборы". Здесь вы можете настроить связь параметров формы с полями запроса. Если структура параметров одинакова для обоих запросов, система автоматически подставит значения. Однако, если логика отличается, требуется ручная настройка.
Например, первый отчет может фильтроваться по"Виду номенклатуры", а второй — по"Статье затрат". В таком случае вам необходимо добавить соответствующие параметры в схему и прописать условия отбора для каждого набора данных отдельно.
⚠️ Внимание: Если вы используете динамические списки или вложенные запросы, убедитесь, что имена параметров не конфликтуют. Префиксация параметров (например,
Параметр1_Период) может помочь избежать ошибок интерпретации.
Также стоит обратить внимание на свойство АвтоУпорядочивание. В многоблочных отчетах часто требуется разная сортировка для разных таблиц. Отключите автоматическую сортировку для наборов данных, если она мешает, и настройте порядок прямо в тексте запроса через УПОРЯДОЧИТЬ ПО.
Оформление и условное форматирование
Разные блоки отчета могут требовать различного стиля оформления. Первая таблица может быть компактной сводкой, а вторая — подробной ведомостью с выделением цветом. СКД позволяет применять условное оформление как ко всему отчету, так и к конкретным областям.
Для настройки перейдите на вкладку"Условное оформление" в редакторе схемы. Вы можете создать правило, которое будет применяться только к полям первого набора данных. В условии оформления используйте поле ИмяНабораДанных или проверяйте конкретные поля, уникальные для этого набора.
Частая задача — скрыть второй отчет, если по нему нет данных. Это решается через настройки видимости раздела. В свойствах раздела"Раздел_Детальный" найдите условие видимости. Вы можете написать простое выражение, проверяющее наличие записей.
Количество(НаборДанных2) > 0
Такое условие гарантирует, что если второй запрос не вернул ни одной строки, весь блок"Раздел_Детальный" не будет выведен в печатную форму, что сэкономит место и улучшит восприятие документа.
- 🎨 Используйте различные шрифты для заголовков разных разделов, чтобы визуально разграничить смысловые блоки.
- 👁️ Настраивайте видимость колонок: некоторые поля могут быть нужны для расчетов, но не для отображения во второй таблице.
- 📐 Фиксируйте шапку таблицы для длинных отчетов, чтобы заголовки колонок оставались видимыми при прокрутке.
Секрет профессиональной верстки
Используйте'Отступы' в свойствах полей макета. Небольшой отступ слева для вложенных данных создает эффект древовидной структуры без использования группировок.
Программная доработка и вывод
Иногда возможностей конструктора недостаточно, и требуется вмешательство кода на языке 1С. Это актуально, когда нужно динамически менять структуру отчета в зависимости от сложных условий, которые нельзя выразить стандартными средствами СКД.
В модуле объекта отчета (или в форме, если отчет вызывается как обработка) вы можете программно манипулировать настройками компоновки данных перед выводом. Объект КомпоновщикНастроек позволяет загружать, менять и сохранять настройки.
Пример кода для динамического переключения видимости разделов:
НастройкиКомпоновки = НовыеНастройкиКомпоновкиДанных;
// Получаем доступ к настройкам разделов
Для каждого Элемент НастройкиКомпоновки.Структура Цикл
Если Элемент.ЭтоРаздел Тогда
Если Элемент.Имя ="Раздел_Детальный" Тогда
// Логика скрытия раздела
Элемент.Использование = Ложь;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКомпоновки);
Такой подход дает максимальную гибкость. Вы можете анализировать данные после выполнения запросов (используя временные хранилища или результаты компиляции схемы) и принимать решения о структуре отчета"на лету".
Программное управление настройками СКД позволяет реализовать сценарии, недоступные в конструкторе, например, зависимость структуры от прав доступа пользователя или наличия данных в конкретных регистрах.
Частые ошибки и их решение
При разработке сложных отчетов разработчики часто сталкиваются с типовыми проблемами. Понимание природы этих ошибок сэкономит вам часы отладки. Самая распространенная проблема — дублирование данных или их отсутствие в одном из блоков.
Это часто случается из-за неправильной настройки связей параметров. Если параметр в форме отчета не связан с параметром запроса во втором наборе данных, запрос выполнится с пустым значением, что может привести к выборке всех данных за весь период или, наоборот, к пустому результату.
Еще одна ошибка — конфликт имен полей. Если в двух наборах данных есть поля с одинаковыми именами (например, Сумма), но разным смыслом, при попытке создать общее условное оформление или группировку система может вести себя непредсказуемо. Всегда используйте уникальные алиасы.
⚠️ Внимание: Интерфейс и возможности СКД могут незначительно отличаться в разных версиях платформы 1С (8.2, 8.3, 8.3.20+). Если вы не находите свойства в палитре, проверьте документацию для вашей конкретной версии платформы или обновите конфигурацию.
Также стоит помнить о производительности. Два сложных запроса выполняются последовательно или параллельно (в зависимости от версии платформы и настроек), что увеличивает время формирования отчета. Оптимизируйте запросы, избегайте лишних соединений и используйте индексы в базе данных.
☑️ Проверка перед сдачей отчета
Можно ли вывести более двух отчетов в одной СКД?
Да, количество разделов и наборов данных в схеме компоновки данных практически не ограничено. Вы можете добавить третий, четвертый и последующие разделы по аналогичному принципу. Однако стоит учитывать, что слишком сложный отчет становится трудным для восприятия пользователем и медленным в формировании.
Почему второй отчет не выводится, хотя данные в базе есть?
Наиболее вероятная причина — несовпадение параметров отбора. Проверьте, передаются ли значения из формы отчета во второй набор данных. Также убедитесь, что раздел, в котором находится второй отчет, не скрыт условием видимости или настройками пользователя.
Как сделать общую шапку для двух разных таблиц?
Разместите текстовые поля или картинки в корне макета, до создания первого раздела. Элементы, находящиеся в корне макета (вне разделов), выводятся один раз и не повторяются для каждой строки данных или раздела.
Можно ли экспортировать такой отчет в Excel с разными листами?
Стандартными средствами СКД весь вывод попадает на один лист Excel. Для выгрузки на разные листы потребуется программная доработка: выгрузка данных в объект ТабличныйДокумент, а затем программное создание новых листов и перенос областей на них перед сохранением в файл.
Влияет ли порядок наборов данных на скорость отчета?
Порядок объявления наборов данных в схеме не влияет на скорость. Однако порядок их выполнения зависит от зависимостей. Если наборы данных независимы, платформа может оптимизировать их выполнение. Если второй набор использует результаты первого (через временные таблицы), порядок будет строго последовательным.