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