Как исправить задвоение данных при формировании отчета по закупкам в 1С:УТ 11?

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

При создании отчетов на базе Системы компоновки данных (СКД) в 1С:Управление торговлей 11 разработчики часто сталкиваются с проблемой «задвоения» строк. Это происходит, когда в отчет попадают лишние записи, а итоговые суммы оборотов значительно превышают реальные показатели. Рассмотрим, почему это происходит и как правильно настроить отчет, чтобы избежать подобных ошибок.

Причина возникновения дублей: анализ ошибки

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

  1. При использовании ВНУТРЕННЕГО СОЕДИНЕНИЯ по полю Номенклатура, для каждой записи из первой таблицы система ищет совпадения во второй.
  2. Если за выбранный период было оформлено несколько документов поступления по одной и той же номенклатуре, то каждая строка из таблицы Закупки (отдельные документы) будет принудительно умножена на записи из таблицы Обороты.
  3. В результате вместо одной строки с итоговым количеством, мы получаем столько строк, сколько было документов поступления, причем в каждой из них дублируется общая сумма оборота.

Решение: использование виртуальных таблиц

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

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

Пример корректного запроса:


ВЫБРАТЬ
    ЗакупкиОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    ЗакупкиОбороты.КоличествоОборот КАК Количество,
    ЗакупкиОбороты.СуммаОборот КАК Сумма,
    ЗакупкиОбороты.Регистратор КАК Регистратор
ИЗ
    РегистрНакопления.Закупки.Обороты(&ПериодНачала, &ПериодКонца, Регистратор, ) КАК ЗакупкиОбороты

Как настроить группировки в СКД

Если вам нужно выводить как общие показатели, так и детальные данные по регистраторам, используйте возможности СКД для настройки структуры, а не для написания сложных соединений в запросе:

  1. В наборе данных оставьте только виртуальную таблицу.
  2. В настройках отчета создайте группировку по полю Номенклатура.
  3. Внутри этой группировки создайте детальные записи (документы).
  4. Система автоматически суммирует КоличествоОборот и СуммаОборот для каждой номенклатуры в итоговой строке, исключая любое дублирование данных.

Использование связей наборов данных

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

Важное примечание: всегда анализируйте типовые отчеты УТ 11, например Анализ себестоимости товаров. Разработчики 1С штатно используют только виртуальные таблицы, возлагая всю нагрузку по агрегации данных на механизм Компоновки данных.

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

← На главную