Как настроить шапку отчета в СКД без дублирования полей и избежать обрезки текста?

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

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

Решаем проблему дублирования поля «Организация» в шапке отчета

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

Наименование отчета: Название отчета (полностью текстовое поле)
Организация: Рога и Копыта
Организация:
Дата печати: 26.11.2021

Один из пользователей форума смог решить проблему дублирования поля «Организация», установив для группировки количество записей равным 1. Это простое, но эффективное решение, которое может предотвратить повторный вывод заголовка, если он ассоциирован с группировкой, которая должна быть выведена только один раз.

Для предотвращения дублирования заголовков, таких как «Организация», особенно если они являются частью фиксированного макета, рассмотрим следующие подходы:

  1. Использование параметра вместо группировки для фиксированной части шапки.

    Если поле «Организация» всегда должно выводиться один раз в начале отчета, мы можем оформить его как параметр отчета, а не как элемент группировки. В этом случае значение организации будет установлено один раз и выведено в макете заголовка отчета с помощью типа заполнения ячейки «Параметр» или «Шаблон». Это гарантирует, что поле будет выведено только один раз, так как оно не привязано к динамически повторяющимся данным группировки.

    Для реализации этого подхода выполните следующие шаги:

    1. Создайте в схеме СКД новый параметр, например, ПараметрОрганизация.
    2. Установите значение этого параметра при формировании отчета. Это можно сделать из формы отчета, если она есть, или программно в модуле объекта отчета, например, в обработчике события ПриКомпоновкеРезультата.
    3. В макете заголовка отчета (убедитесь, что тип макета установлен как «ЗаголовокОтчета» или «Шапка») создайте ячейку. Внутри этой ячейки укажите текст, например, «Организация: [ПараметрОрганизация]».
    4. Для ячейки, в которой выводим параметр, установите свойство «Заполнение» как «Параметр» или «Шаблон». Если выбрано «Шаблон», укажите шаблон [ПараметрОрганизация].

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

  2. Тщательная настройка макетов группировок.

    При использовании нескольких макетов (например, для заголовка отчета и для заголовков группировок) очень важно понимать их взаимодействие. Если макет заголовка группировки имеет тип «Заголовок», он будет выводиться каждый раз для соответствующей группировки, что, конечно же, приведет к дублированию. Нам необходимо убедиться, что макет, содержащий «Организацию», привязан к группировке, которая должна выводиться только один раз. Рассмотрим различные варианты:

    1. Использование общей группировки отчета без полей. Мы можем создать одну верхнюю группировку в настройках отчета, которая не будет привязана ни к каким полям данных. Для этой группировки мы можем создать макет заголовка, содержащий всю необходимую информацию, включая «Организацию». Этот макет будет выведен только один раз в начале отчета.
    2. Использование «Вариант использования группировки = Дополнительная информация» и «Макет оформления = Без оформления». Для основной группировки, которая отвечает за вывод повторяющихся данных, можно использовать эти настройки. При этом мы создаем отдельный макет заголовка для самой верхней, не привязанной к данным группировки, явно указывая, что он должен выводиться только один раз. Это позволяет отделить фиксированную шапку от повторяющихся заголовков данных.
    3. Установка свойства «Количество записей» для группировки. Как уже было упомянуто, установка свойства «Количество записей» для группировки в значение «1» (или «Не более 1») может быть эффективным решением, если наш заголовок привязан к группировке, которая по логике должна выводиться лишь однажды, но по умолчанию СКД пытается вывести ее для каждого набора данных. Мы находим соответствующую группировку в настройках СКД (обычно в разделе «Настройки» -> «Группировки»), переходим на вкладку «Макеты», выбираем макет этой группировки и в свойствах макета или самой группировки проверяем параметр, отвечающий за количество выводимых записей. Это гарантирует, что макет, к которому привязана «Организация», будет использован не более одного раза.
  3. Программная доработка при компоновке результата.

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

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

    Рассмотрим пример:

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

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

Устранение обрезки текста в сформированном отчете

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

Например, при предварительном просмотре отчет может не занимать весь лист, а при формировании обрезаться, несмотря на одинаковые параметры страницы в конфигураторе и программе.

Для решения этой проблемы рассмотрим следующие шаги:

  1. Настройки ширины колонок и способ заполнения ячеек в макете.

    Даже если для ячейки установлено свойство «Переносить» (СпособЗаполнения = Переносить), автоматическая ширина колонок может быть настроена таким образом, что текст не помещается полностью. В макете СКД мы можем настроить максимальную и минимальную ширину колонок, используя условное оформление или напрямую в свойствах ячеек макета.

    Мы должны убедиться, что свойство АвтоШирина для соответствующих колонок не мешает полному отображению текста. Иногда СКД может упрямо переносить буквы вниз, увеличивая высоту строки вместо обрезки, даже если указано «Обрезать». В таком случае, важно проверить максимальную высоту строки и убедиться, что она не ограничивает перенос текста.

    Последовательно проверьте следующие моменты:

    1. Проверка свойства «Способ заполнения». Откройте макет отчета в конфигураторе. Выделите ячейки, где происходит обрезка текста. В палитре свойств убедитесь, что для свойства «Способ заполнения» установлено значение «Переносить». Если текст все равно обрезается, возможно, не хватает горизонтального пространства.
    2. Проверка «Минимальная ширина» и «Максимальная ширина». Для колонок, содержащих проблемные ячейки, проверьте эти параметры. Иногда требуется явно задать адекватную максимальную ширину или убедиться, что она не слишком мала. Эти параметры можно найти в свойствах ячеек макета или в настройках условного оформления для конкретных полей.
    3. Настройка Автомасштаба. Попробуйте установить свойство АвтоМасштаб = Истина для всего табличного документа, если отчет формируется программно. Это может помочь адаптировать отчет к размерам страницы, пытаясь уместить содержимое без обрезки.
  2. Отличия в поведении между предварительным просмотром и фактической печатью/формированием.

    Проблема с обрезкой текста часто возникает из-за различий в интерпретации параметров страницы между конфигуратором и рабочим режимом программы, или между предварительным просмотром и печатью. Мы рекомендуем тщательно проверить параметры страницы как в конфигураторе (через меню «Таблица» -> «Параметры страницы»), так и в пользовательском режиме (через меню «Файл» -> «Параметры страницы» или аналогичные настройки окна предпросмотра отчета).

    Убедитесь, что все параметры (размер бумаги, ориентация, поля) совпадают. Несоответствие этих параметров может привести к тому, что отчет, который выглядит хорошо в режиме предпросмотра, будет обрезаться при фактическом выводе. Например, если в конфигураторе установлен альбомный формат, а в программе по умолчанию используется книжный, текст может быть обрезан.

  3. Ошибки платформы 1С.

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

  4. Программный расчет ширины колонок.

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

    Пример упрощенной программной настройки ширины колонок после формирования отчета:

    
    // Пример упрощенной программной настройки ширины колонок после формирования отчета
    Процедура ПослеФормированияОтчета(ДокументРезультат)
    
        Для Каждого Колонка Из ДокументРезультат.Области.Колонки Цикл
            МаксимальнаяШирина = 0;
            // Перебираем строки в текущей колонке для поиска максимальной длины текста
            Для Каждого СтрокаТД Из ДокументРезультат.Области.Строки Цикл
                // Получаем область ячейки по номеру строки и колонки
                ОбластьЯчейки = ДокументРезультат.Области.ПолучитьОбласть(СтрокаТД.Номер, Колонка.Номер);
                
                // Проверяем, содержит ли ячейка текст
                Если ОбластьЯчейки.Текст <> Неопределено И ТипЗнч(ОбластьЯчейки.Текст) = Тип("Строка") Тогда
                    ТекущаяШирина = СтрДлина(ОбластьЯчейки.Текст);
                    Если ТекущаяШирина > МаксимальнаяШирина Тогда
                        МаксимальнаяШирина = ТекущаяШирина;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
            
            Если МаксимальнаяШирина > 0 Тогда
                // Устанавливаем ширину колонки, возможно с небольшим запасом,
                // чтобы текст гарантированно поместился.
                // Ширина в 1С ТабличномДокументе измеряется в символах,
                // но на практике требуется небольшой коэффициент для лучшего отображения.
                ДокументРезультат.Области.Колонки[Колонка.Номер].Ширина = МаксимальнаяШирина + 2; 
            КонецЕсли;
        КонецЦикла;
    
    КонецПроцедуры
    

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

  5. Использование универсальных отчетов.

    Некоторые разработчики отмечают, что при использовании универсальных отчетов подобные проблемы с обрезкой текста возникают реже, возможно, из-за их более гибкой внутренней реализации вывода. Универсальные отчеты, поставляемые с типовыми конфигурациями, часто имеют более сложные и проверенные алгоритмы адаптации макета к содержимому. Если мы столкнулись с непреодолимыми трудностями в своем кастомном отчете, стоит рассмотреть возможность адаптации его функционала к универсальным механизмам, используя их как основу или вдохновение для собственного решения.

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

← На главную