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

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

При разработке отчетов на системе компоновки данных (СКД) часто возникает ситуация, когда необходимо вывести информацию из одного и того же источника (например, регистра накопления) в виде двух разных таблиц в одном отчете. Чтобы эффективно отлаживать такие запросы и структуру, удобно использовать Инструменты разработчика "Инструментики" для тонкого клиента 1С — для этого отлично подойдет консоль СКД и инструменты разработчика 1С. Типичная проблема: если использовать один общий запрос, то строки с измерениями (организация, подразделение, номенклатура) начинают «двоиться». В первой таблице появляются пустые строки, предназначенные для второй, а во второй — пустые строки из первой. Это происходит потому, что СКД по умолчанию пытается вывести все комбинации группировок, полученные в результате выполнения запроса.

Рассмотрим подробнее, как решить эту задачу несколькими способами, сохранив при этом удобство работы с общими отборами для пользователя.

Способ 1. Фильтрация на уровне группировок и таблиц

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

  1. Перейдем на вкладку Настройки в схеме компоновки данных.
  2. В структуре отчета создадим два отдельных элемента типа Таблица.
  3. Выберем первую таблицу. В нижней части окна перейдем на вкладку Отбор. Важно: это должен быть отбор именно для текущей таблицы, а не общий отбор всего отчета.
  4. Добавим условие: Количество Не равно 0. Таким образом, в первую таблицу попадут только те записи, где ресурс «Количество» заполнен.
  5. Аналогично выберем вторую таблицу и установим для нее отбор: ТребуетсяОбслуживание Не равно 0.

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

Способ 2. Использование маркерного поля в запросе (Метод UNION)

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

Рассмотрим пример текста запроса:


ВЫБРАТЬ
    Оборудование.Организация КАК Организация,
    Оборудование.Подразделение КАК Подразделение,
    Оборудование.КоличествоОстаток КАК Количество,
    0 КАК ТребуетсяОбслуживание,
    "Таблица1" КАК ИдентификаторТаблицы
ИЗ
    РегистрНакопления.ОборудованиеНаОбслуживании.Остатки(&Период, ) КАК Оборудование
ГДЕ
    Оборудование.КоличествоОстаток <> 0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Оборудование.Организация,
    Оборудование.Подразделение,
    0,
    Оборудование.ТребуетсяОбслуживаниеОстаток,
    "Таблица2"
ИЗ
    РегистрНакопления.ОборудованиеНаОбслуживании.Остатки(&Период, ) КАК Оборудование
ГДЕ
    Оборудование.ТребуетсяОбслуживаниеОстаток <> 0

В данном случае мы принудительно разделяем данные. Выясним причину эффективности этого метода: поле ИдентификаторТаблицы становится уникальным признаком. Теперь в настройках СКД для первой таблицы мы устанавливаем отбор ИдентификаторТаблицы Равно "Таблица1", а для второй — "Таблица2". Это гарантирует 100% изоляцию данных одной таблицы от другой.

Способ 3. Работа с двумя наборами данных и общими отборами

Иногда логика получения данных для таблиц настолько разная, что проще создать два набора данных (НаборДанных1 и НаборДанных2). Подобный подход часто применяется, когда проводится оптимизация отчетов с набором данных - объект, или когда в рамках одного решения реализуются две разных схемы в отчете СКД. Однако здесь возникает проблема: пользователь хочет один раз выбрать номенклатуру, и чтобы она применилась к обеим таблицам.

Посмотрим на пример решения этой проблемы:

Параметры вывода и оформление

Чтобы отчет выглядел профессионально, проанализируем еще несколько настроек. При использовании нескольких таблиц часто мешают заголовки группировок или вывод пустых значений.

В настройках каждой таблицы на вкладке Другие настройки рекомендуется установить:

  1. Тип макета: Вертикально (чтобы таблицы шли одна под другой).
  2. Выводить заголовок: Установить свое значение, например «Отчет по наличию» для первой и «Отчет по обслуживанию» для второй.
  3. Выводить параметры: Не выводить (чтобы не дублировать период под каждой таблицей).

Также обратим внимание на функцию ЕСТЬNULL в запросе. Чтобы отборы по ресурсам (Количество <> 0) работали корректно, убедитесь, что в поле не попадает значение NULL. Для тех, кто занимается автоматизацией создания подобных структур в коде, полезным инструментом станет СКДБилдер: упрощаем программное создание СКД, который значительно сокращает объем рутины. А если отчет предполагает интерактивную настройку самим пользователем, стоит обратить внимание на такое решение, как Пользовательская СКД.

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

← На главную