Как убрать пустые строки и дубли в отчете 1С при использовании объединения запросов?

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

Разработка отчетов в 1С:УНФ с использованием системы компоновки данных (СКД) — задача, которая часто сталкивается с трудностями при формировании сложных иерархических структур. Одной из самых частых проблем является появление «пустых» строк или дублирование данных при использовании оператора ОБЪЕДИНИТЬ ВСЕ. Давайте вместе разберемся, почему это происходит и как привести отчет в порядок.

Анализ причин появления пустых строк

Когда мы используем ОБЪЕДИНИТЬ ВСЕ, мы буквально склеиваем два различных набора данных. Если в одной части объединения есть данные из регистра Запасы, а в другой — из ПотребностьВЗапасах, в результирующей таблице неизбежно появятся поля, заполненные значениями NULL или 0. Для СКД эти значения являются вполне допустимыми данными, и система, пытаясь построить иерархию, выводит их как самостоятельные строки.

Более того, если мы пытаемся соединить эти данные через ЛЕВОЕ СОЕДИНЕНИЕ по ЗаказПокупателя, мы рискуем получить декартово произведение. В результате, если в заказе несколько позиций номенклатуры, каждая из них может умножиться на количество записей в таблице перемещений. Именно поэтому автор вопроса заметил «задваивание» строк.

Решение 1: Настройка условного оформления в СКД

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

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

Решение 2: Корректировка объединения и приведение типов

Если пустые строки возникают из-за несовпадения типов данных (например, когда в одном запросе поле ссылочного типа, а в другом — 0), необходимо привести их к общему знаменателю. СКД чувствительна к типам, поэтому при объединении старайтесь использовать NULL вместо 0 или явное приведение типов.

Рассмотрим пример правильной структуры запроса для объединения:


ВЫБРАТЬ
    Т1.ЗаказНаряд КАК Заказ,
    Т1.Номенклатура КАК Номенклатура,
    Т1.Количество КАК Количество
ИЗ
    ВТ_Данные1 КАК Т1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Т2.Заказ,
    ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка),
    Т2.КоличествоПеремещения
ИЗ
    ВТ_Данные2 КАК Т2

Использование ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) позволяет системе четко понимать, что в данном поле данных нет, что значительно снижает риск появления «фантомных» строк при группировке.

Решение 3: Использование связей наборов данных в СКД

Самый профессиональный подход, который исключает дублирование и пустые строки — это отказ от сложного ОБЪЕДИНИТЬ ВСЕ в пользу связей наборов данных внутри СКД. Вместо того чтобы писать один гигантский запрос, попробуйте следующий алгоритм:

  1. Создайте Набор данных - запрос 1, который выбирает данные по Заказ-наряд.
  2. Создайте Набор данных - запрос 2, который выбирает данные по Перемещениям.
  3. Перейдите на вкладку Связи наборов данных.
  4. Добавьте новую связь:
    • Источник связи: Набор данных 1
    • Приемник связи: Набор данных 2
    • Выражение связи: ЗаказПокупателя = Регистратор.ЗаказПокупателя

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

Советы по отладке

Если отчет все равно выводит странные строки, выполните следующие шаги:

Применяя эти методы, вы сможете добиться идеального отображения структуры вашего отчета и избавиться от непонятных пустых строк раз и навсегда!

← На главную