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

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

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

Выясним причину: почему СКД игнорирует параметры?

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

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

Решение 1: Использование расширений языка запросов (фигурные скобки)

Самый надежный способ заставить СКД «уважать» ваш параметр — это использование фигурных скобок {}. Это расширение языка запросов СКД, которое говорит системе: «Я сам управляю этим параметром, не нужно применять здесь стандартную логику автозаполнения».

Рассмотрим, как должен выглядеть текст запроса в этом случае:


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

Обратите внимание на конструкцию {&ДатаСреза}. Фигурные скобки позволяют системе компоновки данных понять, что управление периодом данной конкретной таблицы выносится в настройки СКД. Теперь система не будет пытаться принудительно подставить туда &Период.

Решение 2: Настройка на закладке «Компоновка данных» в конструкторе запроса

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

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

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

Решение 3: Правильное вычисление даты в параметрах СКД

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

Выполним настройку по шагам:

  1. Перейдите на закладку «Параметры» в СКД.
  2. Найдите ваш параметр ДатаСреза.
  3. В колонке «Выражение» напишите формулу: ДобавитьКДате(&Период, "День", -30).
  4. Убедитесь, что для параметра ДатаСреза установлена галочка «Ограничение доступности», если вы не хотите, чтобы пользователь видел этот технический параметр в настройках отчета.
  5. Проверьте колонку «Роль». Если СКД автоматически назначила параметру роль «Период», иногда это может мешать. Для кастомных дат лучше оставлять роль пустой, если вы используете их точечно в запросе.

Важный нюанс: Чтобы эта схема заработала, в тексте запроса в параметрах виртуальной таблицы должен стоять именно &ДатаСреза (желательно в фигурных скобках), а не формула.

Работа с временными таблицами в пакете запросов

Проанализируем еще один тонкий момент. В исходном сообщении используется пакетный запрос с помещением данных во временную таблицу (ВТ_Данные). В СКД работа с временными таблицами имеет свои особенности:

При использовании ПОМЕСТИТЬ, СКД анализирует структуру временной таблицы. Если параметры виртуальных таблиц заданы некорректно или конфликтуют, система может сбросить их значения. Чтобы этого избежать, всегда проверяйте, чтобы параметры были доступны на уровне всей схемы компоновки, а не только внутри одного набора данных. Если вы используете несколько наборов данных, убедитесь, что связи настроены корректно.

Использование нескольких наборов данных (Набор данных - запрос)

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

  1. Создайте Набор данных 1 с запросом к первой виртуальной таблице, используя параметр &Дата1.
  2. Создайте Набор данных 2 со второй таблицей и параметром &Дата2.
  3. Перейдите на закладку «Связи наборов данных».
  4. Свяжите их по нужным полям (например, по Номенклатуре).

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

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

← На главную