helpf.pro
Регистрация
 0 
Распечатать

Автоматическая установка ширины колонки табличного документа.

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

            Если ШиринаКолонки > МаксимальнаяШиринаКолонки Тогда
                // Ограничим ширину колонки
                ШиринаКолонки = МаксимальнаяШиринаКолонки;
            КонецЕсли;
            Если ШиринаКолонки <> 0 Тогда
                // Ширина колонки рассчитана
                // Определим, сколько ячеек по ширине используется в области для текущей ячейки
                КоличествоКолонок = ОбластьЯчейки.Право - ОбластьЯчейки.Лево;
                // Переберем все ячейки, расположенные в области
                 Для НомерКолонки = 0 По КоличествоКолонок Цикл
                    Если ШириныКолонок.ВГраница() > ТекущаяКолонка - 1 + НомерКолонки Тогда
                        // В массиве ширин колонок уже был элемент для текущей колонки
                        Если ШириныКолонок[ТекущаяКолонка - 1 + НомерКолонки] = Неопределено Тогда
                            // Значение ширины колонки еще не было установлено
                            ШириныКолонок[ТекущаяКолонка - 1 + НомерКолонки] = ШиринаКолонки / (КоличествоКолонок + 1);
                        Иначе
                            // Значение ширины колонки уже было установлено
                             // Вычислим максимум ширины колонки
                             ШириныКолонок[ТекущаяКолонка - 1 + НомерКолонки] = 
                                Макс(ШириныКолонок[ТекущаяКолонка - 1 + НомерКолонки], ШиринаКолонки / (КоличествоКолонок + 1));
                        КонецЕсли;
                    Иначе
                        // В массиве ширин колонок еще не было элемента для данной колонки
                        // Добавим элемент в массив ширин колонок
                        ШириныКолонок.Вставить(ТекущаяКолонка - 1 + НомерКолонки, ШиринаКолонки / (КоличествоКолонок + 1));
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
        КонецЦикла;    // Конец цикла перебора строк
    КонецЦикла;    // Конец цикла перебора колонок
    
    // Переберем все элементы в массиве вычисленных ширин колонок
     Для ТекущаяКолонка = 0 По ШириныКолонок.ВГраница() Цикл
        Если ШириныКолонок[ТекущаяКолонка] <> Неопределено Тогда
            // Ширина колонок установлена
            // Установим ширину области ячеек
            ТабличныйДокумент.Область(, ТекущаяКолонка + 1, НачалоДанных, ТекущаяКолонка + 1).ШиринаКолонки = ШириныКолонок[ТекущаяКолонка] + 1;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры   



Очень полезная штука при условии, что у Вас заранее невозможно определить размер итоговых колонок в печатной форме. А так, надо просто "натравить" процедуру с соответствующими параметрами на нужные ячейки таблицы, и они сами "выровняются" и приобретут необходимый размер (ширину).

Код 1C v 7.x
 //<!-- Патырило С.С. 22-04-2004 : Автоматическая установка ширины колонки
//  Для изменения ширины колонки уже сформированной таблицы, требуется передать
// в качестве параметров переменную с объектом "Таблица", координаты ячейки (группы ячеек)
// для которых нужно установить ширину столбца и ширину столбца в символах.
// При этом не обязательно передавать координаты требуемой ячейки (итоговой),
// (т.е. когда нет возможности или сложно определить позицию итоговой строки)
// достаточно указать ячейку из данного столбца (например первую).
//  Процедура установит ширину столбца выбрав максимальное из значений - 
// текущего размера (установленного в конфигураторе, или программно перед вызовом 
// функции) и переданного в качестве параметра. 
Процедура глУстШиринуЯчейки(Таб, Строка1, Столбец1, Строка2, Столбец2, ДлТекста = 0) Экспорт
	Если ДлТекста = 0 Тогда
	    врДлина	= СтрДлина(СокрЛП(Таб.Область(Строка1, Столбец1, Строка2, Столбец2).Текст));
	Иначе
		врДлина	= ДлТекста;
	КонецЕсли;
	Таб.Область(Строка1, Столбец1, Строка2, Столбец2).ШиринаСтолбца(Макс(Таб.Область(Строка1, Столбец1, Строка2, Столбец2).ШиринаСтолбца(), врДлина));
КонецПроцедуры
// --> Патырило С.С. 22-04-2004
Разместил:   Версии: | 7.x | 8.x |  Дата:   Прочитано: 87219
 0 
Распечатать
Возможно, вас также заинтересует
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
Google maps : вывод точек на карту и режим панорамы 9
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора
Альтернативный перенос остатков между 7.7 и 8.1 (обработкой с ИТС ЗагрузкаДанныхИзТаблДокум) 2
Нашел альтернативный, практически моментальный способ переноса остатков между семерой и восьмерой (так и между восмерками). Не требуется никаких дополнительных усилий, программирования, писания обработок и т.д. и т.п. На ИТС есть обработка под наз
Библиотека кода: Сравнить две таблицы значений 0
//Сравнивает две таблицы значений // Функция ТаблицыЗначенийРавны(ТаблицаЗначений1, ТаблицаЗначений2) Экспорт Если ТипЗнч(ТаблицаЗначений1) Тип("ТаблицаЗначений") ИЛИ ТипЗнч(ТаблицаЗначений2) Тип("ТаблицаЗначений") Тогда Возв
Быстрая выгрузка отчетов в Excel, наложение Фильта и отображение ярлыка 0
Вместо Таб.Показать() используем глобальную функцию - и отчет показывается сразу в Excel в удобоваримом виде - с форматированием колонок по ширине, автофильтром и ярлычками листов Процедура глОткрытьВЭкселе(Таб,ИмяФайла=" " ,НеИзменятьВысотуСтроки=0
Посмотреть все результаты поиска похожих
Комментарии
shoy
18.08.2017 16:52Комментарий: 1
shoy
Код 1C v 8.х
 
    Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
        ШиринаКолонки = 0;
        Для Стр = 1 По ТабДок.ВысотаТаблицы Цикл
            Область = ТабДок.Область("R"+Формат(Стр,"ЧГ=0")+"C"+Формат(Кол,"ЧГ=0"));
            ШиринаОбласти = Область.Отступ+СтрДлина(СокрЛП(Область.Текст));
            ШиринаКолонки = Макс(ШиринаКолонки, ШиринаОбласти + 3);
            Если ШиринаКолонки > 40 Тогда
                Область.ШиринаКолонки = 40;
            Иначе
                Область.ШиринаКолонки = ШиринаКолонки;
            КонецЕсли;
        Конеццикла;
    КонецЦикла;   
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!