Почему отчет СКД не видит данные за прошлые периоды и как это исправить?

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

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

Выясним причину: автоматическое поведение СКД

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

Если в запросе мы обращаемся к виртуальной таблице, например, РегистрНакопления.Закупки.Обороты, и не указываем явно значения для ее параметров периода, СКД делает это за нас. Она "любезно" подставляет в пустые места значения из стандартных параметров отчета.

Посмотрим на пример исходного проблемного кода из запроса:


РегистрНакопления.Закупки.Обороты(, &КонецПериода, Запись, ...) КАК ЗакупкиОбороты

В этом коде первый параметр (начало периода) пустой. Если пользователь в отчете установит период с 01.01.2025 по 01.09.2025, то СКД негласно преобразует наш запрос в следующий:


РегистрНакопления.Закупки.Обороты(&НачалоПериода, &КонецПериода, Запись, ...) КАК ЗакупкиОбороты

В итоге, выборка данных из регистра будет строго ограничена 2025 годом, и все закупки, сделанные, например, в 2024 году, просто не попадут в результат. Именно поэтому себестоимость, рассчитанная по последней закупке, пропадает.

Разберем решение: управляем параметрами СКД

Чтобы решить эту проблему, нам нужно явно указать СКД, как обрабатывать параметры периода, и отменить ее автоматическое поведение. Для этого в СКД существует специальный синтаксис расширения языка запросов — фигурные скобки {}.

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

  1. Создаем новый параметр для "пустой" даты

    На закладке "Параметры" в конструкторе схемы компоновки данных создадим новый параметр. Назовем его, например, &ПустаяДата. В поле "Выражение" для этого параметра укажем пустую дату в формате 1С:

    '00010101'

    Эта дата будет служить нашей "открытой" нижней границей периода, то есть мы будем получать данные с самого начала ведения учета.

  2. Модифицируем запрос в наборе данных

    Теперь вернемся к нашему запросу и изменим вызов виртуальной таблицы. Нам нужно передать наш новый параметр &ПустаяДата в качестве начальной даты периода и параметр отчета &КонецПериода в качестве конечной. Важный момент: оба параметра необходимо обернуть в фигурные скобки.

    Посмотрим на итоговый, работающий код:

    
    РегистрНакопления.Закупки.Обороты({(&ПустаяДата)}, {(&КонецПериода)}, Запись, ХозяйственнаяОперация = &ХозяйственнаяОперация) КАК ЗакупкиОбороты
    

Рассмотрим подробнее, что теперь происходит:

В результате этих действий запрос будет получать обороты из регистра Закупки за весь период с начала времен до даты, указанной в параметре &КонецПериода. Теперь, даже если пользователь сформирует отчет за 2025 год, система сможет найти последнюю закупку из 2024 года и корректно рассчитать себестоимость. Задача решена!

← К списку