Разберем распространенную проблему платформы 1С:Предприятие 7.7: при формировании печатной формы длинные названия (например, номенклатуры) отображаются корректно благодаря свойству "Переносить". Однако при сохранении этой таблицы в формат Excel (.xls) текст в объединенных ячейках часто обрезается, и видна только первая строка. Это происходит потому, что Excel не умеет автоматически подбирать высоту для объединенных ячеек, если она не задана жестко в исходном файле.
В этой статье мы проанализируем, почему стандартные методы не всегда работают, и рассмотрим пошаговое решение задачи программной установки высоты строки.
Рассмотрим типичную ошибку начинающих разработчиков. Попытка установить высоту строки непосредственно в секции макета до её вывода не принесет результата. Выясним причину: метод ПолучитьСекцию() возвращает объект исходного шаблона. Любые изменения в нем носят интерактивный характер и редко отражаются на итоговой таблице так, как нам нужно.
Правильный алгоритм действий должен быть следующим:
Проанализируем ситуацию, когда нам нужно рассчитать высоту строки в зависимости от длины текста. Поскольку в 1С 7.7 нет встроенного метода автоопределения высоты для выведенных данных, мы создадим собственную функцию-помощник.
Рассмотрим пример кода, который вычисляет необходимую высоту, исходя из среднего количества символов в одной строке (в данном примере — 50 символов):
Функция РасчитатьКоличествоПереносов(ТекстНаим)
ВысотаОднСтроки = 13; // Базовая высота одной строки в пунктах
длСтр = СтрДлина(ТекстНаим);
КолвоСтрок = длСтр / 50; // Предполагаем, что в ширину ячейки входит 50 символов
Целых = КолвоСтрок - Цел(КолвоСтрок);
Если Целых > 0 Тогда
КолвоСтрок = Цел(КолвоСтрок) + 1;
КонецЕсли;
Возврат КолвоСтрок * ВысотаОднСтроки;
КонецФункции
Теперь применим эту функцию при выводе печатной формы. Нам понадобятся методы ВысотаТаблицы() и Область():
// Выводим секцию с данными
Таб.ВывестиСекцию("Строка");
// Определяем номер последней выведенной строки
НомерТекущейСтроки = Таб.ВысотаТаблицы();
// Получаем область всей строки
ТабОбл = Таб.Область(НомерТекущейСтроки, , НомерТекущейСтроки, );
// Рассчитываем и устанавливаем высоту
НужнаяВысота = РасчитатьКоличествоПереносов(СокрЛП(ТекстНаименования));
ТабОбл.ВысотаСтроки(НужнаяВысота);
Важный нюанс: метод Таб.Область(НомерСтроки) позволяет обратиться к строке целиком. Если мы установим ВысотаСтроки() для этой области, Excel корректно воспримет параметр при открытии файла.
Если расчет по количеству символов кажется неточным (например, из-за использования пропорциональных шрифтов типа Arial, где буква "Ш" шире буквы "I"), рассмотрим более надежный "хитрый" способ. Он позволяет использовать встроенный механизм автовысоты 1С, который Excel обычно игнорирует для объединенных ячеек.
Посмотрим, как это реализовать:
В результате 1С сама растянет строку по этой одиночной ячейке. Поскольку ячейка не объединена, Excel при экспорте подхватит установленную высоту строки и отобразит данные корректно.
Иногда мы не знаем заранее, в какой строке окажется нужный текст (например, при сложной структуре отчета). В этом случае проанализируем ситуацию с использованием метода НайтиТекст(). Это позволит нам динамически находить ячейки и корректировать их параметры.
// Предположим, секция уже выведена
Таб.ВывестиСекцию("Раздел3");
// Ищем конкретный текст в последней выведенной секции
ОбластьПоиска = Таб.Область(Таб.ВысотаТаблицы(), 1, Таб.ВысотаТаблицы(), Таб.ШиринаТаблицы());
НайденнаяОбласть = Таб.НайтиТекст("Итого к оплате:", ОбластьПоиска);
Если ПустоеЗначение(НайденнаяОбласть) = 0 Тогда
// Если текст найден, корректируем высоту всей строки
Таб.Область(НайденнаяОбласть.Верх, , НайденнаяОбласть.Верх, ).ВысотаСтроки(25);
КонецЕсли;
При ручном расчете высоты всегда учитывайте следующие моменты:
ВысотаСтр + 3), чтобы нижние элементы букв (такие как "у", "д", "р") не обрезались при печати через PDF-принтеры.Courier New), где каждый символ имеет фиксированную ширину.Используя данные методы, мы обеспечиваем качественное отображение печатных форм не только внутри 1С:Предприятия 7.7, но и в сторонних редакторах таблиц после экспорта.