Как сделать выбор данных из разных таблиц в одном запросе СКД в 1С 8?

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

Часто в процессе разработки отчетов на базе Системы Компоновки Данных (СКД) возникает задача — получить данные из двух разных источников (например, регистра Бухгалтерии и регистра Управленческого учета) в зависимости от выбора пользователя. Разберем, как реализовать такую логику наиболее эффективно.

Решение задачи с помощью оператора ОБЪЕДИНИТЬ ВСЕ

Самый прямой и понятный способ реализовать переключение между таблицами в одном запросе — использовать конструкцию ОБЪЕДИНИТЬ ВСЕ. Суть метода заключается в том, что мы описываем запрос к каждой таблице и накладываем на него фильтр по параметру ВидОтчета. Таким образом, в результирующую выборку попадут данные только из той части, которая соответствует заданному условию.

Рассмотрим пример кода, который необходимо вставить в текст запроса:


ВЫБРАТЬ
    Таблица1.Поле1 КАК Поле1,
    Таблица1.Поле2 КАК Поле2
ИЗ
    РегистрНакопления.Бухгалтерия КАК Таблица1
ГДЕ
    &ВидОтчета = "БУХ"

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

ВЫБРАТЬ
    Таблица2.Поле1,
    Таблица2.Поле2
ИЗ
    РегистрНакопления.Управленческий КАК Таблица2
ГДЕ
    &ВидОтчета = "УПР"

При использовании данного метода важно помнить несколько ключевых моментов:

  1. Количество и типы полей в обоих блоках ВЫБРАТЬ должны строго совпадать. Если в одной таблице поля нет, необходимо добавить его как NULL или пустое значение соответствующего типа.
  2. Параметр &ВидОтчета должен быть определен в настройках набора данных СКД.
  3. Оператор ГДЕ применяется внутри каждой части объединения, что позволяет оптимизатору запросов 1С исключать сканирование ненужной таблицы, если параметр не соответствует условию.

Альтернативные подходы и рекомендации по производительности

Хотя метод с ОБЪЕДИНИТЬ ВСЕ является рабочим, существуют и более продвинутые архитектурные решения, которые стоит рассмотреть для сложных отчетов:

Использование нескольких наборов данных в СКД: Вместо объединения таблиц в одном тексте запроса, мы можем создать два независимых набора данных. Для каждого из них в настройках набора можно указать условие выполнения через параметры. Это позволяет системе вообще не обращаться к «лишней» таблице, что значительно ускоряет формирование отчета при больших объемах данных.

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

Проверка корректности параметров

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

Проанализировав ситуацию, мы убедились, что классическое объединение — это простой и надежный способ для большинства задач. Если отчет не перегружен данными, используйте ОБЪЕДИНИТЬ ВСЕ, так как это решение легко читается и поддерживается другими разработчиками. Если же вы работаете с высоконагруженными регистрами, рассмотрите вариант разделения наборов данных в СКД для обеспечения максимальной производительности.

← На главную