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

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

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

Алгоритмический расчет ширины по содержимому

Для решения задачи нам потребуется перебрать ячейки табличного документа, определить длину текста в каждой из них и назначить полученное значение свойству ШиринаКолонки. Основная идея заключается в том, чтобы найти максимальную ширину строки в рамках одного столбца и применить её ко всей колонке.

Разберем базовый пример реализации. Мы будем использовать вложенные циклы: внешний цикл — по колонкам, внутренний — по строкам:


Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
    ШиринаКолонки = 0;
    Для Стр = 1 По ТабДок.ВысотаТаблицы Цикл
        Область = ТабДок.Область("R" + Формат(Стр, "ЧГ=0") + "C" + Формат(Кол, "ЧГ=0"));
        ШиринаОбласти = Область.Отступ + СтрДлина(СокрЛП(Область.Текст));
        ШиринаКолонки = Макс(ШиринаКолонки, ШиринаОбласти + 3);
        Если ШиринаКолонки > 40 Тогда
            Область.ШиринаКолонки = 40;
        Иначе
            Область.ШиринаКолонки = ШиринаКолонки;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Оптимизация процесса расчета

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

  1. Ограничение выборки: Проверяйте только первые 50–100 строк. Обычно этого достаточно для определения необходимой ширины колонки.
  2. Вынос свойства из цикла: Устанавливайте ширину колонки один раз после прохода по строкам, а не для каждой ячейки отдельно.

Вот оптимизированный вариант кода:


Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
    ШиринаКолонки = 0;
    КоличествоПроверяемыхСтрок = Мин(50, ТабДок.ВысотаТаблицы);
    
    Для Стр = 1 По КоличествоПроверяемыхСтрок Цикл
        Область = ТабДок.Область("R" + Формат(Стр, "ЧГ=0") + "C" + Формат(Кол, "ЧГ=0"));
        ШиринаОбласти = Область.Отступ + СтрДлина(СокрЛП(Область.Текст));
        ШиринаКолонки = Макс(ШиринаКолонки, ШиринаОбласти + 3);
    КонецЦикла;
    
    // Применяем итоговую ширину к колонке
    ОбластьКолонки = ТабДок.Область(1, Кол, ТабДок.ВысотаТаблицы, Кол);
    ОбластьКолонки.ШиринаКолонки = Мин(40, ШиринаКолонки);
КонецЦикла;

Использование штатных свойств оформления

Помимо прямого вычисления ширины, в платформе 1С существуют свойства областей, которые могут упростить задачу или повлиять на поведение колонок:

Важные нюансы реализации

При написании собственного алгоритма помните о следующих особенностях:

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

← На главную