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

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

Разработка отчетов в Системе компоновки данных (СКД) часто преподносит сюрпризы начинающим разработчикам 1С. Типичный сценарий: вы написали два отличных запроса, протестировали их в консоли запросов, получили нужные данные. Оба запроса используют один и тот же параметр (например, ссылку на элемент справочника или реквизит табличной части). Однако при попытке перенести эти запросы в СКД для вывода двух отдельных таблиц отчет выводится пустым или система выдает труднопонимаемые ошибки. В этой статье мы подробно разберем, почему так происходит, и изучим три надежных способа решения этой задачи.

Выясняем причины: почему в консоли запросы работают, а в СКД отчет пустой?

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

  1. Неправильная настройка структуры вывода (вкладка «Настройки»): Если в СКД создано два независимых набора данных (без связей на вкладке «Связи наборов данных»), СКД не сможет вывести их поля в рамках одной группировки или в общих «Выбранных полях» на уровне всего отчета. При попытке объединить поля из разных несвязанных наборов в одной таблице СКД выдаст ошибку Использование полей из несвязанных наборов данных недопустимо либо сформирует пустой лист.
  2. Проблемы с видимостью и передачей параметров: Если в запросах используется параметр (например, &ОбщийПараметр), СКД автоматически добавляет его на вкладку «Параметры». Но по умолчанию у него может быть включен флаг «Ограничение доступности». Если этот флаг стоит, пользователь не видит параметр на форме отчета и не может передать в него значение, из-за чего запросы инициализируются с пустым параметром и ничего не возвращают.
  3. Попытка связать наборы данных там, где это не нужно: Часто разработчики пытаются связать наборы на вкладке «Связи наборов данных», думая, что это решит проблему вывода. Однако связь наборов работает по принципу LEFT JOIN. Если связь настроена некорректно, это приведет к дублированию или полному исчезновению строк. Если вам нужны две строго независимые таблицы, связывать наборы данных категорически нельзя!

Рассмотрим подробнее три практических варианта реализации отчета с двумя таблицами.

Вариант 1. Вывод двух независимых таблиц через два набора данных (прямой путь)

Если вы хотите сохранить структуру из двух наборов данных типа «Набор данных - запрос» без связей между ними, выполните следующие шаги по настройке схемы компоновки данных:

Шаг 1. Настройка параметров схемы

Убедитесь, что параметр в обоих запросах написан абсолютно одинаково (например, &ИмяПараметра). В этом случае СКД автоматически объединит их в один общий параметр на вкладке «Параметры». Перейдите на вкладку Параметры, найдите этот параметр, проверьте его тип (он должен соответствовать типу реквизита табличной части справочника) и обязательно снимите галочку «Ограничение доступности». Это позволит пользователю интерактивно заполнять данный параметр на форме отчета.

Шаг 2. Проверка связей наборов данных

Перейдите на вкладку Связи наборов данных. Убедитесь, что эта таблица абсолютно пустая. Нам не нужно связывать наборы данных, так как таблицы должны оставаться полностью независимыми друг от друга.

Шаг 3. Настройка структуры вывода вкладки «Настройки»

Это самый важный шаг, в котором чаще всего совершают ошибки. Нам нужно разделить области вывода для каждого набора данных. Сделаем это по шагам:

  1. Перейдите на вкладку Настройки.
  2. Выделите корневой элемент структуры «Отчет».
  3. В нижней части окна настроек перейдите на вкладку Выбранные поля и полностью очистите её. На уровне всего отчета не должно быть выбрано ни одного поля!
  4. Нажмите правой кнопкой мыши по элементу «Отчет» и добавьте новую группировку — «Детальные записи» (без указания поля группировки). Это будет наша первая таблица.
  5. Снова нажмите правой кнопкой мыши по элементу «Отчет» и добавьте еще одну группировку — «Детальные записи» на том же уровне иерархии (они должны находиться друг под другом, а не одна внутри другой). Это будет наша вторая таблица.
  6. Кликните левой кнопкой мыши на первую группировку «Детальные записи». Перейдите в ее свойства (вкладка «Выбранные поля» внизу) и перетащите туда поля *только* из первого набора данных.
  7. Кликните левой кнопкой мыши на вторую группировку «Детальные записи». Перейдите в ее свойства («Выбранные поля») и перетащите туда поля *только* из второго набора данных.

При такой настройке СКД последовательно выполнит оба запроса с общим параметром и выведет две независимые таблицы друг под другом.

Вариант 2. Использование одного набора данных через ОБЪЕДИНИТЬ ВСЕ (рекомендуемый путь)

Для СКД архитектурно проще, надежнее и производительнее обрабатывать один набор данных вместо двух несвязанных. Это исключает любые проблемы со связями и оптимизирует построение итогов. Вместо двух наборов данных мы можем объединить запросы прямо в тексте одного запроса с помощью специального поля-разделителя (дискриминатора).

Разберем по шагам, как это реализовать:

Шаг 1. Создание единого запроса

В СКД создается один набор данных — запрос. Пишется запрос, объединяющий две таблицы, где в каждую выборку добавляется искусственное поле, определяющее принадлежность строки к конкретной таблице:


ВЫБРАТЬ
    Справочник1.Ссылка КАК Ссылка,
    Справочник1.Реквизит КАК Реквизит,
    1 КАК НомерТаблицы
ИЗ
    Справочник.Справочник1 КАК Справочник1
ГДЕ
    Справочник1.РеквизитТЧ = &ОбщийПараметр

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

ВЫБРАТЬ
    Справочник2.Ссылка КАК Ссылка,
    Справочник2.ДругойРеквизит КАК Реквизит,
    2 КАК НомерТаблицы
ИЗ
    Справочник.Справочник2 КАК Справочник2
ГДЕ
    Справочник2.РеквизитТЧ = &ОбщийПараметр

Шаг 2. Настройка структуры и отборов

Теперь нам нужно настроить вывод таким образом, чтобы строки с НомерТаблицы = 1 попали в первую таблицу, а строки с НомерТаблицы = 2 — во вторую. Выполняем следующие действия:

  1. Переходим на вкладку Настройки.
  2. Создаем две группировки «Детальные записи» друг под другом (на одном уровне в корне отчета).
  3. Выбираем первую группировку. Переходим на вкладку Отбор в настройках этой группировки и добавляем условие: НомерТаблицы Равно 1. Во вкладке «Выбранные поля» указываем нужные реквизиты.
  4. Выбираем вторую группировку. Переходим на вкладку Отбор этой группировки и добавляем условие: НомерТаблицы Равно 2. Во вкладке «Выбранные поля» указываем ее реквизиты.

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

Вариант 3. Использование вложенных схем компоновки данных

Если ваши выводимые таблицы должны иметь кардинально разные настройки (собственные уникальные отборы, индивидуальное условное оформление или сложные группировки внутри себя), лучшим решением будет использование Вложенных отчетов.

Проанализируем алгоритм реализации этого метода:

  1. В основной схеме СКД перейдите на вкладку Вложенные схемы и добавьте две вложенные схемы (например, СхемаТаблица1 и СхемаТаблица2).
  2. Каждая вложенная схема настраивается как полноценный отдельный отчет: в ней создается свой запрос к справочникам, настраиваются параметры и структура вывода.
  3. В настройках основной схемы на вкладке Структура добавьте элементы типа «Вложенный отчет» вместо обычных группировок, выбрав соответствующие схемы.
  4. Связь параметров: Чтобы передать общий параметр из основной схемы во вложенные, перейдите в настройки параметров каждого вложенного отчета в структуре основной схемы и укажите связь параметров. Значение общего параметра основной схемы будет автоматически передаваться в параметры вложенных схем при компоновке результата.

Мы рассмотрели три различных подхода к решению задачи. Выбор конкретного метода зависит от сложности структуры ваших данных и требований к оформлению отчета. Для простых параллельных таблиц идеально подойдет Вариант 2 (с объединением запросов), для полностью изолированных и независимых по структуре таблиц — Вариант 1, а для сложных иерархических структур — Вариант 3.

← На главную