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