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