Часто при разработке печатных форм и отчетов в 1С мы сталкиваемся с неприятной ситуацией: после того как в макете задана разная ширина столбцов для разных строк (через формат строк), визуальные границы чуть-чуть не совпадают. В самой платформе 1С это может быть незаметно, однако при сохранении табличного документа в формат Microsoft Excel генерируется множество лишних пустых столбцов шириной буквально по миллиметру. Разберем подробно, почему так происходит, и проанализируем доступные способы решения этой проблемы.
Для начала давайте посмотрим на архитектурные различия между табличным документом 1С и листом Excel. В 1С реализован удобный механизм «Формат строк». Он позволяет выделить определенные строки и сдвинуть границы колонок только для них, не затрагивая остальную таблицу. Таким образом, в одном макете 1С может уживаться множество независимых сеток колонок.
Однако архитектура файлов Excel физически не поддерживает разную базовую ширину колонок на одном листе — сетка там всегда сквозная и единая для всего документа. Когда платформа 1С экспортирует наш сложный макет в Excel, она вынуждена эмулировать визуальную структуру. Платформа анализирует все вертикальные границы во всех форматах строк и «нарезает» лист на самые мелкие базовые колонки. Любое, даже микроскопическое, несовпадение границ (на долю миллиметра) заставляет 1С создавать отдельный столбец для компенсации этого смещения, а соседние ячейки объединять. В результате мы получаем «рваную» структуру файла, с которой крайне неудобно работать пользователям.
Рассмотрим один из самых популярных подходов, который разработчики применяют для новых макетов. Суть метода заключается в отказе от использования множества разных форматов строк в пользу единой универсальной сетки с очень мелким шагом.
Преимущества: Макет получается абсолютно ровным. Точность позиционирования элементов доходит до миллиметра, при этом границы всегда совпадают идеально, так как они кратны нашей «миллиметровой» базовой сетке. Лишних столбцов при сохранении в Excel не возникает, потому что шаг сетки жестко контролируется нами.
Недостатки: Как справедливо отмечают специалисты, этот метод идеален для создания новых макетов, но трудно применим для быстрого редактирования типовых существующих (так как они построены по другому принципу). Кроме того, если пользователю потребуется программно обрабатывать полученный Excel-файл (например, загружать из него данные), это будет сопряжено с большими трудностями. Значения в Excel будут находиться в огромных областях объединенных ячеек, которые не позволяют полноценно применять фильтры, строить сводные таблицы и требуют сложного обхода в циклах.
Если метод «миллиметровки» не подходит и нам необходимо работать с разными форматами строк, проанализируем подход с ручной калибровкой размеров. В редакторе макетов 1С, к сожалению, нет встроенного инструмента «прилипания» (snap to grid) границ ячеек к объектам из других строк. Поэтому выравнивать границы придется осознанно.
Используйте простое правило: задавайте ширину столбцов целым числом, кратным 2.
Вместо того чтобы тянуть границы мышью (что неизбежно дает дробные значения ширин и смещения), выделяйте колонки, заходите в их свойства и прописывайте ширину цифрами. Если сумма ширин колонок в одной строке будет строго равна сумме ширин колонок в другой строке (с точностью до второго знака после запятой), вертикальные границы совпадут идеально, и мусорных микро-столбцов при экспорте не появится. Да, это требует использования калькулятора, но гарантирует чистоту конечного файла Excel.
Часто проблема «разъезжающихся» границ и лишних колонок возникает не при рисовании макета, а при программной сборке итогового табличного документа из нескольких разных макетов или разных областей. Например, когда мы присоединяем шапку из одного места, а саму таблицу — из другого.
Чтобы колонки присоединяемой области не ломали основную сетку документа, применим программное решение — метод СоздатьФорматСтрок(). Разберем на примере кода, как изолировать ширину колонок выводимого блока от остального документа:
// Получаем нужные области из макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьТаблица = Макет.ПолучитьОбласть("Таблица");
// Выводим шапку со своим форматом колонок
ТабличныйДокумент.Вывести(ОбластьШапка);
// Чтобы колонки таблицы не смешались с колонками шапки и не исказили друг друга,
// принудительно создаем для выводимой области свой независимый формат строк.
ОбластьТаблица.СоздатьФорматСтрок();
// Теперь выводим таблицу
ТабличныйДокумент.Вывести(ОбластьТаблица);
Данный подход позволяет системе четко понимать, где заканчивается один формат колонок и начинается другой, что снижает вероятность появления артефактов при программном формировании отчетов.
Давайте посмотрим на официальную позицию разработчиков платформы 1С. В документации прямо указано, что сохранение табличного документа, содержащего разные форматы строк, в формат Microsoft Excel заведомо сопряжено с рисками искажения. Полностью избежать трансформации сложного документа под жесткую единую сетку Excel невозможно из-за ограничений самого формата xls/xlsx.
Поэтому, если перед вами стоит задача передать клиенту или руководству сложный, красиво оформленный документ (счет на оплату, договор, сложную спецификацию) с идеальным сохранением верстки, откажитесь от экспорта в Excel. Разработчики 1С рекомендуют использовать для этих целей сохранение в PDF или HTML.
Эти форматы отлично поддерживают независимое позиционирование элементов и абсолютно точно передают то, что вы видите в табличном редакторе 1С. Сохранить документ в PDF программно можно следующим образом:
// Сохраняем сформированный документ в формате PDF для идеального сохранения верстки
ИмяФайла = КаталогВременныхФайлов() + "ИдеальныйДокумент.pdf";
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
В процессе работы с множеством разных форматов строк вы можете столкнуться с еще одним ограничением интерфейса платформы. Редактор табличных документов 1С не позволит вам выделить мышью произвольную прямоугольную область ячеек, если в это выделение попадают строки с разными форматами столбцов. Выделение будет сбрасываться или вести себя непредсказуемо.
Чтобы скопировать, переместить или очистить такой сложный участок, вам необходимо выделять строки целиком. Для этого кликайте левой кнопкой мыши по серым номерам строк на левой панели редактора — так вы сможете захватить блок данных с разными форматами колонок без ошибок.
Мы проанализировали причины несовпадения границ и выяснили, что волшебной кнопки «выровнять по сетке» для разных форматов строк в 1С нет. Однако мы можем эффективно управлять ситуацией:
СоздатьФорматСтрок().