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