Как правильно получить дополнительные реквизиты номенклатуры в запросе СКД и избежать проблем с типами данных?

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

При разработке отчетов в 1С часто возникает задача вывести в отчет дополнительные реквизиты, например, Вес или Габариты. Однако при попытке реализовать это через запрос к табличной части ДополнительныеРеквизиты многие разработчики сталкиваются с тем, что данные «пропадают» или не воспринимаются системой как числа. Давайте разберем, почему это происходит и как сделать работу с этими данными корректной.

Почему возникают проблемы с выводом данных?

Основная причина заключается в архитектуре хранения дополнительных реквизитов. В типовых конфигурациях, таких как 1С:Бухгалтерия, дополнительные реквизиты хранятся в табличной части справочника Номенклатура. Поле Значение имеет составной тип данных, что означает, что в одной колонке могут храниться и числа, и строки, и ссылки. Когда мы обращаемся к этому полю напрямую, система не всегда может автоматически определить его как число, что приводит к невозможности выполнения арифметических операций.

Еще одна критическая ошибка — использование условия отбора по правой таблице в блоке ГДЕ. Когда вы делаете ЛЕВОЕ СОЕДИНЕНИЕ, но в секции ГДЕ указываете ГДЕ Свойство.Наименование = &ИмяСвойства, вы фактически превращаете запрос во ВНУТРЕННЕЕ СОЕДИНЕНИЕ. В результате все товары, у которых данный реквизит не заполнен, просто исчезают из выборки.

Шаг 1: Правильное соединение таблиц

Чтобы не потерять строки, в которых реквизит отсутствует, условие отбора необходимо перенести непосредственно в блок ПО. Это позволит выполнить корректное левое соединение, сохранив все записи из основной таблицы РеализацияТоваровУслуг.Товары.

Рассмотрим пример правильного написания запроса:


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

Шаг 2: Обработка NULL и приведение типов

Поскольку при левом соединении для номенклатуры без заполненного реквизита поле Значение вернет NULL, арифметические операции (например, Количество * Вес) приведут к результату NULL. Чтобы этого избежать, используем функцию ЕСТЬNULL. Она заменит отсутствие значения на 0, что позволит корректно суммировать веса в итогах отчета.

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

Шаг 3: Использование характеристик в СКД

Для профессионального подхода в СКД рекомендуем использовать механизм Характеристики. Это встроенный инструмент платформы, который позволяет не писать сложные соединения вручную.

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

Использование этого метода избавляет от необходимости постоянно следить за типами данных и оптимизирует производительность отчета, так как платформа сама подберет наиболее эффективный способ получения данных из базы.

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

← На главную