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