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