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