Как в одном отчете СКД вывести несколько таблиц с разными отборами из одного источника данных

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

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

Постановка задачи и подготовка источника данных

Рассмотрим практическую ситуацию: нам необходимо создать отчет, в котором будут последовательно выведены две таблицы. Источником данных служит простой запрос к справочнику Сотрудники. Проанализируем структуру нашего запроса на вкладке «Набор данных — запрос»:


ВЫБРАТЬ
    Сотрудники.Наименование КАК ФИО,
    Сотрудники.Должность КАК Должность,
    Сотрудники.ФизЛицо.Пол КАК Пол
ИЗ
    Справочник.Сотрудники КАК Сотрудники

Здесь важно отметить: нам не нужно дублировать поля в запросе (например, создавать Наименование1, Наименование2), как иногда ошибочно предполагают разработчики. Система компоновки данных позволяет использовать одно и то же поле ФИО в неограниченном количестве визуальных элементов отчета. Главное — правильно настроить их поведение на уровне структуры компоновки.

Настройка структуры отчета: создание независимых таблиц

Перейдем на вкладку «Настройки». Именно здесь происходит управление тем, как данные из нашего запроса будут выведены пользователю. Давайте разберем по шагам процесс создания двух независимых областей:

  1. В корневом элементе «Отчет» создадим две группировки типа «Детальные записи» или добавим две таблицы. Если мы хотим просто два списка друг под другом, достаточно добавить две группировки без полей группировки.
  2. Для каждой группировки (или таблицы) мы определим свой состав полей. Например, в обеих таблицах выберем поля ФИО и Должность.

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

Управление иерархией настроек и отключение наследования

Разберем самый важный механизм СКД — иерархию настроек. В СКД настройки могут задаваться на трех уровнях:

По умолчанию каждый дочерний элемент (наша таблица) «наследует» настройки от родителя (отчета). Чтобы установить индивидуальный отбор для таблицы «Мужчины», выполним следующие действия:

  1. Выделим в дереве структуры нашу первую таблицу.
  2. В нижней части окна настроек перейдем на вкладку «Отбор».
  3. Обратите внимание на флажок «Использовать стандартные настройки» (в некоторых версиях платформы или интерфейса это может выглядеть как кнопка с картинкой «пунктирный квадрат» или надпись «Использовать настройки родительского объекта»). Этот флажок нужно снять.
  4. После снятия флажка мы можем добавить условие: Пол Равно Мужской.

Аналогичные действия проделаем для второй таблицы, выделив ее в структуре и установив индивидуальный отбор Пол Равно Женский, предварительно также разорвав связь с настройками отчета.

Использование заголовков для визуального разделения

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

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

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

Программное управление и именование группировок

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

В свойствах группировки (правая панель в конструкторе настроек СКД) есть поле Имя. Если мы назовем первую таблицу ТаблицаМужчины, а вторую ТаблицаЖенщины, мы сможем обратиться к ним через КомпоновщикНастроек:


Для Каждого ЭлементСтруктуры Из КомпоновщикНастроек.Настройки.Структура Цикл
    Если ЭлементСтруктуры.Имя = "ТаблицаМужчины" Тогда
        // Здесь можно программно изменить отбор или состав полей
    КонецЕсли;
КонецЦикла;

Оптимизация: когда одного набора данных недостаточно

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

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

  1. Создаем НаборДанныхМужчины с запросом, содержащим ГДЕ Пол = &ПолМуж.
  2. Создаем НаборДанныхЖенщины с запросом ГДЕ Пол = &ПолЖен.
  3. В настройках структуры привязываем каждую таблицу к своему набору данных.

В этом случае СУБД вернет только нужные строки, что значительно ускорит работу отчета на больших объемах информации.

Работа с параметрами и пользовательские настройки

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

Мы можем создать два пользовательских параметра, например, ПодразделениеДляПервойТаблицы и ПодразделениеДляВторойТаблицы. Затем в настройках отбора первой таблицы мы укажем, что поле Подразделение должно быть равно значению параметра ПодразделениеДляПервойТаблицы. Таким образом, на форме отчета пользователь увидит два поля выбора подразделения, каждое из которых будет влиять только на «свою» часть отчета. Для удобной настройки и связывания таких параметров с элементами интерфейса подойдёт инструмент для стыковки элементов управляемой формы и пользовательских настроек СКД.

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

← На главную