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