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

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

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

Причина проблемы: как СКД соединяет наборы данных

Для начала выясним причину, по которой «рубит оба набора». В СКД связь между наборами данных работает по принципу, схожему с ЛЕВЫМ СОЕДИНЕНИЕМ (LEFT JOIN). Первый набор является ведущим, а второй — присоединяемым. Если мы жестко прописываем параметр в секции ГДЕ второго запроса, то при ложном значении параметра этот запрос возвращает пустой результат.

Проблема заключается в том, что если на поля второго набора наложены дополнительные отборы в настройках отчета или если СКД интерпретирует отсутствие данных во втором наборе как критическое (в зависимости от настроек связей), визуально это может выглядеть как полное отсутствие строк. Рассмотрим, как обойти это ограничение несколькими способами.

Способ 1. Универсальное условие в запросе (Логика ИЛИ)

Самый простой и надежный способ — изменить логику условия в тексте запроса второго набора данных. Вместо того чтобы просто писать ГДЕ &ТолькоАктивные, мы создадим условие, которое будет «пропускать» данные всегда, когда флаг выключен. Рассмотрим пример кода для второго набора данных:


ВЫБРАТЬ
    Продажи.Контрагент КАК Контрагент,
    Продажи.СуммаОборот КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
ГДЕ
    (&ИспользоватьВторойНабор = ЛОЖЬ)
    ИЛИ (&ИспользоватьВторойНабор = ИСТИНА И Продажи.СуммаОборот > 0)

Разберем, как это работает. Если параметр &ИспользоватьВторойНабор установлен в значение Ложь, то первая часть условия после ГДЕ всегда истинна. Следовательно, запрос вернет все записи (или те, что соответствуют другим критериям). Если же параметр установлен в Истина, начинает работать вторая часть условия после ИЛИ. Это гарантирует, что второй набор данных не вернет пустую таблицу в тот момент, когда он нам «не нужен», и не нарушит логику компоновки.

Способ 2. Использование необязательных условий в фигурных скобках

Система компоновки данных обладает мощным расширением языка запросов. Мы можем использовать фигурные скобки {}, чтобы сделать условие необязательным. Это позволяет СКД динамически управлять текстом запроса. Посмотрим на пример реализации:


ВЫБРАТЬ
    СправочникКонтрагенты.Ссылка КАК Контрагент,
    СправочникКонтрагенты.Код КАК Код
ИЗ
    Справочник.Контрагенты КАК СправочникКонтрагенты
{ГДЕ
    (ВЫБОР КОГДА &ПараметрГалка ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ) = ИСТИНА}

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

Способ 3. Механизм «Необязательных таблиц»

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

Мы можем пометить таблицу как необязательную. В конструкторе запроса на закладке «Компоновка данных» для каждой таблицы можно указать условие ее включения. Если поля этой таблицы не выбраны пользователем в настройках (в списке «Выбранные поля»), запрос к ней не будет выполнен. Чтобы связать это с параметром, можно создать Вычисляемое поле, которое обращается к данным второго набора только при условии &Параметр = Истина.

Способ 4. Управление через отбор строк

Проанализируем ситуацию, когда нам нужно оставить все строки из первого набора (Наименования), но фильтровать наличие сумм из второго. Для этого во втором наборе данных мы можем добавить фиктивное поле-признак:


ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент,
    Суммы.СуммаОстаток КАК Сумма,
    ИСТИНА КАК ЭтоДанныеВторогоНабора
ИЗ
    ...

Теперь в настройках варианта отчета мы можем добавить Отбор. Чтобы этот отбор был удобен пользователю, мы выносим его в пользовательские настройки с понятным представлением (например, «Показывать только с оборотами»). В условии отбора указываем:

Группа ИЛИ:

  1. ПараметрГалка Равно Ложь
  2. ЭтоДанныеВторогоНабора Равно Истина

Этот метод позволяет гибко управлять видимостью строк в итоговой таблице, не вмешиваясь в сложную логику соединения самих наборов данных на уровне SQL-запросов.

Особенности связи наборов данных (Важное замечание)

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

Помните, что связь наборов данных всегда выполняется на стороне 1С (в памяти компьютера/сервера приложений), а не на стороне СУБД. Поэтому эффективнее всего ограничивать данные внутри запроса второго набора, используя Способ 1, так как это минимизирует объем данных, передаваемых по сети от сервера базы данных.

Подведение итогов

Для реализации функционала «галочки» для второго набора данных в СКД мы рекомендуем:

Используя эти методы, вы добьетесь стабильной работы отчета и предоставите пользователям удобный интерфейс управления данными без риска получения пустого отчета.

← На главную