Почему в отчете СКД дублируются строки и как правильно объединить закупки и остатки товаров на складах в 1С:УТ 10.3?

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

При самостоятельной разработке внешних отчетов в системе компоновки данных (СКД) начинающие разработчики часто сталкиваются с ситуацией, когда по одной позиции номенклатуры формируются десятки повторяющихся строк с некорректными числовыми показателями. Разберем практический кейс из конфигурации «Управление торговлей 10.3», выясним причину размножения записей и рассмотрим правильные подходы к получению остатков и оборотов в запросах 1С.

Причина проблемы: декартово произведение таблиц

Проанализируем исходный запрос, вызвавший проблему:


ВЫБРАТЬ
	Закупки.Регистратор,
	Закупки.Номенклатура.Наименование,
	Закупки.Номенклатура.БазоваяЕдиницаИзмерения,
	Закупки.Стоимость,
	Закупки.Количество,
	ТоварыНаСкладах.Склад.Наименование
ИЗ
	РегистрНакопления.Закупки КАК Закупки,
	РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

В этом запросе в секции ИЗ перечислены две таблицы через запятую без условий связи. В реляционной алгебре и языке запросов 1С такая запись означает полное декартово произведение (безусловное перемножение). Если в таблице Закупки присутствует 1 запись, а в таблице ТоварыНаСкладах — 23 записи, платформа умножит каждую строку первой таблицы на каждую строку второй. В результате на одну строку поступления отчет выведет 23 строки, привязав к номенклатуре абсолютно случайные склады и движения.

Кроме того, в запросе допущены еще две критические ошибки:

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

Шаг 1. Переход на явное соединение и виртуальные таблицы

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

Посмотрим на базовый исправленный вариант связывания данных:


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

Параметры отбора и периода обязательно должны передаваться внутрь круглых скобок виртуальных таблиц (Обороты и Остатки), а не в конструкцию ГДЕ. Это позволяет платформе применить индексы на уровне СУБД и рассчитать итоги оптимальным образом.

Шаг 2. Учет архитектуры регистров в УТ 10.3

При соединении регистра Закупки и регистра ТоварыНаСкладах возникает методологическая проблема конфигурации «Управление торговлей 10.3»:

  1. В регистре накопления Закупки нет измерения «Склад». Закупки фиксируются в разрезе контрагентов, договоров и заказов поставщикам.
  2. Если товар лежит на нескольких складах (например, на двух складах), то при левом соединении по одной номенклатуре строка закупки снова продублируется столько раз, сколько складов имеют остаток по этой позиции. При этом числовые ресурсы закупки сложатся повторно, исказив итоговую сумму.

Если для аналитики требуется видеть движение и остатки товара одновременно в количестве и в рублях с привязкой к складам, следует обращаться к другим регистрам конфигурации:

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

Шаг 3. Корректное объединение разнородных данных в отчете

Чтобы избежать искажения сумм и задвоения записей при объединении разных показателей (закупки, продажи, складские остатки), рекомендуется использовать один из двух правильных подходов в 1С:

Подход 1. Конструкция ОБЪЕДИНИТЬ ВСЕ в запросе

Вместо соединений разнородные показатели выбираются отдельными ветками запроса с одинаковым набором колонок и последующей группировкой:


ВЫБРАТЬ
	ВложенныйЗапрос.Номенклатура КАК Номенклатура,
	ВложенныйЗапрос.Склад КАК Склад,
	СУММА(ВложенныйЗапрос.КоличествоЗакупки) КАК КоличествоЗакупки,
	СУММА(ВложенныйЗапрос.СуммаЗакупки) КАК СуммаЗакупки,
	СУММА(ВложенныйЗапрос.КоличествоОстаток) КАК КоличествоОстаток
ИЗ
	(ВЫБРАТЬ
		ЗакупкиОбороты.Номенклатура КАК Номенклатура,
		ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) КАК Склад,
		ЗакупкиОбороты.КоличествоОборот КАК КоличествоЗакупки,
		ЗакупкиОбороты.СтоимостьОборот КАК СуммаЗакупки,
		0 КАК КоличествоОстаток
	ИЗ
		РегистрНакопления.Закупки.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ЗакупкиОбороты
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		ТоварыНаСкладахОстатки.Номенклатура,
		ТоварыНаСкладахОстатки.Склад,
		0,
		0,
		ТоварыНаСкладахОстатки.КоличествоОстаток
	ИЗ
		РегистрНакопления.ТоварыНаСкладах.Остатки(&ПериодОстатков, ) КАК ТоварыНаСкладахОстатки) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
	ВложенныйЗапрос.Номенклатура,
	ВложенныйЗапрос.Склад

Подход 2. Использование связей наборов данных в СКД

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

Особенности партионного учета: почему регистры могут быть пустыми

Если при тестировании отчетов движения по суммовым регистрам (например, ПартииТоваровНаСкладах или ПродажиСебестоимость) оказываются пустыми, следует проверить параметры учетной политики в УТ 10.3.

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

Для типовых управленческих задач перед созданием собственных отчетов стоит проверить возможности стандартных решений УТ 10.3: отчет «Ведомость по партиям товаров на складах» уже содержит остатки и движение в рублях и штуках, а показатели прибыли и выручки представлены в отчете «Валовая прибыль».

← На главную