Автоматическая ширина колонок в СКД

20.04.18

Разработка - СКД

Случай, когда настроек по максимальной и минимальной ширине колонок в условном оформлении недостаточно.

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

Я делала на примере внешнего отчета и в модуле объекта добавила всего лишь две процедуры:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
СтандартнаяОбработка = Ложь;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;   
МакетКомпоновки = КомпоновщикМакета.Выполнить(ЭтотОбъект.СхемаКомпоновкиДанных, ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ВнешниеНаборыДанных = Новый Структура;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина); // вот тут происходит "соединение" вашей таблицы с СКД грубо говоря строится отчет в соответствии с макетом компановки
ДокументРезультат.АвтоМасштаб = Истина;


ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

ПроцессорВывода.НачатьВывод();
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
РасчетШириныКолонок(ДокументРезультат);//РАСЧЕТ ШИРИНЫ КОЛОНОК
ПроцессорВывода.ЗакончитьВывод();
   
КонецПроцедуры

 

А вот процедура для расчета ширины колонок, которая перебирает в цикле каждой столбец построчно и выявляет максимальное количество символов в строке каждой колонки которому и будет равна ширина колонки:


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

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

			КонецЦикла;

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

КонецПроцедуры

 

На картинке видно, что пустое место в колонках, выделенное красной линией, исчезло:

Вступайте в нашу телеграмм-группу Инфостарт

исправила ошибку на скриншоте

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    258559    1428    421    

1165

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    6805    353    shapa_pro    27    

69

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    19717    ovetgana    112    

113

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    11374    krasnoshchekovpavel    7    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    10903    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    16778    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    14463    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    11387    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kiruha 389 20.04.18 10:20 Сейчас в теме
А как в плане производительности на больших объемах ?
Может есть способ не все строки обходить ?
2. Margo462 533 20.04.18 10:43 Сейчас в теме
(1) у меня было больше 3000 строк, задержка секунд 5-10 была, точно не могу сказать;
Да, можно не все строки обходить, там в цикле вместо "КонечнаяСтрока" вставить количество строк которое нужно
32. skyadmin 80 04.08.24 12:43 Сейчас в теме
(2) Можно обходить только итоги, кажется этого будет достаточно
4. sergathome 4 20.04.18 12:02 Сейчас в теме
Все решения, связанные с использованием ручной компоновки, страдают одним - синхронное исполнение. Это убивает практически весь кайф...
8. rozer 315 21.04.18 11:20 Сейчас в теме
(4) в конфах на бсп это решается на раз- просто после фонового поймать табдокумент...
6. unichkin 1623 20.04.18 23:28 Сейчас в теме
Можно не ставить стандартную обработку в Ложь, а просто рассчитать ширины в уже сформированном документе.. По-моему задача раз 100 решалась уже.
9. Margo462 533 21.04.18 14:20 Сейчас в теме
(6) у меня в этом примере еще внешний набор был, оставила процедуру как есть только без внешнего набора, а стандартную обработку ложь оставила)) В интернете я долго искала решение, эта процедура вобще для построителя отчета используется, а примеров для скд я не нашла, если есть другие варианты, прошу выложить
16. Margo462 533 22.04.18 16:58 Сейчас в теме
(6) Без стандартной обработки Ложь, не работает, надо ставить ложь
10. unichkin 1623 21.04.18 17:42 Сейчас в теме
Вот здесь, например https://infostart.ru/public/84642/. Заметил фразу "Пример для СКД" - а при чем здесь СКД?) Есть таб. док, считаем длины строк по ячейкам, берем максимальную, устанавливаем от нее ширину колонки. Откуда там этот ТабДок взялся - с СКД, универсального отчета, или просто произвольный - какая разница?
ixijixi; triviumfan; +2 Ответить
11. triviumfan 101 21.04.18 23:35 Сейчас в теме
(10) женская логика - не поспоришь :)
12. unichkin 1623 21.04.18 23:47 Сейчас в теме
(11) Да ну, причем здесь "женская логика".. Смешение контекстов частая проблема - даже у опытнейших специалистов бывает "каша в голове". Да и возможно человек просто неверно выразился, я на всякий случай внес ясность.
Forest_Owl; eeeio; +2 Ответить
15. Margo462 533 22.04.18 16:51 Сейчас в теме
(12) я еще курсы скд не проходила, поэтому учусь методом проб и ошибок
14. Margo462 533 22.04.18 16:50 Сейчас в теме
(10) статья бесплатная, в отличие от той, которую вы привели по ссылке, я конкретно хотела показать для скд, в какое место (в процедуре ПриКомпоновкеРезультата) надо добавить процедуру расчета колонок, чтобы все работало и процедуру расчета я взяла с конфы на сайте итс (https://its.1c.ru/db/metod8dev#content:2253:hdoc), другие источники я просто не искала, меня и такой вариант устраивает) подобных примеров я не видела поэтому выложила как вариант.
Forest_Owl; +1 Ответить
20. kiruha 389 23.04.18 10:09 Сейчас в теме
(10)
по вашей ссылке относящееся к этой теме :
За счет чего достигается ускорение?
При расчете ширины колонки отчета:
- пропускаются пустые ячейки не влияющие на ширину колонки;
- обрабатываются ячейки только из первых 100 строк отчета;


" обрабатываются ячейки только из первых 100 строк отчета" - хорошая идея , но можно улучшить - случайные 100 строк отчета из диапазона 1-КонечнаяСтрока
Статистически более достоверно
22. top_1c 4042 24.04.18 04:53 Сейчас в теме
(10)
Заметил фразу "Пример для СКД" - а при чем здесь СКД?)

О это так же режет слух как многие употреблятсвуют словом "ERP" словно это отдельная платформа, типа "Пример разработки в ЕРП".
23. Margo462 533 24.04.18 07:51 Сейчас в теме
(22) так подскажите как это назвать пока еще кому-нибудь слух не порезало))))
17. unichkin 1623 22.04.18 17:45 Сейчас в теме
Да, при стандартной обработке = Ложь документ пустой в ПриКомпоновке.. Странно, почему-то мне казалось он должен быть там заполнен. Значит для корректного использования в фоновых заданиях надо ковырять варианты отчетов на ИТС. ТС - спасибо, обновил знания :)
Только если приводите статью с ИТС, то ссылайтесь сразу на первоисточник. Специально проверил ту ссылку, которую дал - там тот-же самый код.
Я обычно такое как-то на автомате решал, в другой раз попробую эту функцию заюзать.
18. Margo462 533 22.04.18 18:51 Сейчас в теме
(17) я еще чуть подредактировала процедуру расчета ширины из примера, лишнее убрала про области макета, как-то так)
21. top_1c 4042 24.04.18 04:41 Сейчас в теме
Интересно, молодец!

Но почему у колонки "номенклатура" столько пустого места осталось? И у колонки "Поле1" имеется немного лишнего... Идеальные перфекционистские зазоры не получиться выполнить данной функцией?
24. Margo462 533 24.04.18 11:55 Сейчас в теме
(21) надо смотреть почему остается место)
25. Vasvas05 27 24.04.18 19:22 Сейчас в теме
26. dtripleh 25.04.18 18:48 Сейчас в теме
А не проще ли нарисовать макет и установить автомакс. ширину колонки?
27. Margo462 533 25.04.18 19:24 Сейчас в теме
(26) когда много данных запаришься рисовать, еще если просят постоянно что-то добавить) да и зачем рисовать если есть скд
28. Scarlett_ 04.06.18 07:11 Сейчас в теме
29. maxx 1001 11.03.20 15:06 Сейчас в теме
Как только использующий нестандартные размеры шрифтов, эта процедура не поможет.
30. request4t 15.02.21 18:50 Сейчас в теме
здравствуйте. вставил процедуры в модуль. ничего не изменилось. в чем может быть проблема?
user2145537; Angealtor; JohnConnor; +3 Ответить
31. lolovlol1 07.06.24 16:05 Сейчас в теме
(30) в скд во вкладке настройки, другие настройки "Выводить параметры" поставить Не выводить
если заголовок и отборы выводятся их тоже отключить

либо в процедуре РасчетШириныКолонок присвоить своё значение переменной НачальнаяСтрока
не очень универсально в целом, но автору спасибо)
33. wakc 12.01.26 17:36 Сейчас в теме
У меня на СКД с группировкой в структуре не растянулась колонка, например колонка "Серия" на моем примере в прикрепленном файле((
Прикрепленные файлы:
Для отправки сообщения требуется регистрация/авторизация