Перенос сложных многостраничных отчетов из «семерки» (1С:Предприятие 7.7) в формат Excel — задача, сопряженная с рядом технических ограничений платформы. Основные проблемы заключаются в обрезании строк длиннее 256 символов при сохранении в формате .xls и потере визуального разделения на страницы. Рассмотрим подробно, как обойти эти ограничения, сохранив структуру документа и корректное форматирование.
Прежде всего, разберем техническую сторону вопроса. Внутренний движок печати 1С 7.7 при прямом экспорте в формат Excel 97-2003 (.xls) использует старые библиотеки, которые жестко ограничивают количество символов в одной ячейке. Кроме того, алгоритм преобразования табличного документа .mxl в сетку Excel не переносит метаданные о разрывах страниц, так как в Excel разметка страниц зависит от установленного в системе принтера и параметров печатной области, которые 1С не всегда транслирует корректно.
Если нам необходимо добиться гарантированного совпадения страниц в Excel без использования внешних компонент, проанализируем метод программного «добивания» страницы до нужной высоты. Суть заключается в том, чтобы вычислить суммарную высоту выведенных строк и вставить пустую строку-разделитель с переменной высотой, которая перекинет следующий блок данных на новый лист.
Разберем алгоритм действий по шагам:
ВысотаСтроки() для накопления текущего итога высоты.Пример реализации на языке 1С 7.7:
// Переменная для накопления высоты текущей страницы
ТекВысота = 0;
МаксВысотаСтраницы = 1000; // Условные единицы, подбираются под Excel
Таб.ВывестиСекцию("Заголовок");
ТекВысота = ТекВысота + Таб.ВысотаСтроки(Таб.ВысотаТаблицы());
Пока Выборка.ПолучитьСтроку() = 1 Цикл
ВысотаСекции = 25; // Примерная высота, если ВысотаСтроки() возвращает 0 для невыведенных строк
Если (ТекВысота + ВысотаСекции) > МаксВысотаСтраницы Тогда
// Дополняем страницу до конца пустой строкой
ВысотаДополнения = МаксВысотаСтраницы - ТекВысота;
Таб.ВывестиСекцию("ПустаяСтрока");
Таб.Область(Таб.ВысотаТаблицы(), 1).ВысотаСтроки(ВысотаДополнения);
// Сбрасываем счетчик для новой страницы
ТекВысота = 0;
КонецЕсли;
Таб.ВывестиСекцию("Данные");
ТекВысота = ТекВысота + Таб.ВысотаСтроки(Таб.ВысотаТаблицы());
КонецЦикла;
Важный нюанс: метод ВысотаСтроки() может возвращать 0, если для строки в макете установлено значение "Авто". В этом случае необходимо задать фиксированную высоту или использовать среднее значение (например, 17.25 для стандартного шрифта).
Для решения проблемы с длинными строками (более 256 символов) и корректного экспорта в .xlsx (Excel 2007+) рекомендуется использовать специализированные расширения. Одной из наиболее актуальных является компонента v7Moxel (или её предшественник Yoksel).
Преимущества использования современных компонент:
.xlsx, что снимает ограничение на длину строки.РазделительСтраниц из табличного документа 1С и конвертировать их в соответствующие теги rowBreaks внутри структуры Excel.Проанализируем пример использования такой компоненты:
// Загрузка компоненты (предполагается, что v7Moxel.dll зарегистрирована)
Попытка
Конвертер = СоздатьОбъект("v7Moxel.Converter");
Исключение
Сообщить("Компонента v7Moxel не найдена!");
Возврат;
КонецПопытки;
Таб.Записать("C:\Temp\Report.mxl", "MXL");
Конвертер.Конвертировать("C:\Temp\Report.mxl", "C:\Temp\Report.xlsx");
Как заметил автор темы, при простом открытии .mxl в 1С 8 и сохранении в Excel разметка часто «слетает». Это происходит потому, что 1С 8 открывает файл 7.7 в режиме совместимости. Чтобы сохранить разметку, рассмотрим вариант использования программного кода на стороне 1С 8 (если есть возможность запустить сессию 8.x):
.mxl.ВывестиГоризонтальныйРазделительСтраниц().Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX).Если же вы используете 1С:Предприятие - Работа с файлами (отдельная бесплатная утилита), убедитесь, что в параметрах печати перед сохранением установлены правильные поля, иначе Excel пересчитает разметку под свои настройки по умолчанию.
Если на сервере запрещена установка внешних библиотек и нет 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");
Рассмотрим несколько рекомендаций, которые помогут сделать отчет «красивым» при любом способе экспорта:
Таблица в 1С. При экспорте в Excel эти параметры часто становятся критичными для сохранения разметки..xls, разбивайте длинный текст на несколько ячеек или строк программно, так как ограничение в 256 символов невозможно обойти в рамках старого формата 1С 7.7.Подводя итог, проанализируем ситуацию: для разовых задач лучше всего подходит метод с программным дополнением высоты строк. Для постоянной работы с большими и сложными документами наиболее надежным и современным способом является применение компоненты v7Moxel, которая корректно транслирует все особенности табличного документа 1С в современный формат .xlsx.