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