При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает ситуация, когда товары, для которых не установлена цена, полностью пропадают из выборки. Это происходит из-за того, что классическое ЛЕВОЕ СОЕДИНЕНИЕ с регистром цен в сочетании с неверными условиями отбора превращается в ВНУТРЕННЕЕ СОЕДИНЕНИЕ, отсекая все позиции с NULL значениями. Давайте разберем, как построить запрос так, чтобы отчет корректно отображал всю номенклатуру.
Чтобы гарантированно получить список всех позиций, воспользуемся методом создания матрицы товаров. Вместо того чтобы сразу соединять справочник с регистром, мы сформируем Временную таблицу, которая будет содержать все пары «Номенклатура — Тип цен».
Рассмотрим, как это выглядит программно в коде запроса:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
ТипыЦенНоменклатуры.Ссылка КАК ТипЦен
ПОМЕСТИТЬ ВТ_НоменклатураТипыЦен
ИЗ
Справочник.Номенклатура КАК Номенклатура,
Справочник.ТипыЦенНоменклатуры КАК ТипыЦенНоменклатуры;
Использование ДЕКАРТОВА ПРОИЗВЕДЕНИЯ (перечисление таблиц через запятую) в данном случае позволяет создать «каркас» отчета, в котором будет присутствовать каждая номенклатурная позиция, независимо от того, есть ли для нее цена в регистре.
После того как каркас готов, мы выполняем ЛЕВОЕ СОЕДИНЕНИЕ с виртуальной таблицей СрезПоследних. Ключевым моментом здесь является условие соединения: мы связываем таблицы не только по Номенклатура, но и по ТипЦен.
ВЫБРАТЬ
ВТ_НоменклатураТипыЦен.Номенклатура КАК Ссылка,
ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
ИЗ
ВТ_НоменклатураТипыЦен КАК ВТ_НоменклатураТипыЦен
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
ПО
ВТ_НоменклатураТипыЦен.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
И ВТ_НоменклатураТипыЦен.ТипЦен = ЦеныНоменклатурыСрезПоследних.ТипЦен
Использование функции ЕСТЬNULL критически важно. Без нее система будет видеть пустые значения как «несуществующие», что при попытке вывода в отчет или группировке приведет к исключению записи из итоговой таблицы.
Даже при идеально написанном запросе отчет может не выводить данные из-за внутренних настроек СКД. Разберем типичные ошибки:
Цена <> 0 или Цена > 0, все пустые значения будут отфильтрованы. Обязательно снимите эти ограничения.ГДЕ НЕ Номенклатура.ЭтоГруппа, отчет будет пытаться выводить и папки, и элементы. Если при этом наложен отбор, ограничивающий показ только товаров, папки с пустыми ценами могут блокировать отображение вложенных элементов.ПередКомпоновкойДанных. Проанализируйте код модуля, чтобы убедиться, что там нет принудительного наложения условий через КомпоновщикНастроек.Если вы все еще не видите нужную позицию, рекомендуем выполнить следующие действия:
СрезПоследних не передаются жесткие параметры, которые отсекают данные, существующие в базе.Соблюдая этот алгоритм — от создания полной матрицы через Временные таблицы до проверки настроек фильтрации в самой СКД — вы сможете добиться вывода любой номенклатуры, включая товары без цен и остатков.