Как вывести нулевые и отрицательные остатки в отчете СКД при отборе по складам в 1С:УТ 11.4?

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

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

Разбор основной причины проблемы

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

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

Шаг 1: Правильная структура запроса

Первым делом нам необходимо убедиться, что ведущей таблицей в запросе выступает именно справочник номенклатуры. Рассмотрим пример корректного построения связей:


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

В этом примере мы берем за основу Справочник.Номенклатура и уже к нему "подклеиваем" данные о ценах и остатках. Использование функции ЕСТЬNULL позволяет нам заменить пустоту на "0" для визуального удобства пользователя.

Шаг 2: Правильная работа с условиями связи

Чтобы при отборе по складу не пропадали пустые строки, мы должны переместить условие фильтрации из общей секции ГДЕ в параметры связи или параметры виртуальной таблицы. Рассмотрим подробнее, как это реализовать в СКД.

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


// В конструкторе запроса для виртуальной таблицы Остатки:
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &ВыбранныйСклад)

Вариант Б: Условие в секции ПО. Если по каким-то причинам использование параметров виртуальной таблицы неудобно, можно добавить условие прямо в связь:


ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
ПО СправочникНоменклатуры.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
    И ТоварыНаСкладахОстатки.Склад = &Склад

В этом случае записи из справочника номенклатуры не исчезнут, так как условие на склад будет проверяться только для присоединяемых записей регистра.

Шаг 3: Настройка параметров в компоновщике данных

Выясним причину, почему даже при правильном запросе отбор может работать неверно. В интерфейсе СКД на вкладке "Настройки" есть раздел "Отбор". Если пользователь добавит туда поле Остатки.Склад, СКД автоматически применит фильтр ко всему результату. Чтобы этого избежать, профессиональные разработчики используют следующий прием:

  1. Создаем в СКД новый параметр, например, СкладДляОтбора.
  2. В запросе в параметрах виртуальной таблицы прописываем использование этого параметра.
  3. На вкладке "Параметры" настраиваем его доступность пользователю.

Таким образом, мы жестко контролируем, куда именно попадет условие отбора, не позволяя системе искажать логику ЛЕВОГО СОЕДИНЕНИЯ.

Шаг 4: Работа с отрицательными остатками

Отрицательные остатки в УТ 11.4 — явление нормальное, если включена настройка "Списание при отсутствии остатков". Они хранятся в регистре ТоварыНаСкладах со знаком "минус". Проанализируем ситуацию: если в отчете исчезают именно отрицательные значения, проверьте, нет ли в настройках СКД или в самом запросе условия типа ВНаличииОстаток > 0. Если задача стоит выводить все остатки, убедитесь, что никакие фильтры не ограничивают диапазон значений поля Остаток.

Шаг 5: Использование характеристик

В конфигурации УТ 11.4 учет часто ведется в разрезе характеристик. Если мы просто соединим номенклатуру с остатками по ссылке, мы можем получить "задвоение" строк или некорректные данные. Правильное соединение должно выглядеть так:


ПО СправочникНоменклатуры.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
И (СправочникНоменклатуры.ИспользоватьХарактеристики = ЛОЖЬ ИЛИ ТоварыНаСкладахОстатки.Характеристика <> ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка))

Хотя чаще всего достаточно просто добавить поле Характеристика в связи и в выборку, чтобы отчет корректно детализировал остатки по каждой позиции.

Визуальное оформление нулевых значений

Для того чтобы отчет выглядел профессионально, мы можем настроить отображение "0" вместо пустых ячеек не только через ЕСТЬNULL в запросе, но и средствами оформления СКД. Для этого:

Это гарантирует, что даже если в какой-то из группировок значение будет отсутствовать, пользователь увидит понятную цифру, а не пустую ячейку.

Подводя итог, скажем: залогом корректного отображения нулевых и отрицательных остатков является строгая последовательность соединений (от справочника к регистрам) и контроль места наложения условий (параметры виртуальных таблиц вместо общего отбора). Применяя эти правила, вы сможете создавать надежные и информативные отчеты для пользователей УТ 11.4.

← На главную