Имя: Пароль:
1C
 
Построитель отчетов (сбрасываются настройки макета)
0 interlamersha
 
11.09.09
10:43
Есть небольшой отчет сформированный с помощью построителя. В отчете необходимо поменять названия колонок и ширину. Беру примеры из "брошурки" - "Профессиональная разработка в системе 1С:Предприятие 8" :) В итоге получается у меня вот такая процедурка вывода (немного сократила, но смысл остается):
Процедура ОтчетВывести()
   
   ЭлементыФормы.ПолеТабличногоДокумента.Очистить();
   ПостроительОтчетаОтчет.Текст=ПереформироватьТекстПостроителя();
   ПостроительОтчетаОтчет.ТекстЗаголовка = ПостроительОтчетаОтчет.ТекстЗаголовка + Символы.ПС+" за период с "+Формат(НачПериода,"ДЛФ=ДД")+" по "+Формат(КонПериода,"ДЛФ=ДД");
   
   МакетПостроителя=ПостроительОтчетаОтчет.Макет;        
   ПостроительОтчетаОтчет.Параметры.Вставить("КонПериода", КонПериода);
   ПостроительОтчетаОтчет.Параметры.Вставить("НачПериода", НачПериода);
   ПостроительОтчетаОтчет.Параметры.Вставить("Организация", Организация);
   ПостроительОтчетаОтчет.Параметры.Вставить("Подразделение", Подразделение);
   ПостроительОтчетаОтчет.Параметры.Вставить("Сотрудники", Сотрудники);
   
   ТекущаяОбласть=Неопределено;
   Если ПостроительОтчетаОтчет.ВыбранныеПоля.Найти("Расход")<>Неопределено тогда
       ТекущаяОбласть=ПостроительОтчетаОтчет.Макет.НайтиТекст("Расход",ТекущаяОбласть,ПостроительОтчетаОтчет.Макет.Область(),Истина,Истина,Истина,Ложь);
       ТекущаяОбласть.ШиринаКолонки=15;
       ТекущаяОбласть.РазмещениеТекста=ТипРазмещенияТекстаТабличногоДокумента.Переносить;  
   КонецЕсли;
   
   //ПостроительОтчетаОтчет.Макет=МакетПостроителя;  
   
   ПостроительОтчетаОтчет.Выполнить();                  
   ПостроительОтчетаОтчет.РазмещениеИзмеренийВСтроках = ТипРазмещенияИзмерений.Вместе;
   ПостроительОтчетаОтчет.РазмещениеРеквизитовИзмеренийВСтроках = ТипРазмещенияРеквизитовИзмерений.ВместеСИзмерениями;
   ПостроительОтчетаОтчет.РазмещениеРеквизитовИзмеренийВКолонках = ТипРазмещенияРеквизитовИзмерений.ВместеСИзмерениями;
   
   ПостроительОтчетаОтчет.МакетОформления = ПолучитьМакетОформления(СтандартноеОформление.Классика);
   ПостроительОтчетаОтчет.ОформитьМакет();
   
   
   ПостроительОтчетаОтчет.Вывести(ЭлементыФормы.ПолеТабличногоДокумента);
       
КонецПроцедуры

Теперь собственно о самой проблеме. В отчете выводятся данные с группировкой и итогами по подразделению, сотрудкнику. При первоначальной настройке (конструкторской) подразделение и сотрудник располагаются в одной колонке т.е.
Цех 1    10,20
Иванов   5,00
Петров   5,20

если я раскомментирую строчку

//ПостроительОтчетаОтчет.Макет=МакетПостроителя;  

то у меня подразделение и сотрудник оказываются в разных графах. Т.е.
Цех 1              10,20
       Иванов      5,00
       Петров      5,20
Мне же в свою очередь необходимо обеспечить чтобы измерения попадали в одну колонку.
Не смотря на присудствие строчки
ПостроительОтчетаОтчет.РазмещениеИзмеренийВСтроках = ТипРазмещенияИзмерений.Вместе;

данные не объединяются в одну колонку. Кто знает в чем проблема, и как ее решить?
1 ТелепатБот
 
гуру
11.09.09
10:43
2 interlamersha
 
11.09.09
10:49
Т.е. проще говоря, если мы в процедуре вывода отчета перед выполнением и выводом результатов построителем просто впишем две строчки
   МакетПостроителя=ПостроительОтчетаОтчет.Макет;  
   ПостроительОтчетаОтчет.Макет=МакетПостроителя;
То у нас тут же летят настройки. Простое присвоение а=б, б=а. Без какого-либо преобразования. и вот такая вот ахинея получается.
3 SOAD
 
11.09.09
10:55
(2)  Это относится к вопросу в (0) ?
4 interlamersha
 
11.09.09
10:59
(3) да относится. Я сейчас эту штуку протестила. Т.е. я так понимаю это косяк 1Ски.
5 SOAD
 
11.09.09
11:01
это же два разных вопроса.. может отдельную тему создать?
6 SOAD
 
11.09.09
11:01
(0)  нужно текст запроса изменить думаю
7 SOAD
 
11.09.09
11:08
(6) а именно:
В Итоги поместить Название Цехов и ФизЛиц. И не забыть выбрать размещение группировок в одной колонке
8 SOAD
 
11.09.09
11:12
<<И не забыть выбрать размещение группировок в одной колонке
впринципе это у вас уже реализовано вот этой строчкой

ПостроительОтчетаОтчет.РазмещениеИзмеренийВСтроках=ТипРазмещенияИзмерений.Вместе;
9 interlamersha
 
11.09.09
11:12
(6) но причем сдесь текст. Все в тексте нормально размещено, в итогах названия цехов и ФизЛиц размещено, размещение в группировках в одной колонке стоит.
В модуле в итоге прописивается:
ПостроительОтчетаОтчет.РазмещениеИзмеренийВСтроках = ТипРазмещенияИзмерений.Вместе;
Все прекрасно формируется, но если просто вписываем две строчки

МакетПостроителя=ПостроительОтчетаОтчет.Макет;  
ПостроительОтчетаОтчет.Макет=МакетПостроителя;

ничего при этом не меняя!!! , получаем совершенно другой макет.
10 SOAD
 
11.09.09
11:13
я так понял проблема в (0) решена? Осталось решить проблему (2) ?
11 interlamersha
 
11.09.09
11:14
(8) строчку
ПостроительОтчетаОтчет.РазмещениеИзмеренийВСтроках = ТипРазмещенияИзмерений.Вместе;
я не меняю, все остается как есть.
Может попробуйте сделать любой простенький отчет через построитель, например данные по какому-нибудь регистру вытащить и сгруппировать в одну колонку. а потом залезть в модуль и вписать в процедуре вывода эти злополучные 2 строки. и проверите как изменится результат. (может это у меня с платформой глюк).
12 interlamersha
 
11.09.09
11:19
(10) нет проблема (0) не решена, источником проблемы (0) является проблема (2)
13 SOAD
 
11.09.09
11:20
(11) Угу , у меня также  как у вас.
14 interlamersha
 
11.09.09
11:20
(13) т.е. это баг платформы...?
15 SOAD
 
11.09.09
11:20
А в чем смысл этих строчек?
16 SOAD
 
11.09.09
11:20
(14)  хз
17 interlamersha
 
11.09.09
11:22
(16) смысл в том что я делаю копию макета построителя, потом в копии делаю доработки, и эти доработаный макет загоняю обратно в построитель.
18 SOAD
 
11.09.09
11:24
(17) А что за доработки к примеру?
19 interlamersha
 
11.09.09
11:30
например. Я хочу поменять ширину колонки Расход, и сделать так чтоб наименование у меня в шапке переносилось. использую следующую конструкцию
   МакетПостроителя=ПостроительОтчетаОтчет.Макет;      
   ТекущаяОбласть=Неопределено;
   Если ПостроительОтчетаОтчет.ВыбранныеПоля.Найти("Расход")<>Неопределено тогда
       ТекущаяОбласть=МакетПостроителя.НайтиТекст("Расход",ТекущаяОбласть,МакетПостроителя.Область(),Истина,Истина,Истина,Ложь);
       ТекущаяОбласть.ШиринаКолонки=3;
       ТекущаяОбласть.РазмещениеТекста=ТипРазмещенияТекстаТабличногоДокумента.Переносить;  
   КонецЕсли;
   
   ПостроительОтчетаОтчет.Макет=МакетПостроителя;

В результате цель достигнута, ширина колонки изменилась, название шапки перенеслось, но вся общая настройка макета полетела к чертям.

Пробуем обойтись без копии макета, и пишем следующий код:

 
   ТекущаяОбласть=Неопределено;
   Если ПостроительОтчетаОтчет.ВыбранныеПоля.Найти("Расход")<>Неопределено тогда
       ТекущаяОбласть=ПостроительОтчетаОтчет.Макет.НайтиТекст("Расход",ТекущаяОбласть,ПостроительОтчетаОтчет.Макет.Область(),Истина,Истина,Истина,Ложь);
       ТекущаяОбласть.ШиринаКолонки=3;
       ТекущаяОбласть.РазмещениеТекста=ТипРазмещенияТекстаТабличногоДокумента.Переносить;  
   КонецЕсли;
   
В результате как была широченная строка расход, такая она и осталась, и наименование в колонке не переносится. Но и настройка макета остается прежней.
20 interlamersha
 
11.09.09
11:39
Может есть какой другой способ?
21 SOAD
 
14.09.09
04:19
получилось...  оказалось все просто
22 SOAD
 
14.09.09
04:24
вот проверенный мною рабочий код -выводит как надо

Процедура ОтчетВывести()
   //{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПОСТРОИТЕЛЬОТЧЕТА_ВЫПОЛНИТЬ(Отчет)
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

   ЭлементыФормы.ПолеТабличногоДокумента.Очистить();
   
   //Настройки для построителя.Вот этот кусок я перетащил на верх, до нашего текста изменения ширины колонки -и тогда он не сбрасывает настройки
   ПостроительОтчетаОтчет.РазмещениеИзмеренийВСтроках = ТипРазмещенияИзмерений.Вместе;
   ПостроительОтчетаОтчет.РазмещениеРеквизитовИзмеренийВСтроках = ТипРазмещенияРеквизитовИзмерений.Отдельно;
   ПостроительОтчетаОтчет.РазмещениеРеквизитовИзмеренийВКолонках = ТипРазмещенияРеквизитовИзмерений.Отдельно;
   ПостроительОтчетаОтчет.МакетОформления = ПолучитьМакетОформления(СтандартноеОформление.Классика);
   //
   
   //наш код изменения ширины колонки
   МакетПостроителя=ПостроительОтчетаОтчет.Макет;      
   ТекущаяОбласть=Неопределено;
   Если ПостроительОтчетаОтчет.ВыбранныеПоля.Найти("Наименование")<>Неопределено тогда
       ТекущаяОбласть=МакетПостроителя.НайтиТекст("Наименование",ТекущаяОбласть,МакетПостроителя.Область(),Истина,Истина,Истина,Ложь);
       ТекущаяОбласть.ШиринаКолонки=3;
       ТекущаяОбласть.РазмещениеТекста=ТипРазмещенияТекстаТабличногоДокумента.Переносить;  
   КонецЕсли;
   ПостроительОтчетаОтчет.Макет=МакетПостроителя;
   
   //тут уже построитель запускается - взяв все наши настройки
   ПостроительОтчетаОтчет.Выполнить();
   ПостроительОтчетаОтчет.Вывести(ЭлементыФормы.ПолеТабличногоДокумента);

   //}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПОСТРОИТЕЛЬОТЧЕТА_ВЫПОЛНИТЬ
КонецПроцедуры
23 SOAD
 
14.09.09
04:47
а вообще проще сделать свой макет,отредактировать его вручную как надо и подсунуть его построителю.
24 SOAD
 
14.09.09
04:50
(23)
Процедура ОтчетВывести()
   //{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПОСТРОИТЕЛЬОТЧЕТА_ВЫПОЛНИТЬ(Отчет)
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

   ЭлементыФормы.ПолеТабличногоДокумента.Очистить();

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

   //и вместо неё добавил следующее
   ПостроительОтчетаОтчет.Макет=ПолучитьМакет("СобственныйМакет");
   ПостроительОтчетаОтчет.Выполнить();
   ПостроительОтчетаОтчет.Вывести(ЭлементыФормы.ПолеТабличногоДокумента);

   
   //}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПОСТРОИТЕЛЬОТЧЕТА_ВЫПОЛНИТЬ
КонецПроцедуры
25 SOAD
 
14.09.09
04:53
(24) верхняя строка: ПостроительОтчетаОтчет.Выполнить();  конечно же лишняя
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший