Как в отчете СКД вывести номенклатуру, у которой нет установленной цены?

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

При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает ситуация, когда товары, для которых не установлена цена, полностью пропадают из выборки. Это происходит из-за того, что классическое ЛЕВОЕ СОЕДИНЕНИЕ с регистром цен в сочетании с неверными условиями отбора превращается в ВНУТРЕННЕЕ СОЕДИНЕНИЕ, отсекая все позиции с NULL значениями. Давайте разберем, как построить запрос так, чтобы отчет корректно отображал всю номенклатуру.

Шаг 1: Правильное построение структуры данных

Чтобы гарантированно получить список всех позиций, воспользуемся методом создания матрицы товаров. Вместо того чтобы сразу соединять справочник с регистром, мы сформируем Временную таблицу, которая будет содержать все пары «Номенклатура — Тип цен».

Рассмотрим, как это выглядит программно в коде запроса:


ВЫБРАТЬ 
    Номенклатура.Ссылка КАК Номенклатура, 
    ТипыЦенНоменклатуры.Ссылка КАК ТипЦен 
ПОМЕСТИТЬ ВТ_НоменклатураТипыЦен 
ИЗ 
    Справочник.Номенклатура КАК Номенклатура, 
    Справочник.ТипыЦенНоменклатуры КАК ТипыЦенНоменклатуры;

Использование ДЕКАРТОВА ПРОИЗВЕДЕНИЯ (перечисление таблиц через запятую) в данном случае позволяет создать «каркас» отчета, в котором будет присутствовать каждая номенклатурная позиция, независимо от того, есть ли для нее цена в регистре.

Шаг 2: Безопасное соединение с регистром цен

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


ВЫБРАТЬ 
    ВТ_НоменклатураТипыЦен.Номенклатура КАК Ссылка, 
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
ИЗ 
    ВТ_НоменклатураТипыЦен КАК ВТ_НоменклатураТипыЦен 
ЛЕВОЕ СОЕДИНЕНИЕ 
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних 
ПО 
    ВТ_НоменклатураТипыЦен.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура 
    И ВТ_НоменклатураТипыЦен.ТипЦен = ЦеныНоменклатурыСрезПоследних.ТипЦен

Использование функции ЕСТЬNULL критически важно. Без нее система будет видеть пустые значения как «несуществующие», что при попытке вывода в отчет или группировке приведет к исключению записи из итоговой таблицы.

Шаг 3: Проверка настроек СКД и отборов

Даже при идеально написанном запросе отчет может не выводить данные из-за внутренних настроек СКД. Разберем типичные ошибки:

  1. Отбор по цене в настройках: Проверьте вкладку «Отборы» в настройках отчета. Если там задано условие Цена <> 0 или Цена > 0, все пустые значения будут отфильтрованы. Обязательно снимите эти ограничения.
  2. Неявные отборы по полям: Убедитесь, что в полях отчета нет фильтрации по «пустому» наименованию или другим реквизитам.
  3. Использование групп номенклатуры: Если в запросе не указано условие ГДЕ НЕ Номенклатура.ЭтоГруппа, отчет будет пытаться выводить и папки, и элементы. Если при этом наложен отбор, ограничивающий показ только товаров, папки с пустыми ценами могут блокировать отображение вложенных элементов.
  4. Модуль объекта: Иногда фильтрация происходит в процедуре ПередКомпоновкойДанных. Проанализируйте код модуля, чтобы убедиться, что там нет принудительного наложения условий через КомпоновщикНастроек.

Рекомендации по отладке

Если вы все еще не видите нужную позицию, рекомендуем выполнить следующие действия:

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

← На главную