При разработке отчетов на базе системы компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда при иерархической группировке данных реквизиты родительских групп (например, код статьи расходов или группы номенклатуры) выводятся пустыми. Кроме того, возникают сопутствующие вопросы: как сделать параметры отчета доступными для пользователя на форме, почему отчет выдает пустую таблицу и как передавать выбранные значения в отчет-расшифровку. Разберем по шагам решение каждой из этих задач.
Выясним причину такого поведения платформы. Когда в настройках структуры отчета для группировки устанавливается тип Иерархия или Только иерархия, система компоновки данных самостоятельно достраивает недостающие родительские узлы дерева, которых физически нет в детальных записях результата запроса. Для таких виртуальных узлов СКД получает только саму ссылку и её стандартное представление. Поля, выбранные через точку (например, СтатьяРасходов.Код), для промежуточных групп не заполняются и остаются пустыми (NULL).
Рассмотрим способы решения этой задачи:
СтатьяРасходов) укажем в колонке Выражение представления:
Строка(СтатьяРасходов.Код) + " " + Строка(СтатьяРасходов.Наименование)
В этом случае СКД автоматически вычислит строковое представление как для конечных элементов, так и для всех вышестоящих групп иерархии без изменения запроса.
ВЫБРАТЬ
РасходыПоСобственникам.СтатьяРасходов.Код + ", " + РасходыПоСобственникам.СтатьяРасходов.Наименование КАК СтатьяПредставление,
РасходыПоСобственникам.Сумма КАК Сумма
ИЗ
РегистрНакопления.АР_РасходыПоСобственникам КАК РасходыПоСобственникам
Проанализируем частую ошибку, когда добавленные в запрос параметры (например, &ВыбСобственник, &ВыбНач, &ВыбКон) не видны на форме отчета в пользовательском режиме. Чтобы параметры появились в панели настроек, выполним следующие действия:
ПериодОтчета с типом СтандартныйПериод. В выражениях для параметров ВыбНач и ВыбКон укажем соответственно &ПериодОтчета.ДатаНачала и &ПериодОтчета.ДатаОкончания, а для них самих установим флажок Ограничение доступности.ПериодОтчета и выберем пункт Свойства элемента пользовательских настроек. Установим флаг Включать в пользовательские настройки.Если запрос возвращает строки в консоли запросов, но при формировании отчета СКД выводится пустое поле, проверим структуру настроек отчета. Если в схеме компоновки не задана структура вывода, СКД не знает, как отображать полученную выборку.
Разберем, как это исправить: на вкладке Настройки в окне Структура нажмем правой кнопкой мыши на корень Отчет, выберем Добавить группировку... и, не выбирая никакого поля, нажмем ОК. В структуре появится группировка Детальные записи. Затем на вкладке Выбранные поля укажем поля, которые должны попасть в итоговый табличный документ.
Рассмотрим, как настроить читаемый вид регистратора без лишних нулей и времени. Для поля Регистратор на вкладке Наборы данных в колонке Выражение представления укажем:
"Списание р/с " + Регистратор.Номер + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
Для программной передачи параметров в отчет-расшифровку при клике по ячейке отчета проанализируем обработчик РезультатОбработкаРасшифровки в модуле формы отчета:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем контекст кликнутой ячейки на сервере
ПараметрыОтчета = ПолучитьПараметрыРасшифровкиНаСервере(Расшифровка);
// Открываем форму отчета-расшифровки с переданными отборами
ОткрытьФорму("Отчет.АР_РасходыПоСобственникам.Форма", Новый Структура("Отбор, СформироватьПриОткрытии", ПараметрыОтчета, Истина), ЭтотОбъект);
КонецПроцедуры
&НаСервере
Функция ПолучитьПараметрыРасшифровкиНаСервере(Знач ИдентификаторРасшифровки)
СтруктураОтбора = Новый Структура;
Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
Если Данные <> Неопределено И ИдентификаторРасшифровки <> Неопределено Тогда
Элемент = Данные.Элементы[ИдентификаторРасшифровки];
МассивРодителей = Элемент.ПолучитьРодителей();
Для Каждого Родитель Из МассивРодителей Цикл
Для Каждого Поле Из Родитель.ПолучитьПоля() Цикл
СтруктураОтбора.Вставить(Строка(Поле.Поле), Поле.Значение);
КонецЦикла;
КонецЦикла;
КонецЕсли;
Возврат СтруктураОтбора;
КонецФункции
Обязательным условием работы расшифровки является сохранение адреса объекта ДанныеРасшифровкиКомпоновкиДанных во временном хранилище при вызове метода СкомпоноватьРезультат(Элементы.Результат, ДанныеРасшифровки).