Как программно привести ширину колонок табличного документа к единому стандарту после СКД?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При использовании Системы Компоновки Данных (СКД) разработчики часто сталкиваются с неприятной особенностью: заголовки, отборы и табличные части отчета могут иметь разную ширину колонок. Это происходит из-за того, что механизм СКД пытается оптимизировать ширину каждой области отдельно. В итоге при выводе в ТабличныйДокумент сетка «разваливается», а при выгрузке в Excel появляются паразитные колонки и объединенные ячейки. Рассмотрим, как можно решить эту задачу программными методами.

Метод постобработки: очистка формата и переопределение ширины

Одним из рабочих способов приведения документа к единому виду является принудительная очистка формата строк и последующая ручная установка ширины каждой колонки. Разберем этот процесс по шагам:

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

Пример реализации алгоритма на встроенном языке 1С:


// Предположим, ТабДок - это сформированный результат СКД
МассивШирин = Новый Массив;
Для НомерКолонки = 1 По МаксимальноеКоличествоКолонок Цикл
    МассивШирин.Добавить(ТабДок.Область(, НомерКолонки, , НомерКолонки).ШиринаКолонки);
КонецЦикла;

ОбластьВсегоДокумента = ТабДок.Область();
ОбластьВсегоДокумента.СоздатьФорматСтрок();

Для Индекс = 0 По МассивШирин.ВКоличество() - 1 Цикл
    ТабДок.Область(, Индекс + 1, , Индекс + 1).ШиринаКолонки = МассивШирин[Индекс];
КонецЦикла;

Нюансы работы с выгрузкой в Excel

Важно понимать, что программное изменение свойств ТабличногоДокумента в 1С не всегда гарантирует идеальный вид в Excel. При выгрузке механизм 1С может создавать дополнительные пустые колонки для того, чтобы сохранить визуальное расположение ячеек, которое было задано СКД. В синтакс-помощнике указано, что формат строк при выгрузке в XLS/XLSX может быть сброшен, однако система постарается компенсировать это объединением ячеек или вставкой вспомогательных столбцов.

Если ваша задача — получить максимально «чистый» файл Excel, метод СоздатьФорматСтрок() может оказаться недостаточно эффективным. В таких ситуациях рекомендуем рассмотреть более радикальный архитектурный подход.

Альтернативный архитектурный подход: раздельное формирование

Если программная очистка формата не дает нужного результата, лучше отказаться от попыток «исправить» уже сформированный документ. Вместо этого используйте раздельное формирование:

Этот метод является наиболее надежным, так как вы изначально задаете «жесткие» рамки для сетки, не позволяя СКД «расширять» или «сужать» колонки в процессе компоновки детальных записей.

Ключевые советы для разработчика

Подводя итог, проанализируем важные моменты:

1. Метод СоздатьФорматСтрок(): эффективно работает внутри 1С для выравнивания, но не всегда идеально транслируется в Excel, так как структура сетки документа остается прежней.

2. Контроль сетки: если в отчете присутствуют сложные объединения ячеек (например, заголовок на 3 колонки, а данные на 2), СКД всегда будет создавать промежуточные колонки. Чтобы избежать этого, проектируйте макеты так, чтобы количество и ширина колонок были кратны во всех секциях.

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

Используя эти методы, вы сможете добиться требуемого визуального отображения отчетов, избежав конфликтов верстки, возникающих при автоматическом формировании таблиц через СКД.

← На главную