Часто при работе с Системой Компоновки Данных (СКД) возникает ситуация, когда отчет, сформированный за будущий период, не отображает данные, которые зависят от событий в прошлом. Например, мы хотим видеть остатки или себестоимость товара, последняя закупка которого была в прошлом году, а отчет формируем на следующий год. В итоге нужные цифры просто не появляются. Давайте вместе разберемся, почему так происходит и как заставить СКД работать так, как нам нужно.
Проанализируем ситуацию. Проблема кроется в том, как СКД по умолчанию обрабатывает параметры периода в запросах к виртуальным таблицам регистров. Когда мы создаем отчет, СКД автоматически добавляет стандартные параметры: &НачалоПериода и &КонецПериода. Пользователь задает их в настройках отчета.
Если в запросе мы обращаемся к виртуальной таблице, например, РегистрНакопления.Закупки.Обороты, и не указываем явно значения для ее параметров периода, СКД делает это за нас. Она "любезно" подставляет в пустые места значения из стандартных параметров отчета.
Посмотрим на пример исходного проблемного кода из запроса:
РегистрНакопления.Закупки.Обороты(, &КонецПериода, Запись, ...) КАК ЗакупкиОбороты
В этом коде первый параметр (начало периода) пустой. Если пользователь в отчете установит период с 01.01.2025 по 01.09.2025, то СКД негласно преобразует наш запрос в следующий:
РегистрНакопления.Закупки.Обороты(&НачалоПериода, &КонецПериода, Запись, ...) КАК ЗакупкиОбороты
В итоге, выборка данных из регистра будет строго ограничена 2025 годом, и все закупки, сделанные, например, в 2024 году, просто не попадут в результат. Именно поэтому себестоимость, рассчитанная по последней закупке, пропадает.
Чтобы решить эту проблему, нам нужно явно указать СКД, как обрабатывать параметры периода, и отменить ее автоматическое поведение. Для этого в СКД существует специальный синтаксис расширения языка запросов — фигурные скобки {}.
Фигурные скобки вокруг параметра в запросе говорят системе, что этот параметр является необязательным и что не нужно автоматически подставлять в него стандартные значения. Это именно то, что нам нужно. Разберем по шагам, как это применить.
Создаем новый параметр для "пустой" даты
На закладке "Параметры" в конструкторе схемы компоновки данных создадим новый параметр. Назовем его, например, &ПустаяДата. В поле "Выражение" для этого параметра укажем пустую дату в формате 1С:
'00010101'
Эта дата будет служить нашей "открытой" нижней границей периода, то есть мы будем получать данные с самого начала ведения учета.
Модифицируем запрос в наборе данных
Теперь вернемся к нашему запросу и изменим вызов виртуальной таблицы. Нам нужно передать наш новый параметр &ПустаяДата в качестве начальной даты периода и параметр отчета &КонецПериода в качестве конечной. Важный момент: оба параметра необходимо обернуть в фигурные скобки.
Посмотрим на итоговый, работающий код:
РегистрНакопления.Закупки.Обороты({(&ПустаяДата)}, {(&КонецПериода)}, Запись, ХозяйственнаяОперация = &ХозяйственнаяОперация) КАК ЗакупкиОбороты
Рассмотрим подробнее, что теперь происходит:
{(&ПустаяДата)}: Мы явно указываем СКД использовать в качестве начальной даты наш параметр с пустой датой. Фигурные скобки отменяют стандартное поведение, и СКД больше не пытается подставить сюда &НачалоПериода из настроек отчета. Таким образом, нижняя граница для выборки данных снимается.{(&КонецПериода)}: Для конечной даты мы по-прежнему используем параметр отчета, но также оборачиваем его в скобки. Это хорошая практика, которая делает поведение запроса более предсказуемым и управляемым.В результате этих действий запрос будет получать обороты из регистра Закупки за весь период с начала времен до даты, указанной в параметре &КонецПериода. Теперь, даже если пользователь сформирует отчет за 2025 год, система сможет найти последнюю закупку из 2024 года и корректно рассчитать себестоимость. Задача решена!