Как вывести остатки номенклатуры с пересчетом в упаковки в отчете СКД без задвоения данных?

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

При разработке отчетов по складским остаткам в конфигурации «1С:Розница» часто возникает задача вывести количество товара не только в базовых единицах измерения, но и с пересчетом во все доступные упаковки. При попытке прямого левого соединения таблицы остатков со справочником УпаковкиНоменклатуры разработчики сталкиваются с двумя типовыми проблемами:

  1. Задвоение остатков: если у одной позиции номенклатуры заведено несколько упаковок, прямое соединение размножает строки с остатком, в результате чего общие итоги по складу или номенклатуре многократно завышаются.
  2. Лишняя пустая иерархия: для товаров, у которых упаковки не используются вовсе, подчиненная группировка по упаковкам выводит пустую строку со значением NULL, ухудшая читаемость отчета.

Разберем по шагам, как правильно организовать получение данных и настроить схему компоновки данных (СКД), чтобы получить корректный результат.

Особенность структуры хранения упаковок в 1С:Розница 2.2

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

Условие связи в тексте запроса должно учитывать оба варианта:


ГДЕ
	УпаковкиНоменклатуры.Владелец = ВЫБОР
		КОГДА Номенклатура.НаборУпаковок = ЗНАЧЕНИЕ(Справочник.НаборыУпаковок.ПустаяСсылка)
			ТОГДА Номенклатура.Ссылка
		ИНАЧЕ Номенклатура.НаборУпаковок
	КОНЕЦ

Способ 1. Использование двух наборов данных и связей СКД (Рекомендуемый)

Наиболее надежный способ избежать декартова произведения строк остатков — разделить получение данных на два независимых набора данных в СКД.

  1. НаборДанных1 (Остатки): запрос выбирает данные из виртуальной таблицы ТоварыНаСкладахОстатки без соединения с упаковками. В нем содержатся поля Номенклатура, Склад, В единицах хранения (базовый остаток).
  2. НаборДанных2 (Упаковки): запрос к справочнику УпаковкиНоменклатуры, выбирающий поля Ссылка КАК Упаковка, Коэффициент и владельца.
  3. Настройка связи наборов: на вкладке «Связи наборов данных» связываем НаборДанных1 (источник) и НаборДанных2 (приемник) по полю Номенклатура, передавая параметры связи.

При таком подходе платформа 1С самостоятельно агрегирует подчиненные записи без искажения числовых ресурсов верхнего уровня.

Способ 2. Настройка вычисляемых полей и выражений ресурсов

Если данные собираются в одном запросе, проблему задвоения итогов решают точной настройкой ресурсов на вкладке «Ресурсы» в СКД.

Рассмотрим, как правильно настроить формулы расчета:

  1. Для поля КоличествоОстаток (базовый остаток) указываем расчет только для группировок верхнего уровня: в колонке «Рассчитывать по...» выбираем группировку Номенклатура и ОбщийИтог. На уровне группировки Упаковка базовый остаток не вычисляем или выводим 0.
  2. Для поля КолУп (количество в упаковках) в вычисляемых полях или ресурсах используем специальную функцию языка выражений СКД ВычислитьВыражение:

ВычислитьВыражение("Сумма(КоличествоОстаток)", "Номенклатура") / ЕстьNull(Коэффициент, 1)

Эта конструкция берет неискаженный базовый остаток с вышестоящей группировки Номенклатура и делит его на коэффициент конкретной упаковки в подчиненной строке.

Способ 3. Скрытие пустых строк иерархии для товаров без упаковок

Выясним причину появления пустых строк: если в структуре отчета задана иерархия Номенклатура -> Упаковка, СКД выводит подчиненную строку для каждой номенклатуры, даже если значение поля Упаковка равно NULL.

Чтобы скрыть пустую строку подчиненной группировки, применим локальный отбор:

  1. Переходим на вкладку «Настройки» в структуру отчета.
  2. Выделяем конкретную подчиненную группировку Упаковка.
  3. В нижней части окна переходим на закладку «Отбор» (это будет локальный отбор для выбранной группировки, а не общий для всего отчета).
  4. Добавляем условие: Упаковка Заполнено (или Упаковка <> ЗначениеЗаполнено).

В результате товары, имеющие упаковки, выводятся с раскрывающимся списком упаковок, а товары без упаковок отображаются плоской строкой без лишних пустых подуровней.

Способ 4. Вывод упаковок в колонки таблицы

Если необходимо избежать многоуровневой иерархии строк, заменим структуру «Группировка строк» на структуру «Таблица»:

  1. В строках таблицы указываем поле Номенклатура.
  2. В колонках таблицы указываем поле Упаковка.
  3. В выбранных полях таблицы размещаем ресурс КолУп.

В таком варианте для каждого товара сформируется компактная строка, а пересчитанные количества по разным упаковкам наглядно распределятся по соответствующим колонкам отчета.

← На главную