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