Как программно установить высоту строки в печатной форме 1С 7.7 для корректного экспорта в Excel?

Программист 1С v7.7
← На главную

Разберем распространенную проблему платформы 1С:Предприятие 7.7: при формировании печатной формы длинные названия (например, номенклатуры) отображаются корректно благодаря свойству "Переносить". Однако при сохранении этой таблицы в формат Excel (.xls) текст в объединенных ячейках часто обрезается, и видна только первая строка. Это происходит потому, что Excel не умеет автоматически подбирать высоту для объединенных ячеек, если она не задана жестко в исходном файле.

В этой статье мы проанализируем, почему стандартные методы не всегда работают, и рассмотрим пошаговое решение задачи программной установки высоты строки.

Анализ проблемы: Макет против Выведенной таблицы

Рассмотрим типичную ошибку начинающих разработчиков. Попытка установить высоту строки непосредственно в секции макета до её вывода не принесет результата. Выясним причину: метод ПолучитьСекцию() возвращает объект исходного шаблона. Любые изменения в нем носят интерактивный характер и редко отражаются на итоговой таблице так, как нам нужно.

Правильный алгоритм действий должен быть следующим:

  1. Выводим секцию в результирующую таблицу.
  2. Получаем область уже выведенной строки.
  3. Устанавливаем высоту для этой конкретной области.

Решение №1: Прямой расчет высоты по количеству символов

Проанализируем ситуацию, когда нам нужно рассчитать высоту строки в зависимости от длины текста. Поскольку в 1С 7.7 нет встроенного метода автоопределения высоты для выведенных данных, мы создадим собственную функцию-помощник.

Рассмотрим пример кода, который вычисляет необходимую высоту, исходя из среднего количества символов в одной строке (в данном примере — 50 символов):


Функция РасчитатьКоличествоПереносов(ТекстНаим)
    ВысотаОднСтроки = 13; // Базовая высота одной строки в пунктах
    длСтр = СтрДлина(ТекстНаим);
    КолвоСтрок = длСтр / 50; // Предполагаем, что в ширину ячейки входит 50 символов
    
    Целых = КолвоСтрок - Цел(КолвоСтрок);
    Если Целых > 0 Тогда
        КолвоСтрок = Цел(КолвоСтрок) + 1;
    КонецЕсли;
    
    Возврат КолвоСтрок * ВысотаОднСтроки;
КонецФункции

Теперь применим эту функцию при выводе печатной формы. Нам понадобятся методы ВысотаТаблицы() и Область():


// Выводим секцию с данными
Таб.ВывестиСекцию("Строка");

// Определяем номер последней выведенной строки
НомерТекущейСтроки = Таб.ВысотаТаблицы();

// Получаем область всей строки
ТабОбл = Таб.Область(НомерТекущейСтроки, , НомерТекущейСтроки, );

// Рассчитываем и устанавливаем высоту
НужнаяВысота = РасчитатьКоличествоПереносов(СокрЛП(ТекстНаименования));
ТабОбл.ВысотаСтроки(НужнаяВысота);

Важный нюанс: метод Таб.Область(НомерСтроки) позволяет обратиться к строке целиком. Если мы установим ВысотаСтроки() для этой области, Excel корректно воспримет параметр при открытии файла.

Решение №2: Использование метода "Скрытого дублера"

Если расчет по количеству символов кажется неточным (например, из-за использования пропорциональных шрифтов типа Arial, где буква "Ш" шире буквы "I"), рассмотрим более надежный "хитрый" способ. Он позволяет использовать встроенный механизм автовысоты 1С, который Excel обычно игнорирует для объединенных ячеек.

Посмотрим, как это реализовать:

  1. В макете печатной формы создаем дополнительную колонку в самом конце (за пределами области печати).
  2. В этой колонке ячейка не должна быть объединенной.
  3. Ширину этой одиночной ячейки устанавливаем равной суммарной ширине всех объединенных ячеек основной части строки.
  4. В свойствах этой ячейки включаем "Автовысота" и "Переносить".
  5. При выводе секции помещаем в эту скрытую ячейку тот же самый текст.

В результате 1С сама растянет строку по этой одиночной ячейке. Поскольку ячейка не объединена, Excel при экспорте подхватит установленную высоту строки и отобразит данные корректно.

Решение №3: Поиск текста в выведенной области

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


// Предположим, секция уже выведена
Таб.ВывестиСекцию("Раздел3");

// Ищем конкретный текст в последней выведенной секции
ОбластьПоиска = Таб.Область(Таб.ВысотаТаблицы(), 1, Таб.ВысотаТаблицы(), Таб.ШиринаТаблицы());
НайденнаяОбласть = Таб.НайтиТекст("Итого к оплате:", ОбластьПоиска);

Если ПустоеЗначение(НайденнаяОбласть) = 0 Тогда
    // Если текст найден, корректируем высоту всей строки
    Таб.Область(НайденнаяОбласть.Верх, , НайденнаяОбласть.Верх, ).ВысотаСтроки(25);
КонецЕсли;

Рекомендации по работе со шрифтами

При ручном расчете высоты всегда учитывайте следующие моменты:

Используя данные методы, мы обеспечиваем качественное отображение печатных форм не только внутри 1С:Предприятия 7.7, но и в сторонних редакторах таблиц после экспорта.

← На главную