При разработке и доработке печатных форм и отчетов в 1С разработчики часто сталкиваются с неприятным поведением: на экране в режиме 1С:Предприятие табличный документ выглядит аккуратно и содержит фиксированное количество столбцов, однако после сохранения в формат Excel (XLS, XLSX) или открытия в табличных процессорах (MS Excel, OpenOffice Calc) колонки начинают дробиться на две, три и более мелких частей. В результате лист превращается в сетку из множества мелких ячеек, объединенных между собой, что делает дальнейшую работу с таблицей крайне неудобной.
Разберем детально физику этого процесса, выясним причину такого поведения платформы и рассмотрим способы исправления макетов и программного кода.
Проанализируем ключевое архитектурное различие между табличным документом 1С (ТабличныйДокумент) и листом Excel:
Когда платформа 1С выполняет конвертацию табличного документа в формат Excel, она проецирует абсолютно все вертикальные границы колонок со всех строк документа на одну общую шкалу. Если хотя бы в одной строке (в шапке, подвале или даже пустой скрытой секции) вертикальная граница смещена относительно основной таблицы хотя бы на один пиксель, Excel вынужден создать дополнительный столбец для сохранения визуального оформления, а остальные ячейки объединить (Merge Cells).
Разберем по шагам, как локализовать строки, нарушающие единую сетку таблицы:
Шапка, Строка, Итоги, Подвал, Подписи. Часто бывает так, что разработчик настраивает идеальные ширины колонок в области данных, но оставляет область подвала со стандартной или произвольной шириной колонок.Чтобы результирующий файл в Excel содержал ровно столько же колонок, сколько и визуальный отчет, необходимо привести все секции макета к единому формату строк:
Иногда сам макет выглядит чистым, но деление колонок все равно происходит при выводе отчета из встроенного языка. Рассмотрим, как это происходит.
В типовых конфигурациях (например, УПП, Комплексная автоматизация или ERP) вывод подписей и колонтитулов часто выполняется отдельными процедурами общих модулей. Посмотрим на типовой вызов:
БухгалтерскиеОтчеты.СформироватьИВывестиПодписиОтчета(ЭтотОбъект, ДокументРезультат, ВысотаЗаголовка, ПоказыватьПодписи);
Если в типовой процедуре к результирующему документу ДокументРезультат присоединяется секция с подписями, которая внутри себя содержит собственный формат колонок (или программно вызывается метод СоздатьФорматСтрок()), результирующий документ получает разорванную сетку. Даже если флаг вывода подписей отключен, но сама область неявно выводится или форматирует строки документа, это испортит экспорт в Excel.
Для устранения проблемы проанализируем код формирования отчета:
СоздатьФорматСтрок() на объекте ТабличныйДокумент:
// Если требуется задать ширину колонок для всего документа:
ДокументРезультат.Область("C1").ШиринаКолонки = 25;
ДокументРезультат.Область("C2").ШиринаКолонки = 15;
// Избегаем создания отдельного формата для подвала:
// Не рекомендуется: ДокументРезультат.Область("R10:R15").СоздатьФорматСтрок();
Если отчет предназначен исключительно для дальнейшей математической или машинной обработки пользователем в Excel, и сложная визуальная верстка (шапки, логотипы, рамки) не требуется, рассмотрим следующие альтернативы:
Excel.Application позволяет построчно заполнить лист без дробления ячеек.