Почему в запросе 1С количество товаров увеличивается в несколько раз и как это исправить?

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

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

Анализируем причину возникновения ошибки

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

Шаг 1: Отказываемся от лишних соединений

В 1С не нужно пытаться соединить таблицу Документ.ЗаказПокупателя и Документ.ЗаказПокупателя.Товары вручную. Табличная часть уже содержит скрытое поле Ссылка, через которое мы можем обратиться к любому реквизиту «шапки» документа. Это самый быстрый и надежный способ получения данных.

Шаг 2: Правильный запрос к табличной части

Рассмотрим, как правильно составить запрос, чтобы получить итоговое количество товаров, исключив при этом ненужные группы номенклатуры:


ВЫБРАТЬ
    ЗаказПокупателяТовары.Номенклатура КАК Номенклатура,
    СУММА(ЗаказПокупателяТовары.Количество) КАК Количество
ИЗ
    Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
ГДЕ
    ЗаказПокупателяТовары.Ссылка.Проведен = ИСТИНА
    И НЕ ЗаказПокупателяТовары.Номенклатура В ИЕРАРХИИ (&НоменклатураСписок)
    И ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
    И (ЗаказПокупателяТовары.Ссылка.КлассификацияУпаковки = \"Категория A\" 
       ИЛИ ЗаказПокупателяТовары.Ссылка.КлассификацияУпаковки = \"Категория B\")
СГРУППИРОВАТЬ ПО
    ЗаказПокупателяТовары.Номенклатура

Шаг 3: Работа с параметрами исключения

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

  1. Создайте СписокЗначений в коде обработки или используйте настройки параметров в СКД.
  2. Передайте его в запрос через метод Запрос.УстановитьПараметр(\"НоменклатураСписок\", СписокИсключений).
  3. В условии запроса используйте оператор НЕ ... В ИЕРАРХИИ (&НоменклатураСписок). Это позволит исключить выбранную группу вместе со всеми её дочерними элементами.

Важные рекомендации при отладке

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

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

← На главную