Как в СКД создать отчет по товарам, объединяющий остатки, цены и характеристики с использованием левых соединений

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

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

Постановка задачи и выбор источников данных

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

Наша цель — получить таблицу, где каждой строке (товар + вариант) соответствуют его цена и остаток. При этом, если товара нет на складе или для него не установлена цена, он все равно должен попасть в отчет (для этого мы будем использовать ЛЕВОЕ СОЕДИНЕНИЕ).

Работа с виртуальными таблицами в запросе

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

  1. Для остатков: РегистрНакопления.ОстаткиНаСкладах.Остатки.
  2. Для цен: РегистрСведений.ЦеныНоменклатуры.СрезПоследних.

Разберем типичную ошибку новичков: попытку наложить фильтры по складу или виду цены в секции ГДЕ. Проанализируем ситуацию: если вы укажете склад в условии ГДЕ, система сначала выгрузит из базы данных абсолютно все остатки по всем складам, и только потом отсеет лишние. Правильный подход — передавать параметры напрямую в скобки виртуальной таблицы.

Проектирование текста запроса для СКД

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


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

В данном запросе мы используем &ПериодОстатков и &ПериодЦен. В СКД эти параметры можно связать с единым пользовательским параметром даты или оставить независимыми.

Особенности соединения по вариантам (характеристикам)

Выясним причину, почему соединение должно происходить обязательно по двум полям (Номенклатура и Вариант). Если мы укажем связь только по полю Номенклатура, то при наличии у товара нескольких вариантов (например, «Кроссовки» с размерами 40, 41, 42) система продублирует строки или некорректно просуммирует данные. Левое соединение по обоим измерениям гарантирует точность данных для каждой складской позиции.

Настройка СКД для гибкого отбора

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

  1. Вкладка «Наборы данных»: Убедитесь, что для числовых полей (Цена, Остаток) не установлены роли «Измерение», иначе СКД может группировать данные не так, как ожидается.
  2. Вкладка «Параметры»:
    • Для параметра ПериодЦен и ПериодОстатков установите тип Дата. Чтобы пользователь не вводил одну и ту же дату дважды, можно создать один общий параметр ДатаОтчета и в выражении для системных параметров прописать его использование.
    • Сделайте параметр ВидЦены обязательным, так как получение «всех цен сразу» через левое соединение приведет к дублированию строк товаров.
  3. Вкладка «Настройки» -> «Отбор»: Вынесите поля «Цена», «Остаток», «Склад» и «Номенклатура» в Быстрые настройки. Это позволит пользователю прямо на форме отчета задавать условия типа «Цена Больше 1000» или «Остаток Меньше или равно 5».

Обработка иерархии номенклатуры

Посмотрим на пример работы с группами. В СКД не нужно писать сложные условия для отбора по папкам в запросе. Достаточно того, что поле Товар имеет тип ссылки на справочник. Если пользователь в настройках выберет вид сравнения «В иерархии», СКД автоматически сформирует правильный SQL-запрос, который включит все товары из выбранной группы и её подгрупп.

Использование ролей полей

Проанализируем вкладку «Наборы данных». Для поля Склад очень полезно указать роль «Измерение». Это подскажет системе компоновки, как правильно рассчитывать итоги, если пользователь захочет вывести отчет в разрезе складов. Также проверьте, чтобы для суммовых полей (Остаток) на вкладке «Ресурсы» была определена функция СУММА(Остаток).

Важный совет: Если вы столкнулись с тем, что товары без остатков исчезают из отчета при установке фильтра по остатку, помните о природе NULL. В условиях отбора СКД всегда лучше использовать поля, предварительно обработанные функцией ЕСТЬNULL в тексте запроса, чтобы сравнение «0 > 100» отрабатывало математически верно.

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

← На главную