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

Программист Управленческий учет
← На главную

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

Причина 1: Специфика параметров виртуальных таблиц в СКД

Разберем ситуацию, представленную в коде автора. В запросе используются три виртуальные таблицы: ОстаткиИОбороты и две таблицы СрезПоследних (для получения цены на начало и на конец периода). В консоли запросов мы явно передаем &ДатаНачала и &ДатаОкончания, и всё работает. Однако СКД — это не просто «исполнитель запроса», а интеллектуальный генератор, который перестраивает ваш текст перед отправкой в СУБД.

Проанализируем фрагмент запроса, который формирует СКД (как видно из сообщения №6):

РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&П, ...)

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

Что нужно сделать:

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

Причина 2: Отсутствие обработки NULL при левом соединении

Выясним причину, по которой стоимость может исчезать полностью. В сообщении №2 автор использует ЛЕВОЕ СОЕДИНЕНИЕ с таблицами цен. Это правильный подход, так как остатки должны выводиться, даже если цена для какой-то позиции не установлена.

Однако в блоке выбора данных мы видим следующий код:

вт_Остатки.ВНаличииНачальныйОстаток * вт_ЦеныНаНачало.Цена КАК СтоимостьНаНачало

Проанализируем ситуацию: если для номенклатуры не найдена цена в таблице вт_ЦеныНаНачало, поле Цена будет содержать значение NULL. В языке запросов 1С любая арифметическая операция с NULL (умножение, сложение) всегда дает результат NULL. В итоге вся строка стоимости становится пустой. В консоли запросов вы можете видеть пустую ячейку, но в СКД, при суммировании ресурсов, это может привести к тому, что итоги по группировкам также станут пустыми.

Решение: всегда используйте функцию ЕСТЬNULL. Изменим фрагмент запроса:


ВЫБРАТЬ
    вт_Остатки.ВНаличииНачальныйОстаток КАК ОстатокНаНачало,
    ЕСТЬNULL(вт_Остатки.ВНаличииНачальныйОстаток, 0) * ЕСТЬNULL(вт_ЦеныНаНачало.Цена, 0) КАК СтоимостьНаНачало

Причина 3: Расчет стоимости на уровне ресурсов СКД

Посмотрим на вкладку «Ресурсы», которую предоставил автор. Там указано суммирование уже готового поля СтоимостьНаНачало. Хотя технически это допустимо, для СКД это считается «плохим тоном» и часто ведет к ошибкам в итогах, особенно если одна и та же цена соединяется с несколькими записями остатков (например, при детализации до регистратора).

Как сделать правильно:

  1. В самом запросе лучше вычислять только «сырые» данные: Количество и Цена.
  2. На вкладке Ресурсы для поля Стоимость пропишите формулу: Сумма(Количество * Цена) или, более правильно для средних цен: Сумма(Количество) * Среднее(Цена) (в зависимости от вашей бизнес-логики).
  3. Это позволит СКД корректно рассчитывать итоги на уровне группировок (Номенклатура, Склад, Иерархия), не допуская искажения сумм.

Причина 4: Роли полей и механизм расчета итогов

Если ваш отчет использует группировку по Регистратору (как в примере сообщения №6), СКД начинает использовать механизм расчета остатков. Если полям НачальныйОстаток и КонечныйОстаток на вкладке Роли не назначены соответствующие типы («Начальный остаток» и «Конечный остаток» для поля Номенклатура), то при сложении строк по регистраторам СКД просто просуммирует остатки как обычные числа. Это даст гигантские неверные значения стоимости.

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

Итоговые рекомендации

Рассмотрим по шагам процесс исправления отчета:

  1. Проверьте параметры: Убедитесь, что даты в СрезПоследних передаются именно те, которые выбрал пользователь, а не те, которые СКД «подставила» по своему усмотрению. Используйте для этого механизм фигурных скобок в тексте запроса {...}, если это необходимо.
  2. Оберните цены в ЕСТЬNULL: Это гарантирует, что отсутствие цены превратится в 0, и расчет стоимости не «обнулится».
  3. Проанализируйте итоговый SQL-запрос: Используйте консоль системы компоновки данных. Если вы видите, что СКД выбрасывает соединения с таблицами цен (такое бывает, если поля цен не выбраны в текущем варианте отчета), установите у этих полей флаг «Обязательное» в наборе данных.

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

← На главную