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