Как убрать лишнюю строку в макете СКД

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Анализ проблемы: почему СКД выводит лишние данные

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

Проанализируем основные причины возникновения этой проблемы:

  1. Включено автоматическое расположение итогов в настройках компоновки.
  2. Наличие "Детальных записей" в структуре отчета без соответствующего макета.
  3. Неправильное использование макетов ресурсов вместо макетов группировок (или наоборот).
  4. Захват лишних пустых ячеек в именованные области макета в табличном документе.

Способ 1. Корректировка настроек расположения итогов

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

Разберем по шагам, как это отключить:

  1. Перейдем на закладку Настройки в схеме компоновки данных.
  2. Выберем либо весь отчет (самый верхний уровень), либо конкретную группировку, после которой появляется лишняя строка.
  3. Перейдем на вкладку Другие настройки.
  4. Найдем параметр Расположение итогов.
  5. Установим значение Нет.

Аналогично стоит проверить параметры Расположение группировок и Расположение реквизитов. Если они установлены в значение "Конец", это также может провоцировать вывод дополнительных строк.

Способ 2. Работа с макетами ресурсов

Часто путаница возникает из-за непонимания разницы между макетом группировки и макетом ресурса. Посмотрим на ситуацию внимательнее: если вы определили макет для группировки, система заменяет им всю строку. Но если при этом в колонках выводятся ресурсы, которые не описаны в макете ресурсов, СКД может попытаться "дорисовать" их стандартным механизмом.

Чтобы избежать дублирования вывода ресурсов, выполним следующие действия:

  1. На закладке Макеты нажмем "Добавить макет ресурса".
  2. Укажем конкретное поле (ресурс) и группировки, для которых этот макет будет применяться.
  3. В табличном документе макета четко определим область только для одной ячейки или строки.

Важно помнить: ресурс — это значение на пересечении колонки и строки. Если вы описываете его в макете, убедитесь, что в настройках группировки в разделе Выбранные поля не стоит флаг Авто, который подтягивает лишние поля из родительских настроек.

Способ 3. Оптимизация структуры группировок

Разберем ситуацию, когда в структуре отчета (дерево на вкладке "Настройки") присутствуют Детальные записи. Если ваш макет назначен на вышестоящую группировку, но под ней остались детальные записи, СКД выведет сначала вашу красивую строку из макета, а затем — список детальных записей (даже если в них нет данных, может выводиться пустая строка).

Выясним причину, изучив структуру: если детальные записи вам не нужны для вывода (так как все данные уже агрегированы в макете группировки), их следует просто удалить. Если же они нужны, для них придется создать отдельный макет или настроить их оформление так, чтобы они не создавали визуального шума.

Способ 4. Проверка границ именованных областей

Иногда корень проблемы кроется не в логике СКД, а в обычном человеческом факторе при рисовании макета. Проанализируем именованные области в табличном документе:

  1. Откроем закладку Макеты.
  2. Выделим область, которая назначена конкретной группировке.
  3. Проверим, не захватывает ли рамка выделения пустую строку снизу.

Даже если строка кажется пустой, но она включена в именованную область макета, СКД послушно выведет её в отчет. Рекомендуется устанавливать высоту таких технических пустых строк в значение "0" или вовсе исключать их из области.

Способ 5. Программное удаление лишней строки

Если штатные настройки СКД по каким-то причинам не помогают (например, при сложной динамической компоновке), можно прибегнуть к программному методу. Этот способ заключается в постобработке готового результата перед его выводом пользователю. Мы можем перехватить момент окончания формирования отчета и удалить последнюю строку из ТабличныйДокумент.

Рассмотрим пример кода, который можно разместить в модуле отчета в процедуре ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Инициализируем схему и настройки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    // Выполняем компоновку
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Программная корректировка: удаляем последнюю строку, если она лишняя
    КоличествоСтрок = Результат.ВысотаТаблицы;
    Если КоличествоСтрок > 0 Тогда
        // Определяем область последней строки
        ОбластьДляУдаления = Результат.Область(КоличествоСтрок, 1, КоличествоСтрок, Результат.ШиринаТаблицы);
        Результат.УдалитьОбласть(ОбластьДляУдаления, ТипСмещенияТабличногоДокумента.ПоВертикали);
    КонецЕсли;
    
КонецПроцедуры

Этот метод считается "костылем", так как он борется с последствиями, а не с причиной. Тем не менее, в условиях жестких дедлайнов он позволяет гарантированно получить нужный визуальный результат. Важно помнить, что при удалении строки нужно быть уверенным, что там не содержатся важные данные расшифровки или итоги, которые все же должны быть видны.

Резюме

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

← На главную