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

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

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

Анализируем причину возникновения «утроения» данных

Основная проблема, с которой сталкиваются разработчики при объединении таблиц ОтчетОРозничныхПродажах, РеализацияТоваров и самописных документов типа ЗаказНаряд, заключается в так называемом декартовом произведении (перекрестном соединении). Это случается, когда вы соединяете таблицы по полям, которые не являются уникальными для каждой конкретной строки.

Представьте ситуацию: в одной таблице есть строка с заказом, и в другой таблице для того же заказа существует несколько записей (например, по разным товарам). Если вы соединяете их только по ссылке на документ-заказ, база данных 1С сопоставит каждую строку первой таблицы с каждой соответствующей строкой второй таблицы. Если у вас 3 строки в первой таблице и 3 во второй, результатом соединения станут 9 строк. Именно из-за этого суммы и количества «взлетают» в геометрической прогрессии.

Шаг 1: Правильный подбор ключей соединения

Чтобы избежать дублей, необходимо соединять таблицы по комбинации полей, которая однозначно идентифицирует каждую строку. Не ограничивайтесь только ссылкой на документ.

Рассмотрим пример формирования ключа. Обычно для однозначной идентификации строки товара в документе нам необходимы три поля:

  1. ЗаказПокупателя (или Ссылка на документ)
  2. Номенклатура
  3. Характеристика

Когда вы соединяете две временные таблицы, используйте конструкцию ЛЕВОЕ СОЕДИНЕНИЕ по всем этим полям:


ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Сумма КАК СуммаПродаж,
    ЗаказНаряд.Сумма КАК СуммаЗаказа
ИЗ
    Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ
    ЗаказНаряд КАК ЗаказНаряд
ПО
    Продажи.ЗаказПокупателя = ЗаказНаряд.ЗаказПокупателя
    И Продажи.Номенклатура = ЗаказНаряд.Номенклатура
    И Продажи.Характеристика = ЗаказНаряд.Характеристика

Шаг 2: Группировка перед соединением

Частой причиной ошибки является наличие дублей внутри самой временной таблицы до момента соединения. Если в исходных данных ЗаказНаряд одна номенклатура встречается дважды, вы неизбежно получите дублирование строк при соединении.

Перед тем как использовать временную таблицу в конечном соединении, всегда проверяйте ее на наличие уникальных строк. Используйте оператор СГРУППИРОВАТЬ ПО для суммирования показателей:


ВЫБРАТЬ
    ЗаказНаряд.ЗаказПокупателя,
    ЗаказНаряд.Номенклатура,
    ЗаказНаряд.Характеристика,
    СУММА(ЗаказНаряд.Количество) КАК Количество,
    СУММА(ЗаказНаряд.Сумма) КАК Сумма
ПОМЕСТИТЬ СгруппированныйЗаказНаряд
ИЗ
    Документ.ЗаказНаряд.Товары КАК ЗаказНаряд
СГРУППИРОВАТЬ ПО
    ЗаказНаряд.ЗаказПокупателя,
    ЗаказНаряд.Номенклатура,
    ЗаказНаряд.Характеристика

Шаг 3: Оптимизация структуры запроса

Для повышения производительности и читаемости кода придерживайтесь следующих правил:

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

← На главную