Как в СКД вывести два варианта одного отчета (в рублях и евро) один под другим?

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

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

Способ 1: Использование структуры настроек СКД

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

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

  1. Перейдем на вкладку Настройки в схеме компоновки данных.
  2. В корне отчета создадим две группировки (например, Детальные записи или группировку по определенному полю).
  3. Выберем первую группировку. В нижней части окна перейдем на вкладку Параметры.
  4. Найдем параметр &Валюта (или аналогичный, отвечающий за выбор валюты). Снимем флаг Использовать общие параметры.
  5. Установим значение "Рубль" для первой группировки.
  6. Повторим действия для второй группировки, установив значение "Евро".

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

Способ 2: Подготовка разных полей в запросе

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

Пример структуры запроса:


ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Сумма КАК СуммаРуб,
    Продажи.Сумма / &КурсЕвро КАК СуммаЕвро
ИЗ
    РегистрНакопления.Продажи КАК Продажи

Затем в настройках структуры для первой группировки в Выбранных полях оставим только СуммаРуб, а для второй — только СуммаЕвро. Чтобы визуально разделить таблицы, можно использовать макеты заголовков или добавить текстовые группировки-разделители.

Способ 3: Программный вывод в модуле объекта

Если задача требует более гибкого управления (например, динамического добавления вариантов в зависимости от прав пользователя), используем процедуру ПриКомпоновкеРезультата. Выясним, как вывести два варианта программно:

  1. Отключим стандартную обработку в процедуре ПриКомпоновкеРезультата, установив СтандартнаяОбработка = Ложь.
  2. Сформируем макет компоновки для первого варианта (RUB) и выведем его в ТабличныйДокумент.
  3. Не очищая документ, изменим параметры в компоновщике настроек и выведем второй вариант (EUR) следом за первым.

Рассмотрим пример кода:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Вывод первого варианта (Рубли)
    КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Валюта", ВалютаРуб);
    СкомпоноватьРезультат(Результат, ДанныеРасшифровки);
    
    // Вывод второго варианта (Евро)
    КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Валюта", ВалютаЕвро);
    
    // Используем процессор вывода, чтобы добавить данные в тот же документ
    // ... (код инициализации процессора компоновки и вывода)
КонецПроцедуры

Важные нюансы при работе с вложенными схемами

Если вы решили использовать вложенные схемы, как пытался автор вопроса, проанализируем типичные ошибки. Часто отчет получается пустым, потому что во вложенную схему не передаются параметры из основной. Проверьте вкладку Вложенные схемы и убедитесь, что параметр &ДанныеОтчета в основной схеме связан с соответствующим параметром вложенной схемы. Однако для задачи "один под другим" использование вложенных схем часто является избыточным, и проще обойтись способами, описанными выше.

Совет: Чтобы отчет работал быстрее при использовании пакетных запросов, старайтесь помещать тяжелые выборки во временные таблицы. Это позволит СКД обращаться к подготовленным данным дважды без повторного выполнения сложных соединений в базе данных.

← На главную