Как в СКД извлечь характеристику номенклатуры (Вес) и умножить её на количество?

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

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

Понимание структуры хранения данных

Прежде чем приступать к написанию запроса, разберем, где именно в системе хранятся нужные нам данные. В классических конфигурациях (таких как УПП или Комплексная автоматизация 1.1) характеристики и их свойства распределены по нескольким таблицам:

  1. Справочник.ХарактеристикиНоменклатуры — здесь хранятся сами элементы характеристик, которые привязаны к номенклатуре.
  2. ПланВидовХарактеристк.СвойстваОбъектов — здесь определяется мета-описание свойства (например, «Вес»), его название и допустимый тип значения (Число, Строка и т.д.).
  3. РегистрСведений.ЗначенияСвойствОбъектов — это основная таблица, где хранятся конкретные значения. Здесь поле Объект ссылается на характеристику, поле Свойство — на элемент ПВХ, а ресурс Значение содержит само числовое или строковое значение.

Проанализируем ситуацию: чтобы получить вес, нам нужно соединить таблицу товаров документа с регистром сведений по ссылке на характеристику и отфильтровать записи по конкретному свойству «Вес».

Решение 1: Прямое соединение в запросе СКД

Рассмотрим наиболее надежный и понятный способ — использование ЛЕВОЕ СОЕДИНЕНИЕ непосредственно в тексте запроса. Это позволит нам сразу получить вес как отдельное поле.

Разберем пример запроса для документа «Реализация товаров и услуг»:


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

В этом запросе мы используем параметр &СвойствоВес, в который нужно передать ссылку на элемент плана видов характеристик. Обратите внимание на конструкцию ВЫРАЗИТЬ. Поскольку ресурс Значение в регистре имеет составной тип, система не позволит выполнять математические операции с ним без явного приведения к числу.

Важный нюанс: Настройка Плана видов характеристик

Часто программисты сталкиваются с тем, что даже при использовании ВЫРАЗИТЬ значение веса остается пустым или вызывает ошибку. Выясним причину этой проблемы. Она кроется в настройках самого Плана видов характеристик (ПВХ).

Посмотрим на настройки элемента «Вес» в ПВХ «Свойства объектов». Если в поле «Тип значения» указан только «Справочник.ЗначенияСвойствОбъектов» (который часто предлагается по умолчанию), то в регистре будет храниться ссылка на другой справочник, а не число. Чтобы расчеты заработали:

  1. Откройте элемент ПВХ «Вес».
  2. Убедитесь, что в Типе значения выбрано «Число».
  3. Если тип был изменен только что, необходимо перезаполнить значения веса в характеристиках, так как старые записи могли сохраниться в неверном формате.

Только если в ПВХ разрешен тип «Число», конструкция ВЫРАЗИТЬ(... КАК ЧИСЛО) в запросе отработает корректно.

Решение 2: Использование вкладки «Характеристики» в конструкторе СКД

Рассмотрим более профессиональный подход, специфичный именно для СКД. В конструкторе схемы компоновки данных есть специализированная вкладка «Характеристики». Она позволяет «научить» СКД видеть дополнительные свойства так, будто это обычные реквизиты объекта.

Чтобы настроить этот механизм, выполним следующие шаги:

  1. В поле «Тип объекта» укажем СправочникСсылка.ХарактеристикиНоменклатуры.
  2. В таблице «Источник свойств» выберем запрос или таблицу ПВХ.
  3. В таблице «Источник значений» выберем регистр ЗначенияСвойствОбъектов.
  4. Укажем связи: Объект, Свойство и Значение.

После такой настройки в поле «Характеристика» в списке доступных полей отчета появится вложенный список всех свойств, включая наш «Вес». Основное преимущество этого метода в том, что пользователю будет гораздо удобнее настраивать отборы и группировки по весу в пользовательском режиме, не зная о структуре регистров.

Реализация расчета «Вес * Количество»

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

Разберем, почему это лучше:

  1. СКД корректно обрабатывает NULL при сложении и умножении в вычисляемых полях.
  2. Это позволяет избежать дублирования логики, если вес извлекается разными частями запроса.

Перейдем на закладку «Вычисляемые поля» и добавим новое поле:

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

Диагностика типичных ошибок

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


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

Если в колонке ТипДанных вы увидите «Значение свойств объектов» вместо «Число», значит, проблема в настройке ПВХ, и умножение работать не будет. В таком случае нужно либо менять ПВХ, либо в запросе обращаться к наименованию значения (Значение.Наименование), что является менее надежным способом.

Подводя итог, мы рассмотрели, что работа с характеристиками в СКД требует комплексного подхода: от правильного проектирования Плана видов характеристик до грамотного использования механизмов компоновки данных. Используя приведенные выше инструкции, вы сможете реализовать гибкие и точные отчеты для любого товарного учета.

← На главную