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