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