Ширина колонки в СКД по содержимому
Решение найдено:
В модуле объекта внешнего отчета добавила процедуру, выделенную жирным шрифтом:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
,
,
,
ПроцессорВывода.НачатьВывод();
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
РасчетШириныКолонок(ДокументРезультат);
ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры
Сама процедура:
Процедура РасчетШириныКолонок(ТабличныйДокумент)
Перем МаксимальноеКоличествоСтрок, МаксимальнаяШиринаКолонки;
Перем КонечнаяСтрока, НачальнаяСтрока, ТекущаяКолонка, ТекущаяСтрока, НачалоДанных;
Перем ОбластьШапки, ОбластьПодвала;
Перем ШиринаКолонки, ТекстЯчейки, НомерСтрокиТекста;
Перем КоличествоУровнейГруппировокСтрок, Отступ;
Перем ШириныКолонок;
// Максимальное количество строк отчета, которые будут использованы для расчета ширин колонок
МаксимальноеКоличествоСтрок = ТабличныйДокумент.ВысотаТаблицы;
// Ограничение максимальной ширины колонки
МаксимальнаяШиринаКолонки = 30;
// Массив, в который будут помещаться ширины колонок
ШириныКолонок = Новый Массив;
// Получим количество уровней группировок в отчете для учета автоматического отступа
КоличествоУровнейГруппировокСтрок = ТабличныйДокумент.КоличествоУровнейГруппировокСтрок();
// Инициализируем начальные строки
НачальнаяСтрока = 9; //У МЕНЯ РАСЧЕТ ШИРИНЫ КОЛОНОК НАЧИНАЕТСЯ СО СТРОКИ ВЫВОДИМЫХ ДАННЫХ (ПОД ШАПКОЙ ТАБЛИЦЫ)
НачалоДанных = 9;
КонечнаяСтрока = НачальнаяСтрока + МаксимальноеКоличествоСтрок;
// Ограничим конечную строку
КонечнаяСтрока = Мин(КонечнаяСтрока, ТабличныйДокумент.ВысотаТаблицы);
// Переберем все колонки отчета
Для ТекущаяКолонка = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
// Переберем строки, которые будут использованы для расчета ширин колонок
Для ТекущаяСтрока = НачальнаяСтрока По КонечнаяСтрока Цикл
// Получим область текущей ячейки
ОбластьЯчейки = ТабличныйДокумент.Область(ТекущаяСтрока, ТекущаяКолонка);
Если ОбластьЯчейки.Лево <> ТекущаяКолонка Или ОбластьЯчейки.Верх <> ТекущаяСтрока Тогда
// Данная ячейка принадлежит объединенным ячейкам и не является начальной ячейкой
Продолжить;
Если КоличествоУровнейГруппировокСтрок > 0 И ТекущаяСтрока = НачалоДанных Тогда
// Для первой строки с данными получим значение автоотступа
АвтоОтступ = ОбластьЯчейки.АвтоОтступ;
// Получим текст ячейки
ТекстЯчейки = ОбластьЯчейки.Текст;
// Для каждой строки из текста ячейки рассчитаем количество символов в строке
Для НомерСтрокиТекста = 1 По СтрЧислоСтрок(ТекстЯчейки) Цикл
ШиринаТекстаЯчейки = СтрДлина(СтрПолучитьСтроку(СокрЛП(ТекстЯчейки), НомерСтрокиТекста));
// Если используется автоотступ, то прибавим к ширине ячейки его величину
Если АвтоОтступ <> Неопределено И АвтоОтступ > 0 Тогда
ШиринаТекстаЯчейки = ШиринаТекстаЯчейки + КоличествоУровнейГруппировокСтрок * АвтоОтступ;
ШиринаКолонки = Макс(ШиринаКолонки, ШиринаТекстаЯчейки);
Если ШиринаКолонки > МаксимальнаяШиринаКолонки Тогда
// Ограничим ширину колонки
ШиринаКолонки = МаксимальнаяШиринаКолонки;
КонецЕсли;
Если ШиринаКолонки <> 0 Тогда
// Ширина колонки рассчитана
// Переберем все ячейки, расположенные в области
Для НомерКолонки = 0 По КоличествоКолонок Цикл
// В массиве ширин колонок уже был элемент для текущей колонки
КонецЦикла; // Конец цикла перебора строк
КонецЦикла; // Конец цикла перебора колонок
// Переберем все элементы в массиве вычисленных ширин колонок
Для ТекущаяКолонка = 0 По ШириныКолонок.ВГраница() Цикл
Если ШириныКолонок[ТекущаяКолонка] <> Неопределено Тогда
// Ширина колонок установлена
// Установим ширину области ячеек
ТабличныйДокумент.Область(, ТекущаяКолонка + 1, НачалоДанных, ТекущаяКолонка + 1).ШиринаКолонки = ШириныКолонок[ТекущаяКолонка] + 1;
Источник