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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Разбор причин расхождения данных

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

Шаг 1: Проверка кэширования внешних отчетов

Прежде чем углубляться в дебри настроек схемы, исключим простую, но частую проблему — кэширование метаданных. В Библиотеке стандартных подсистем (БСП) внешние отчеты могут сохранять свои настройки в хранилище вариантов.

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

Шаг 2: Установка ролей полей в наборе данных

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

Рассмотрим, как это сделать:

  1. Перейдите на вкладку Наборы данных в настройках схемы компоновки данных.
  2. Найдите поле, отвечающее за дату документа или период записи.
  3. Откройте свойства этого поля и в строке Роль выберите тип Период.
  4. Если вы используете регистры, убедитесь, что в запрос включено поле ПериодСекунда (или Регистратор), так как стандартная точность до дня может приводить к ошибкам, если в один день было несколько движений.

Шаг 3: Точность периода и параметры виртуальных таблиц

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

Если в параметрах виртуальной таблицы указано:


ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних

Убедитесь, что параметр &Период имеет тип Дата с точностью Дата и время. Если параметр настроен как просто Дата, 1С автоматически подставит время 00:00:00, что приведет к отсечению движений, совершенных в течение того же дня. Всегда проверяйте, не обрезается ли время в настройках параметров отчета.

Шаг 4: Анализ реального запроса

Чтобы понять, что именно СКД делает «не так», проанализируем итоговый запрос, который отправляется на сервер:

  1. Откройте Консоль системы компоновки данных.
  2. Загрузите ваш отчет.
  3. Нажмите кнопку Реальный запрос.

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

Заключение

Работая с СКД, важно помнить, что это высокоуровневый инструмент. Если результат отличается от консоли:

Следуя этим шагам, вы сможете настроить получение актуальных цен в отчете с точностью до секунды.

← На главную