Как получить остатки товаров с пустой характеристикой в запросе 1С:Управление торговлей 10.3?

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

При работе с регистрами накопления в 1С:Управление торговлей ред. 10.3 часто возникает задача отобрать остатки номенклатуры, у которой не указана характеристика. Однако стандартная проверка на пустую ссылку в параметрах виртуальной таблицы не всегда приносит ожидаемый результат. Разберем подробнее причины возникновения этой проблемы, проанализируем варианты запросов и рассмотрим пошагово, как правильно получить точные остатки.

Причина 1. Проверка на пустую ссылку в виртуальной таблице

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


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

Важный момент: измерение ХарактеристикаНоменклатуры имеет строгий тип СправочникСсылка.ХарактеристикиНоменклатуры. Передавать в параметр условие с НЕОПРЕДЕЛЕНО некорректно — платформа 1С использует значение НЕОПРЕДЕЛЕНО только для полей составного типа.

Причина 2. Фиктивная характеристика вместо пустой ссылки

Если условие с ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) не возвращает данные, хотя остатки у товара есть, разберем возможную причину. Иногда пользователи или алгоритмы загрузки создают в справочнике реальный элемент с наименованием "Без характеристики" или пустым наименованием "".

В этом случае в регистр записывается ссылка на конкретный элемент справочника, а не пустая ссылка. Для диагностики этой ситуации выполним отладочный запрос с вычислением наименования или типа значения:


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

Если в результате запроса вместо строки "Пусто" выводится наименование конкретного элемента, значит, в регистре записана не пустая ссылка, а созданная характеристика.

Причина 3. Получение общих остатков без учета характеристик

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

Причина 4. Наличие значений NULL, битых ссылок и особенность периода

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

  1. Использование объекта Граница для даты: При передаче даты в параметр периода Остатки(&Дата) без объекта Граница с типом ВидГраницы.Включительно остатки рассчитываются на начало указанной секунды. Движения, сделанные ровно в эту секунду, в остаток не войдут.
  2. Проверка на NULL: Если в базе данных присутствуют поврежденные записи или битые ссылки, фильтрация внутри параметров виртуальной таблицы может их отсечь. При необходимости проверки таких элементов условие ГДЕ Таблица.ХарактеристикаНоменклатуры ЕСТЬ NULL следует выносить в секцию ГДЕ основного запроса.
  3. Левое соединение со справочником: Если требуется вывести полный список товаров (включая позиции с нулевыми остатками), свяжем справочник Номенклатура с виртуальной таблицей остатков через левое соединение и применим функцию ЕСТЬNULL.

Разберем пример запроса с левым соединением и обработкой отсутствующих остатков:


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

Таким образом, анализируя тип ссылки, исключая фиктивные характеристики и правильно настраивая параметры виртуальной таблицы, мы получаем точный и надежный результат остатков в 1С.

← На главную