Изменение колонок табличного документа СКД

1. bytecoded 26 31.10.14 11:32 Сейчас в теме
Мне нужно программно изменять ширину колонок табличного документа, который создается СКД с заданным макетом.

При попытке выполнить что-то в духе:

     ВтораяКолонка = Результат.Область(, 2, , 2);
     ВтораяКолонка.ШиринаКолонки = 20;


... я не вижу никакой реакции. Попытка через тот же код задать, например, цвет фона колонки приводит к непонятному результату: цвет меняется, однако результат выполнения СКД он не затрагивает никак (пример на приложенном скриншоте). При этом ширина раскрашенной области второй колонки уже, чем область выведенной второй колонки (это «Amount» на скриншоте).

Очевидно, я чего-то не знаю о принципах работы табличных документов 1С и / или формированию их в СКД. Возможно, кто-то подтолкнет в правильном направлении. Код (если это важно) пытаюсь выполнять в конце процедуры ПриКомпоновкеРезультата().
Прикрепленные файлы:
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dj_serega 391 31.10.14 11:44 Сейчас в теме
(1) bytecoded, там где не выделилось, в строках, свои колонки созданы.

Попробуйте выделить несколько строк и изменить ширину колонок. Почитайте внимательно текст!
+
3. Agapov_Stas 1 31.10.14 11:55 Сейчас в теме
(1) bytecoded, можно попробовать через оформление - там есть такая настройка как "минимальная ширина"
+
4. dj_serega 391 31.10.14 12:13 Сейчас в теме
(3) Agapov_Stas, ну и максимальную тудаже. Я обычно обе устанавливаю одинаковыми.
+
5. bytecoded 26 31.10.14 13:37 Сейчас в теме
(3) Agapov_Stas, к сожалению, не срабатывает. Думаю, это из-за использования кастомного макета СКД.

(2) dj_serega, работает. Но этот метод влияет на весь документ, несмотря на то, что установить размер колонок я пытаюсь для отдельных ячеек (например, на скриншоте видно, как установка ширины колонки Aging в первой таблице сплюснула колонку Balance в таблице ниже). При настройке макета СКД есть возможность убедиться, что колонки строк имеют ширину, независимую друг от друга?
Прикрепленные файлы:
+
6. dj_serega 391 31.10.14 14:41 Сейчас в теме
(5) bytecoded, Я знаю про только визуальный метод.
Стали на ячеку и выделили колонку. Выделится только то что входит в группу.
Если ячейка в группе колонок из нескольких строк, то выделяться только колонки этих строк. Как-то так. Надеюсь понял о чем я.

Программно не смотрел. Так что если найдешь, пиши ;)
+
10. bytecoded 26 01.11.14 08:32 Сейчас в теме
(6) dj_serega, понял. А каким образом можно разгруппировать строки макета, чтобы можно было задавать колонкам независимую ширину?

Например, на прикрепленном скриншоте видно, что в группу входят все строки, кроме второй; я хочу получить возможность разбить каждую строку на отдельную группу и управлять шириной колонок каждой группы независимо от остальных.

(7) Boneman, понял, спасибо. Попробую, если с макетом не получится — пытаюсь понять, как разбить его на отдельные, независимые друг от друга группы строк.
Прикрепленные файлы:
+
7. Boneman 298 31.10.14 14:50 Сейчас в теме
(5) bytecoded, указывать надо конкретную группу строк, и колонок к ним. Тогда и ширина будет работать.
Решал уже такую задачу.
Сначала обходим табдок сверху вниз, по какой нибудь колонке, ищем различные ширины колонок, и запоминаем номера строк.
А потом уже крутим ширину нужных областей.
+
8. dj_serega 391 31.10.14 14:53 Сейчас в теме
9. Armando 1399 31.10.14 15:27 Сейчас в теме
(3)
к сожалению, не срабатывает. Думаю, это из-за использования кастомного макета СКД

можно же в своем макете и задать нужную ширину
+
11. bytecoded 26 01.11.14 12:02 Сейчас в теме
Так, по-моему, разобрался: нужно выделить строку (или несколько строк, которые нужно сделать независимыми), а потом изменить ширину одной из колонок.
+
12. Armando 1399 01.11.14 18:45 Сейчас в теме
(11) bytecoded, это называется "формат строк"
http://its.1c.ru/db/metod8dev#content:2227:hdoc
bytecoded; +1
13. bytecoded 26 03.11.14 13:22 Сейчас в теме
По-прежнему чего-то недопонимаю.

Итак, я создал для каждого фрагмента макета свой формат строк, проверил отсутствие привязки к другим фрагментам через выделение строк фрагмента + выделение колонки. Однако результирующий табличный документ все равно ведет себя так, как будто привязка существует: например, все колонки с цифрами в макете имеют ширину 14, но после генерации документа:

  • Колонки с цифрами имеют разную ширину, отличную от 14 (например, колонка Amount на скрине имеет ширину 18, хотя везде, где встречается в макете, выставлена в 14 и в отдельный формат);
  • Колонки выделяются так, как будто никакого формата строк не существует (т.е. выделяется полная вертикаль, хотя там чуть ли не каждая строка со своим форматом).

Соответственно, макет продолжает ехать по ширине. Куда имеет смысл посмотреть?
Прикрепленные файлы:
+
14. Armando 1399 03.11.14 17:04 Сейчас в теме
Можно программно с шириной работать. Когда макет компоновки скомпонован, можно в макетах еще что-то исправить до инициализации процессора компоновки.
Упрощенно вот так:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки());
	
	МакетКомпоновки.Макеты.Макет1.Макет[0].Ячейки[0].Оформление.УстановитьЗначениеПараметра("МинимальнаяШирина", 150);
	МакетКомпоновки.Макеты.Макет1.Макет[0].Ячейки[0].Оформление.УстановитьЗначениеПараметра("МаксимальнаяШирина", 150);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры
Показать
+
15. Armando 1399 03.11.14 17:08 Сейчас в теме
В схеме кстати тоже можно
СхемаКомпоновкиДанных.Макеты.Макет1.Макет[0].Ячейки[0].Оформление.УстановитьЗначениеПараметра("МинимальнаяШирина", 150);
+
16. Armando 1399 03.11.14 17:18 Сейчас в теме
Кстати, эти макеты ничего знают про формат строк. То что ты вытворяешь с табличным документом на закладке "Макеты", в самой схеме сохраняется всего лишь в виде набора параметров, описанных в СП "ОформлениеМакетаОформленияКомпоновкиДанных".
+
17. Armando 1399 03.11.14 17:58 Сейчас в теме
Поигрался немного с шириной колонок. Действительно, компоновка по-особенному подбирает ширину.
Зато стал понимать зачем нужен ИдентификаторТаблицы у объекта СтрокаТаблицыОбластиКомпоновкиДанных. Обратил внимание, что если у ячеек макетов разная ширина, но одинаковые идентификаторы, то они будут выведены в одном формате строк. Ширина колонки при этом будет подобрана как максимальная ширина всех входящих в колонку ячеек.

Теперь выполнение вот этого кода (обрати внимание на МакетКомпоновки.Макеты.Макет2.Макет[0].ИдентификаторТаблицы = "";):
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки());
	
	МакетКомпоновки.Макеты.Макет1.Макет[0].Ячейки[0].Оформление.УстановитьЗначениеПараметра("МинимальнаяШирина", 50);
	МакетКомпоновки.Макеты.Макет1.Макет[0].Ячейки[0].Оформление.УстановитьЗначениеПараметра("МаксимальнаяШирина", 50);
	
	МакетКомпоновки.Макеты.Макет2.Макет[0].ИдентификаторТаблицы = "";
	МакетКомпоновки.Макеты.Макет2.Макет[0].Ячейки[0].Оформление.УстановитьЗначениеПараметра("МинимальнаяШирина", 10);
	МакетКомпоновки.Макеты.Макет2.Макет[0].Ячейки[0].Оформление.УстановитьЗначениеПараметра("МаксимальнаяШирина", 10);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры
Показать


Приводит к такому результату. см вложение
Заголовок и детальная запись выведены в разных форматах строк.
Прикрепленные файлы:
Aurelius; itmind; bytecoded; +3
19. bytecoded 26 04.11.14 08:42 Сейчас в теме
(17) Armando, спасибо. Через программное искажение идентификаторов удалось добиться нужного эффекта. Не подскажешь, где можно прочитать подробнее про эти идентификаторы и порядок их назначения в стандартной обработке? Попробовал поискать информацию, но не нашел. Опасаюсь какого-то негативного эффекта от такого грубого вторжения в макет :)

Procedure ClearCompositionTemplateTableIDs(CompositionTemplate) Export
	
	Counter = 0;
	
	For Each AreaTemplateDefinition In CompositionTemplate.Templates Do
	
		For Each TemplateTableRow In AreaTemplateDefinition.Template Do			
			TemplateTableRow.TableID = String(Counter);			
			Counter = Counter + 1;			
		EndDo;
		
	EndDo;
	
EndProcedure // ClearCompositionTemplateTableIDs()
Показать
itmind; +1
20. Armando 1399 04.11.14 11:26 Сейчас в теме
(19) bytecoded, я еще раньше задавался этим вопросом, когда разработку ваял. Инфу тоже нигде не нашел. На ИТСе искал и на партнерском форуме.
+
21. Armando 1399 04.11.14 11:33 Сейчас в теме
(19) bytecoded, мне кажется в твоем коде увеличение счетчика лучше вынести за цикл, чтоб в рамках одного макета у всех строк был одинаковый идентификатор. Есть подозрение, что может что-то разъехаться.
+
22. bytecoded 26 04.11.14 12:12 Сейчас в теме
(21) Armando, о'кей. Пока разницы нет, но потестирую; отпишусь тут, если что-то выплывет.
+
18. Armando 1399 03.11.14 18:17 Сейчас в теме
Доработал разработку http://infostart.ru/public/291878/
чтоб идентификатор таблицы выводился.
Будет полезно при анализе подобных проблем.
bytecoded; +1
23. TanyTany 11.02.15 13:59 Сейчас в теме
Гениально!!! Теперь можно все отчеты можно переписать по-человечески, на сКД и с п о к о й н е н ь к о выгружать в Excel. А лучше пусть сами выгружают.
Если бы изначально не верила в мужское превосходство, обязательно прослезилась бы.
Потрясающе, как можно было до этого додуматься - хотя судя по никам вы 1с-ники условные :)
+
24. Armando 1399 17.02.15 22:19 Сейчас в теме
Что значит "1с-ники условные"? И как это определяется по никам?)
+
25. TanyTany 18.02.15 08:36 Сейчас в теме
Чистые 1с-ники - те, для которых жизнь за пределами 1с не существует
Условные 1с-ники - это мастадонты программирования, для которых 1с - просто диалект

Это была ода тем, которые видят дальше чем разработчики 1с
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот