При разработке отчетов и печатных форм в 1С часто возникает задача подбора ширины колонок по содержимому, аналогично двойному клику по границе колонки в Excel. Поскольку платформа не имеет встроенной «волшебной кнопки» для этой операции, нам необходимо реализовать алгоритм, который вычислит оптимальную ширину, опираясь на длину текста в ячейках. Рассмотрим, как это сделать наиболее эффективно.
Для решения задачи нам потребуется перебрать ячейки табличного документа, определить длину текста в каждой из них и назначить полученное значение свойству ШиринаКолонки. Основная идея заключается в том, чтобы найти максимальную ширину строки в рамках одного столбца и применить её ко всей колонке.
Разберем базовый пример реализации. Мы будем использовать вложенные циклы: внешний цикл — по колонкам, внутренний — по строкам:
Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
ШиринаКолонки = 0;
Для Стр = 1 По ТабДок.ВысотаТаблицы Цикл
Область = ТабДок.Область("R" + Формат(Стр, "ЧГ=0") + "C" + Формат(Кол, "ЧГ=0"));
ШиринаОбласти = Область.Отступ + СтрДлина(СокрЛП(Область.Текст));
ШиринаКолонки = Макс(ШиринаКолонки, ШиринаОбласти + 3);
Если ШиринаКолонки > 40 Тогда
Область.ШиринаКолонки = 40;
Иначе
Область.ШиринаКолонки = ШиринаКолонки;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Работа с большим табличным документом может быть ресурсоемкой. Если документ содержит сотни строк, перебор каждой из них может замедлить формирование отчета. Давайте оптимизируем наш алгоритм, ограничив количество проверяемых строк и упростив логику:
Вот оптимизированный вариант кода:
Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
ШиринаКолонки = 0;
КоличествоПроверяемыхСтрок = Мин(50, ТабДок.ВысотаТаблицы);
Для Стр = 1 По КоличествоПроверяемыхСтрок Цикл
Область = ТабДок.Область("R" + Формат(Стр, "ЧГ=0") + "C" + Формат(Кол, "ЧГ=0"));
ШиринаОбласти = Область.Отступ + СтрДлина(СокрЛП(Область.Текст));
ШиринаКолонки = Макс(ШиринаКолонки, ШиринаОбласти + 3);
КонецЦикла;
// Применяем итоговую ширину к колонке
ОбластьКолонки = ТабДок.Область(1, Кол, ТабДок.ВысотаТаблицы, Кол);
ОбластьКолонки.ШиринаКолонки = Мин(40, ШиринаКолонки);
КонецЦикла;
Помимо прямого вычисления ширины, в платформе 1С существуют свойства областей, которые могут упростить задачу или повлиять на поведение колонок:
РастягиватьПоГоризонтали (тип Булево). При установке в Истина ширина колонки пытается подстроиться под размер отображаемого текста. Однако будьте осторожны: иногда оно растягивает колонку избыточно сильно.РежимИзмененияРазмераКолонки. Оно позволяет управлять тем, может ли пользователь менять ширину мышкой. Установка значения РежимИзмененияРазмера.БыстроеИзменение включает стандартное поведение платформы для интерактивного подбора.При написании собственного алгоритма помните о следующих особенностях:
СтрДлина() дает лишь приблизительную оценку. Если точность критична, предусмотрите небольшой «запас» в коэффициенте прибавления к ширине (в коде выше мы прибавляем 3).ШиринаКолонки, убедитесь, что вы работаете с корректно полученным объектом ОбластьЯчеекТабличногоДокумента. В некоторых случаях, при выполнении кода в тонком клиенте или определенных ограничениях платформы, прямое обращение может вызывать исключения — тогда стоит перепроверить, на какой стороне (клиент/сервер) происходит обработка документа.Применяя данные методы, вы сможете добиться профессионального вида печатных форм, обеспечив корректное отображение любых данных, даже если их длина заранее не определена. Для настройки макетов без изменения программного кода можно использовать инструкцию по редактированию печатных форм в типовых конфигурациях.