Как вычислить вес товаров в документе «Реализация товаров и услуг» с помощью запроса?

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

При разработке отчетов или доработке печатных форм в 1С часто возникает задача вывода физических параметров документа, таких как общий вес или объем товаров. Поскольку данные о весе единицы измерения обычно хранятся в справочнике Номенклатура или ЕдиницыИзмерения, а количество товаров находится в табличной части документа, необходимо правильно объединить эти данные в запросе. Рассмотрим пошагово, как это реализовать.

Этап 1: Подготовка структуры запроса

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

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

Этап 2: Написание кода запроса

Давайте проанализируем итоговое решение, которое позволяет получить корректный вес. Мы используем соединение с табличной частью Товары и суммируем произведение количества на вес единицы измерения.


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

Этап 3: Важные нюансы реализации

Разберем детально, почему запрос строится именно так и какие ошибки часто допускают разработчики:

  1. Учет количества: Самая частая ошибка — забыть умножить вес единицы на Количество товара. Вес в справочнике ЕдиницыИзмерения обычно указан для одной единицы, поэтому всегда проверяйте, что формула расчета включает Количество * Вес.
  2. Функция ЕСТЬNULL: В базе данных значения веса или объема могут быть не заполнены (равны NULL). Чтобы в отчете вместо пустых значений получить 0, обязательно используйте функцию ЕСТЬNULL(СУММА(...), 0).
  3. Группировка: Помните, что правила языка запросов 1С требуют указывать в предложении СГРУППИРОВАТЬ ПО все поля выборки, которые не являются агрегатными (то есть те, к которым не применена функция СУММА, МАКСИМУМ и т.д.). Если вы забудете добавить поле в группировку, система выдаст ошибку при выполнении запроса.
  4. Оптимизация соединений: Если конфигурация сильно переписана, как в случае с УТ 10.3, следите за тем, чтобы соединения не создавали «декартово произведение». В данном примере мы соединяем строго по ссылке документа, что является оптимальным способом доступа к табличной части.

Советы по отладке

Если после выполнения запроса вы получаете странные цифры, выполните следующие действия:

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

← На главную