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