Имя: Пароль:
1C
1С v8
Ширина колонки ресурсов в СКД
0 extrim-style
 
20.12.11
15:17
Я так понял, что ширина колонки ресурса устанавливается в зависимости от разрядности ресурса, допустим 15,2. Формирую отчет, а там у меня допустим 3,2 макс, и бОльшая часть колонки пустая. В результате отчет не умещается на одну страницу. Что делать? Обходить колонку табличного документа перед выводом на печать и смотреть на длину содержимого и уменьшать? Или как тут поступить? Есть варианты как проще сделать колонку по содержимому?
1 sergeante
 
20.12.11
15:18
В условном оформлении в настройках скд есть "Максимальная ширина колонки
"
2 extrim-style
 
20.12.11
15:24
(1) в других отчетах бывают другие цифры. Мне нужно "по содержимому". Ну то есть ширину колонки по максимальному значению в колонке.
3 Axel2009
 
20.12.11
15:25
если что есть реквизит Оформление на закладке набор данных
4 extrim-style
 
20.12.11
15:29
(3) и каким пунктом оттуда мне воспользоваться?
5 Axel2009
 
20.12.11
15:35
в универсально отчете есть процедурка
Процедура РасчетШириныКолонок(ТабличныйДокумент) Экспорт
6 Галахад
 
гуру
20.12.11
15:39
(2) Стабильность рулит. Зачем пользователю отчет который то широкий, то узкий?
7 extrim-style
 
20.12.11
15:45
(6) чтобы влазил в минимальное количество листов, меньше двух, а лучше 1.
8 extrim-style
 
20.12.11
15:57
(5) не нашел такую
9 extrim-style
 
20.12.11
15:58
(5) можешь скопипастить?
10 Axel2009
 
20.12.11
16:27
Процедура РасчетШириныКолонок(ТабличныйДокумент) Экспорт
   
   Перем МаксимальнаяШиринаКолонки;
   Перем КонечнаяСтрока, НачальнаяСтрока, ТекущаяКолонка, ТекущаяСтрока, НачалоДанных;
   Перем ОбластьШапки, ОбластьПодвала;
   Перем ШиринаКолонки, ТекстЯчейки, НомерСтрокиТекста;
   Перем КоличествоУровнейГруппировокСтрок, Отступ;
   Перем ШириныКолонок;
   
   Если НЕ мРассчитыватьШиринуКолонок Тогда
       
       Возврат;
       
   КонецЕсли;
   
   Состояние(НСтр("ru='Выполняется расчет ширины колонок...'"));
   
   // Ограничение максимальной ширины колонки
   МаксимальнаяШиринаКолонки = 50;
   
   // Массив, в который будут помещаться ширины колонок
   ШириныКолонок = Новый Массив;
   
   // Получим количество уровней группировок в отчете для учета автоматического отступа
   КоличествоУровнейГруппировокСтрок = ТабличныйДокумент.КоличествоУровнейГруппировокСтрок();
   
   // Инициализируем начальные строки
   НачальнаяСтрока = 0;
   НачалоДанных = 0;
   
   // Найдем в результирующем документе область шапки таблицы
   ОбластьШапки = ТабличныйДокумент.Области.Найти("ШапкаТаблицы");
   
   Если ТипЗнч(ОбластьШапки) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
       
       // Из шапки таблицы получим начальную строку с которой будем рассчитывать ширины
       НачальнаяСтрока = ОбластьШапки.Верх;
       НачалоДанных = ОбластьШапки.Низ + 1;
       
   Иначе
       
       // Если область шапки таблицы не найдена, найдем область шапки строк
       ОбластьШапки = ТабличныйДокумент.Области.Найти("ШапкаСтрок");
       
       Если ТипЗнч(ОбластьШапки) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
           
           // Из шапки таблицы получим начальную строку с которой будем рассчитывать ширины
           НачальнаяСтрока = ОбластьШапки.Верх;
           НачалоДанных = ОбластьШапки.Низ + 1;
           
       КонецЕсли;
           
   КонецЕсли;
   
   // Получим область подвала отчета и вычислим конечную строку расчета
   ОбластьПодвала = ТабличныйДокумент.Области.Найти("Подвал");
   
   Если ТипЗнч(ОбластьПодвала) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
       
       // Область подвала найдена
       КонечнаяСтрока = ОбластьПодвала.Верх - 1;
       
   Иначе
       
       // Область подвала не найдена
       КонечнаяСтрока = ТабличныйДокумент.ВысотаТаблицы;
       
   КонецЕсли;
   
   // Переберем все колонки отчета
   Для ТекущаяКолонка = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
       
       АвтоОтступ = 0;
       
       // Переберем строки, которые будут использованы для расчета ширин колонок
       Для ТекущаяСтрока = НачальнаяСтрока По КонечнаяСтрока Цикл
           
           ШиринаКолонки = 0;

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

           КонецЦикла;

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

КонецПроцедуры // РасчетШириныКолонок()
11 extrim-style
 
20.12.11
16:27
12 extrim-style
 
20.12.11
16:28
(10) спасибо!
13 extrim-style
 
20.12.11
16:33
Переменные не определены. 81 бух 16.

мРассчитыватьШиринуКолонок мРассчитыватьШиринуКолонкиПоНазванию мМинимальнаяШиринаКолонкиПоказатель

что с этим делать?
14 extrim-style
 
20.12.11
16:37
(11) вроде без ошибок. буду пробовать
15 extrim-style
 
20.12.11
16:42
(11) работает. Axel2009 спасибо!
2 + 2 = 3.9999999999999999999999999999999...