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

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

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

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

Главная причина такого поведения платформы кроется во включенном флаге «Автозаполнение», который находится на вкладке «Набор данных - Запрос» в схеме компоновки данных. Этот флаг по умолчанию включен для всех новых наборов данных.

Когда свойство «Автозаполнение» активно, СКД пытается максимально облегчить жизнь разработчику и берет под контроль управление параметрами всех виртуальных таблиц в запросе. Механизм компоновки автоматически анализирует текст запроса и неявно сопоставляет стандартные параметры отчета (такие как &НачалоПериода, &КонецПериода или &Период) со всеми виртуальными таблицами пакета. Если вы объединяете несколько таблиц, где для одной нужен жесткий период, а для другой — данные за все время или смещенные даты, СКД все равно «подгребет» их под единые системные настройки периода отчета.

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


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

При запуске этого отчета через СКД вы обнаружите, что в консоли запросов или в итоговом SQL-запросе параметр &ДатаНачалаРасчетов во второй таблице чудесным образом превратился в &НачалоПериода. СКД принудительно переопределила связь параметров.


Решение №1: Использование синтаксиса фигурных скобок {}

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

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

Давайте перепишем наш пример запроса с использованием фигурных скобок:


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

Разберем, что произошло в данном случае:

  1. Первая виртуальная таблица ПродажиОбороты продолжает управляться стандартным механизмом СКД через общие параметры периода.
  2. Во второй виртуальной таблице ПродажиЗаВсеВремя параметр начала периода заключен в фигурные скобки: {&ДатаНачалаРасчетов}. СКД распознает эту конструкцию и оставляет параметр без автоматической подмены.
  3. Если параметр &ДатаНачалаРасчетов не будет заполнен пользователем или программно, то в СУБД уйдет запрос без ограничения по началу периода для второй таблицы (то есть данные будут выбраны за все время существования базы данных).

Также внутри фигурных скобок можно производить манипуляции с датами, например, приводить их к началу дня:


РегистрНакопления.Продажи.Обороты({(НАЧАЛОПЕРИОДА(&ДатаНачалаРасчетов, ДЕНЬ))}, ) КАК ПродажиЗаВсеВремя

Решение №2: Использование собственных уникальных имен параметров

Еще одна рекомендация, позволяющая избежать неявного поведения СКД — уход от зарезервированных имен параметров. По умолчанию СКД ищет в запросах параметры с именами &Период, &НачалоПериода и &КонецПериода.

Если вам требуется реализовать собственную логику:

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

Решение №3: Интерактивная настройка через Конструктор запроса

Если вы не хотите прописывать фигурные скобки в тексте запроса вручную, вы можете воспользоваться встроенными возможностями графического интерфейса 1С. Конструктор запроса умеет генерировать этот синтаксис автоматически.

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

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

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


Решение №4: Полное отключение «Автозаполнения»

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

Для этого снимите флаг «Автозаполнение» под текстом запроса на вкладке «Набор данных». Однако учитывайте последствия этого шага:

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

Резюме

Мы подробно разобрали проблему автоматической подмены параметров СКД и изучили механизмы её решения. В большинстве практических задач оптимальным и самым быстрым решением является использование фигурных скобок {&ВашПараметр} в параметрах виртуальных таблиц. Это позволяет сохранить все преимущества механизма «Автозаполнения» для основной части отчета и одновременно гибко управлять исключениями для отдельных таблиц пакета запроса.

← На главную