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