Как правильно настроить собственный макет подвала в таблице СКД и устранить расхождения данных с запросом

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка отчетов в Системе компоновки данных (СКД) часто выходит за рамки простых линейных списков. Как только нам требуется разработать сложную кросс-таблицу с собственным уникальным оформлением, жестко заданными границами, объединенными ячейками и подписями, стандартных настроек становится недостаточно. Мы начинаем использовать предопределенные макеты оформления.

Однако именно на этом этапе многие разработчики сталкиваются с трудностями: макеты подвалов «съезжают», итоги не выводятся, а при попытке разобраться в причинах выясняется, что и цифры в отчете СКД почему-то отличаются от результатов того же запроса в консоли. Рассмотрим подробнее обе эти проблемы и найдем для них изящные технические решения без использования «костылей» в виде ручного программного обхода ячеек табличного документа.

Часть 1. Правильное создание собственного макета подвала в кросс-таблице СКД

Типичная ошибка при работе с таблицами в СКД (где есть и строки, и колонки) — попытка применить Макет группировки с типом Подвал к группировкам строк или колонок. Разработчик рисует красивую область, назначает ее подвалом группировки, но на выходе получает либо пустые области, либо искаженную структуру.

Выясним причину такого поведения системы. Дело в том, что в кросс-таблицах все пересечения строк и колонок, включая области итогов, СКД считает ресурсами. Обычный макет группировки здесь не работает, так как системе необходимо знать, как именно выводить пересечение итоговой строки и итоговой колонки. Для решения этой задачи нам потребуется использовать механизм Макетов ресурсов.

Разберем по шагам, как правильно настроить вывод подвала для таблицы:

  1. Перейдем на вкладку Макеты в схеме компоновки данных.
  2. Добавим новый макет, выбрав тип Макет ресурсов.
  3. В появившемся диалоговом окне нам необходимо настроить связь пересечений для итоговых областей. Для этого укажем:
    • В поле Группировка строк — имя нашей ключевой группировки строк (например, Затраты или Номенклатура) и выберем тип макета Подвал (или Общий итог подвал, если мы оформляем самый нижний итог таблицы).
    • В поле Группировка колонок — имя группировки колонок (например, Период) и выберем аналогичный тип макета — Подвал или Общий итог подвал.
  4. В поле Область укажем имя именованной области из нашего табличного документа-макета, которую мы нарисовали для вывода итогов на пересечении строки и колонки.

Только при такой перекрестной привязке СКД поймет, какую именно область макета нужно наложить на нижний правый угол пересечения итогов таблицы.

Влияние системных настроек расположения итогов

Даже идеально настроенный макет ресурсов не выведется на экран, если в системе отключена генерация итоговых строк. Проанализируем настройки структуры нашего отчета:

  1. Откроем вкладку Настройки, выберем наш отчет или конкретную таблицу.
  2. Перейдем в Другие настройки на уровне таблицы или всего отчета.
  3. Найдем параметры Расположение итогов (для группировок) и Расположение общих итогов (по горизонтали и вертикали).
  4. Если для этих параметров установлено значение Нет, то СКД полностью проигнорирует вывод подвалов. Установим для них значение Конец или Авто.

Использование «пустых» группировок для вывода нетабличных подписей

Что делать, если подвал отчета должен содержать не числовые итоги, а текстовый блок (например, поля для подписей ответственных лиц «Сдал / Принял»), который не должен разбиваться на колонки таблицы? Если мы попытаемся вывести его в подвал таблицы, СКД «порежет» наши объединенные ячейки по ширине динамических колонок таблицы.

Для решения этой задачи применим следующий прием:

  1. В структуре настроек отчета, на самом верхнем уровне (вне нашей таблицы), добавим в самый конец новую группировку.
  2. Не будем указывать для нее никаких полей группировки (оставим ее пустой — так называемые «Детальные записи»).
  3. Зададим этой группировке уникальное имя в свойствах (например, ПодвалОформление).
  4. В Других настройках для этой новой группировки отключим авто-выбранные поля, а в качестве макета оформления укажем значение Без оформления.
  5. Перейдем на вкладку Макеты, добавим Макет группировки. Выберем тип макета Заголовок для нашей группировки ПодвалОформление.
  6. В макете нарисуем область любой ширины с нужными нам подписями, объединим ячейки и укажем эту область для макета группировки.

При таком подходе СКД выведет сначала всю таблицу со всеми динамическими колонками и ресурсами, а сразу под ней выведет наш статический подпись-макет на всю ширину листа без искажения структуры колонок.

Часть 2. Почему расходятся данные в СКД и в консоли запросов?

Вторая классическая проблема, с которой сталкиваются разработчики при проектировании отчетов — ситуация, когда один и тот же запрос выдает корректные данные при запуске в обычной «Консоли запросов», но при выводе через СКД цифры чудесным образом меняются, двоятся или пропадают. Выясним основные причины этого поведения.

СКД — это декларативный инструмент. Платформа 1С не выполняет ваш запрос буквально «слово в слово». Перед отправкой в СУБД построитель СКД полностью переформировывает текст запроса, оптимизируя его под текущие настройки отчета, выбранные поля, группировки и отборы пользователя.

Рассмотрим детально основные механизмы искажения данных:

1. Оптимизация (вырезание) неиспользуемых таблиц и соединений

Если в вашем запросе СКД соединяются несколько таблиц (например, таблица остатков и таблица свойств номенклатуры через ЛЕВОЕ СОЕДИНЕНИЕ), но в выбранных полях отчета, группировках, отборах или условном оформлении поля из присоединенной таблицы никак не используются, СКД в целях оптимизации полностью удалит это соединение из итогового запроса к СУБД.

Если это было левое соединение, результат по количеству строк может не измениться (хотя могут исчезнуть дубли, если соединение было «один ко многим»). Но если использовалось ВНУТРЕННЕЕ СОЕДИНЕНИЕ, удаление таблицы из связи кардинально изменит результирующий набор данных. Для решения этой проблемы перейдем на вкладку Набор данных и для полей, которые обязательно должны влиять на выборку данных, установим флаг Обязательное.

2. Автозаполнение параметров виртуальных таблиц

Когда в настройках набора данных СКД включен флаг Автозаполнение, система берет на себя управление параметрами виртуальных таблиц (таких как .Обороты, .ОстаткиИОбороты или .СрезПоследних).

Если в консоли запросов мы жестко прописываем даты начала и окончания периода, то СКД может неявно подставлять туда свои глобальные параметры начала и окончания периода из настроек компоновки. Более того, при работе со срезом последних СКД преобразует запрос к СУБД, используя подзапросы и левые соединения для получения среза на каждую дату в выборке, что при неверных настройках ролей может привести к задвоению строк.

3. Некорректно настроенные роли полей

СКД ориентируется на метаданные и роли полей для расчета итогов по ресурсам. Посмотрим на примере регистра остатков: если у полей набора данных не настроена роль Измерение или неверно указана роль Период, компоновщик не сможет правильно рассчитать остатки по группировкам. Он начнет просто математически суммировать конечные остатки разных периодов вместо получения правильного остатка на конец временного интервала.

4. Влияние механизма ограничения прав на уровне записей (RLS)

Консоль запросов часто запускается разработчиком под учетной записью с полными правами либо в привилегированном режиме. Отчет же в режиме предприятия запускается под правами конкретного пользователя. Встроенные механизмы RLS незаметно для разработчика добавляют в итоговый запрос SQL дополнительные условия фильтрации, отсекая часть записей.

Как гарантированно отыскать причину расхождения?

Для поиска точной причины расхождения данных никогда не пытайтесь анализировать исходный текст запроса, написанный вами в конфигураторе. Нам нужно получить тот запрос, который СКД реально отправляет на сервер СУБД.

Для этого воспользуемся специализированным инструментом — Консолью компоновки данных. Проанализируем процесс отладки:

  1. Откроем отчет в «Консоли компоновки данных».
  2. Установим точно такие же настройки, отборы и параметры, при которых наблюдается расхождение.
  3. Выполним компоновку макета.
  4. Перейдем на вкладку Запрос (или Выполняемый запрос). Там мы увидим реальный SQL-подобный запрос, сгенерированный платформой.

Сравнение этого результирующего запроса СКД с вашим исходным запросом из обычной консоли сразу покажет, какие таблицы были исключены из выборки, какие параметры были подставлены в виртуальные таблицы и какие дополнительные условия отборов наложила система.

← На главную