Как сохранить разделение страниц и длинные строки при экспорте из 1С 7.7 в Excel

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

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

Причина возникновения проблемы

Прежде всего, разберем техническую сторону вопроса. Внутренний движок печати 1С 7.7 при прямом экспорте в формат Excel 97-2003 (.xls) использует старые библиотеки, которые жестко ограничивают количество символов в одной ячейке. Кроме того, алгоритм преобразования табличного документа .mxl в сетку Excel не переносит метаданные о разрывах страниц, так как в Excel разметка страниц зависит от установленного в системе принтера и параметров печатной области, которые 1С не всегда транслирует корректно.

Решение 1: Программная эмуляция разрывов страниц через расчет высоты

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

Разберем алгоритм действий по шагам:

  1. Определим константу максимальной высоты страницы в единицах 1С (обычно это значение подбирается экспериментально под параметры страницы Excel).
  2. При выводе каждой секции отчета будем использовать метод ВысотаСтроки() для накопления текущего итога высоты.
  3. Перед выводом нового блока (например, нового заявления или раздела) проверим, помещается ли он на текущую страницу.
  4. Если не помещается, добавим пустую строку, высота которой равна остатку до конца страницы.

Пример реализации на языке 1С 7.7:


// Переменная для накопления высоты текущей страницы
ТекВысота = 0;
МаксВысотаСтраницы = 1000; // Условные единицы, подбираются под Excel

Таб.ВывестиСекцию("Заголовок");
ТекВысота = ТекВысота + Таб.ВысотаСтроки(Таб.ВысотаТаблицы());

Пока Выборка.ПолучитьСтроку() = 1 Цикл
    ВысотаСекции = 25; // Примерная высота, если ВысотаСтроки() возвращает 0 для невыведенных строк
    
    Если (ТекВысота + ВысотаСекции) > МаксВысотаСтраницы Тогда
        // Дополняем страницу до конца пустой строкой
        ВысотаДополнения = МаксВысотаСтраницы - ТекВысота;
        Таб.ВывестиСекцию("ПустаяСтрока");
        Таб.Область(Таб.ВысотаТаблицы(), 1).ВысотаСтроки(ВысотаДополнения);
        
        // Сбрасываем счетчик для новой страницы
        ТекВысота = 0;
    КонецЕсли;
    
    Таб.ВывестиСекцию("Данные");
    ТекВысота = ТекВысота + Таб.ВысотаСтроки(Таб.ВысотаТаблицы());
КонецЦикла;

Важный нюанс: метод ВысотаСтроки() может возвращать 0, если для строки в макете установлено значение "Авто". В этом случае необходимо задать фиксированную высоту или использовать среднее значение (например, 17.25 для стандартного шрифта).

Решение 2: Использование внешней компоненты v7Moxel или Yoksel

Для решения проблемы с длинными строками (более 256 символов) и корректного экспорта в .xlsx (Excel 2007+) рекомендуется использовать специализированные расширения. Одной из наиболее актуальных является компонента v7Moxel (или её предшественник Yoksel).

Преимущества использования современных компонент:

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


// Загрузка компоненты (предполагается, что v7Moxel.dll зарегистрирована)
Попытка
    Конвертер = СоздатьОбъект("v7Moxel.Converter");
Исключение
    Сообщить("Компонента v7Moxel не найдена!");
    Возврат;
КонецПопытки;

Таб.Записать("C:\Temp\Report.mxl", "MXL");
Конвертер.Конвертировать("C:\Temp\Report.mxl", "C:\Temp\Report.xlsx");

Решение 3: Конвертация через 1С 8.x с использованием автоматизации

Как заметил автор темы, при простом открытии .mxl в 1С 8 и сохранении в Excel разметка часто «слетает». Это происходит потому, что 1С 8 открывает файл 7.7 в режиме совместимости. Чтобы сохранить разметку, рассмотрим вариант использования программного кода на стороне 1С 8 (если есть возможность запустить сессию 8.x):

  1. Загружаем табличный документ из файла .mxl.
  2. Проходим циклом по строкам. В местах, где в оригинале были разрывы, в 1С 8 необходимо принудительно вызвать метод ВывестиГоризонтальныйРазделительСтраниц().
  3. При сохранении используем метод Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX).

Если же вы используете 1С:Предприятие - Работа с файлами (отдельная бесплатная утилита), убедитесь, что в параметрах печати перед сохранением установлены правильные поля, иначе Excel пересчитает разметку под свои настройки по умолчанию.

Решение 4: Формирование документа в формате XML Spreadsheet 2003

Если на сервере запрещена установка внешних библиотек и нет MS Office, выясним, как сформировать файл, который Excel откроет без потерь. Формат XML Spreadsheet 2003 — это текстовый файл XML, который понимает длинные строки и разрывы страниц.

В структуре такого файла за разрыв страницы отвечает тег <RowBreak> внутри секции <RowBreaks>. Мы можем формировать этот файл напрямую из 1С 7.7, используя объект Текст:


Т = СоздатьОбъект("Текст");
Т.ДобавитьСтроку("<?xml version=""1.0""?>");
Т.ДобавитьСтроку("<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet"">");
// ... формирование стилей и строк данных ...
// Вставка разрыва страницы:
Т.ДобавитьСтроку("<RowBreaks xmlns=""urn:schemas-microsoft-com:office:excel"">");
Т.ДобавитьСтроку("  <RowBreak>");
Т.ДобавитьСтроку("    <Row>50</Row>"); // Разрыв после 50-й строки
Т.ДобавитьСтроку("  </RowBreak>");
Т.ДобавитьСтроку("</RowBreaks>");
Т.Записать("C:\Report.xml");

Практические советы по форматированию

Рассмотрим несколько рекомендаций, которые помогут сделать отчет «красивым» при любом способе экспорта:

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

← На главную