При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача вывести информацию из одного и того же набора данных в несколько отдельных таблиц, каждая из которых должна иметь свою специфику. Например, в одной таблице нам нужно отобразить список сотрудников-мужчин, а в другой — сотрудников-женщин, при этом данные выбираются одним запросом к справочнику Сотрудники. Многие начинающие разработчики сталкиваются с тем, что установленный отбор применяется сразу ко всему отчету, «схлопывая» данные во всех таблицах одновременно. В этой статье мы подробно разберем, как правильно настроить иерархию отборов в СКД, чтобы каждая таблица жила своей «независимой жизнью».
Рассмотрим практическую ситуацию: нам необходимо создать отчет, в котором будут последовательно выведены две таблицы. Источником данных служит простой запрос к справочнику Сотрудники. Проанализируем структуру нашего запроса на вкладке «Набор данных — запрос»:
ВЫБРАТЬ
Сотрудники.Наименование КАК ФИО,
Сотрудники.Должность КАК Должность,
Сотрудники.ФизЛицо.Пол КАК Пол
ИЗ
Справочник.Сотрудники КАК Сотрудники
Здесь важно отметить: нам не нужно дублировать поля в запросе (например, создавать Наименование1, Наименование2), как иногда ошибочно предполагают разработчики. Система компоновки данных позволяет использовать одно и то же поле ФИО в неограниченном количестве визуальных элементов отчета. Главное — правильно настроить их поведение на уровне структуры компоновки.
Перейдем на вкладку «Настройки». Именно здесь происходит управление тем, как данные из нашего запроса будут выведены пользователю. Давайте разберем по шагам процесс создания двух независимых областей:
ФИО и Должность.На данном этапе, если мы сформируем отчет, мы получим две абсолютно одинаковые таблицы, в каждой из которых будут и мужчины, и женщины. Наша задача — разделить их.
Разберем самый важный механизм СКД — иерархию настроек. В СКД настройки могут задаваться на трех уровнях:
По умолчанию каждый дочерний элемент (наша таблица) «наследует» настройки от родителя (отчета). Чтобы установить индивидуальный отбор для таблицы «Мужчины», выполним следующие действия:
Пол Равно Мужской.Аналогичные действия проделаем для второй таблицы, выделив ее в структуре и установив индивидуальный отбор Пол Равно Женский, предварительно также разорвав связь с настройками отчета.
Чтобы пользователь понимал, почему данные разделены на две части, нам необходимо подписать каждую таблицу. Рассмотрим, как это сделать без создания сложных макетов оформления:
Выделим первую таблицу в структуре настроек. Перейдем на вкладку «Дополнительные настройки» (находится там же, в нижней части экрана настроек конкретной группировки). Найдем параметр Заголовок и впишем туда текст: «Список сотрудников (мужчины)». Повторим процедуру для второй таблицы, указав заголовок «Список сотрудников (женщины)».
Теперь при формировании СКД автоматически выведет эти заголовки непосредственно над соответствующими областями данных.
Если вы планируете в дальнейшем управлять этими таблицами из программного кода (например, динамически менять отборы в зависимости от условий на форме), рекомендуется присвоить каждой группировке уникальное Имя. Проанализируем, как это помогает в работе:
В свойствах группировки (правая панель в конструкторе настроек СКД) есть поле Имя. Если мы назовем первую таблицу ТаблицаМужчины, а вторую ТаблицаЖенщины, мы сможем обратиться к ним через КомпоновщикНастроек:
Для Каждого ЭлементСтруктуры Из КомпоновщикНастроек.Настройки.Структура Цикл
Если ЭлементСтруктуры.Имя = "ТаблицаМужчины" Тогда
// Здесь можно программно изменить отбор или состав полей
КонецЕсли;
КонецЦикла;
Выясним причину, по которой иногда стоит отказаться от использования одного источника в пользу нескольких. Когда мы используем один запрос и фильтруем данные «внутри» СКД (на уровне настроек группировок), система выполняет один большой запрос к базе данных, получает всех сотрудников, а затем в оперативной памяти компьютера начинает их распределять по таблицам.
Если сотрудников десятки тысяч, а в отчет должны попасть лишь малые группы по разным критериям, это может быть неэффективно. В таких случаях мы рекомендуем использовать несколько наборов данных:
НаборДанныхМужчины с запросом, содержащим ГДЕ Пол = &ПолМуж.НаборДанныхЖенщины с запросом ГДЕ Пол = &ПолЖен.В этом случае СУБД вернет только нужные строки, что значительно ускорит работу отчета на больших объемах информации.
Часто требуется, чтобы пользователь сам мог управлять отборами, но при этом они оставались разными для двух таблиц. Разберем, как это реализовать:
Мы можем создать два пользовательских параметра, например, ПодразделениеДляПервойТаблицы и ПодразделениеДляВторойТаблицы. Затем в настройках отбора первой таблицы мы укажем, что поле Подразделение должно быть равно значению параметра ПодразделениеДляПервойТаблицы. Таким образом, на форме отчета пользователь увидит два поля выбора подразделения, каждое из которых будет влиять только на «свою» часть отчета. Для удобной настройки и связывания таких параметров с элементами интерфейса подойдёт инструмент для стыковки элементов управляемой формы и пользовательских настроек СКД.
Использование описанных методик позволяет создавать сложные, профессиональные отчеты в 1С, которые легко читаются и предоставляют данные в структурированном виде, сохраняя при этом гибкость настройки и высокую производительность. Если же необходимо объединить вывод полностью независимых отчетов, можно использовать готовый шаблон для вывода нескольких отчетов СКД в единый табличный документ.