Часто при разработке отчетов на базе Системы компоновки данных (СКД) программисты сталкиваются с ситуацией, когда в схеме компоновки заданы параметры НачалоПериода и КонецПериода, значения в пользовательском режиме заполнены, но отчет упрямо выводит данные за весь период существования базы. Это происходит даже в тех случаях, когда параметры явно прописаны в виртуальной таблице запроса.
Рассмотрим подробно причины возникновения этой проблемы и разберем по шагам методы её решения, основываясь на практике работы с платформой 1С:Предприятие 8.3.
Первая и самая частая причина — некорректное использование параметров в тексте запроса. Когда мы работаем с виртуальными таблицами, такими как ОстаткиИОбороты, СКД применяет механизм автозаполнения. Если мы просто указываем &НачалоПериода, система может конфликтовать с собственными внутренними механизмами установки параметров.
Проанализируем правильный синтаксис с использованием фигурных скобок {}. Эти скобки указывают СКД, что данное поле является частью расширения языка запросов компоновки данных. Если параметр в фигурных скобках не будет заполнен пользователем, СКД просто проигнорирует это условие, вместо того чтобы выдать ошибку.
Посмотрим на пример правильного оформления виртуальной таблицы в запросе:
ВЫБРАТЬ
ЗаказыКлиентовОстаткиИОбороты.ЗаказКлиента,
ЗаказыКлиентовОстаткиИОбороты.Номенклатура,
ЗаказыКлиентовОстаткиИОбороты.ЗаказаноОборот
ИЗ
РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты({&НачалоПериода}, {&КонецПериода}, День, , ) КАК ЗаказыКлиентовОстаткиИОбороты
Использование фигурных скобок позволяет СКД более гибко управлять параметрами. Если вы используете стандартные имена &НачалоПериода и &КонецПериода, попробуйте также вариант с пустыми скобками в самом тексте запроса, если включена галочка Автозаполнение на закладке «Набор данных»:
ИЗ
РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты(, , День, , ) КАК ЗаказыКлиентовОстаткиИОбороты
В этом случае СКД самостоятельно подставит значения из параметров компоновки в параметры виртуальной таблицы по совпадению имен.
Для удобства пользователей в СКД часто создают один параметр с типом СтандартныйПериод (например, с именем ПериодОтчета), вместо двух отдельных дат. Если вы используете такой подход, необходимо убедиться, что параметры виртуальной таблицы правильно связаны с этим составным периодом.
Выполним следующие действия в конструкторе СКД:
НачалоПериода и КонецПериода.НачалоПериода пропишем: &ПериодОтчета.ДатаНачала.КонецПериода пропишем: &ПериодОтчета.ДатаОкончания.Если этого не сделать, или если в выражении допущена ошибка (например, опечатка в слове ДатаОкончания), параметры останутся пустыми, и запрос выберет данные за все время.
Выясним причину, по которой даже после исправления запроса в Конфигураторе отчет в режиме «Предприятие» продолжает работать неправильно. Платформа 1С сохраняет настройки каждого отчета (расположение полей, выбранные периоды, настройки фильтров) в системном хранилище настроек для каждого пользователя индивидуально.
Важный момент: если вы изменили состав параметров в схеме, старые настройки пользователя могут «перекрывать» новую логику. Система пытается применить сохраненные ранее (возможно, пустые или некорректные) значения параметров к новой структуре запроса.
Чтобы исключить влияние кэша, выполним одну из следующих операций:
Чтобы понять, что именно «видит» система в момент формирования запроса, воспользуемся инструментами самодиагностики. Выведем значения параметров прямо в заголовок или подвал отчета.
Для этого в настройках варианта отчета (закладка «Дополнительные настройки») установим свойство Выводить параметры в значение Выводить. Теперь при формировании отчета под заголовком будет виден список всех параметров и их реальные значения. Если в этом списке вы видите пустые даты или даты, не соответствующие выбранному периоду, значит, проблема в связи параметров на закладке «Параметры» или в программной установке настроек (если используется код на языке 1С).
Разберем ситуацию, когда в запросе помимо оборотов используется соединение с регистром сведений (например, для получения цен номенклатуры). В исходном примере автора сообщения используется РегистрСведений.ЦеныНоменклатуры.СрезПоследних.
Нужно помнить, что у этой виртуальной таблицы есть свой параметр Период. Если его не заполнить, система будет брать актуальные цены на текущий момент (текущую дату), что может привести к замедлению запроса или логическим ошибкам. Рекомендуется передавать туда &КонецПериода:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&КонецПериода, ) КАК ЦеныНоменклатурыСрезПоследних
Также проанализируем использование агрегатных функций. Если вы используете СУММА(Цена) в сочетании с группировкой по дням, убедитесь, что это действительно необходимо. Обычно для цен используют агрегатную функцию МАКСИМУМ или СРЕДНЕЕ, чтобы избежать суммирования цен при наличии нескольких движений в рамках одного дня, что также может визуально искажать восприятие периода данных.
Если ваш запрос в СКД игнорирует период, последовательно проверьте:
{} в параметрах виртуальных таблиц.НачалоПериода и КонецПериода с пользовательским параметром типа СтандартныйПериод.Соблюдение этих правил гарантирует корректную фильтрацию данных и стабильную работу ваших отчетов.