Имя: Пароль:
1C
1С v8
v8: Сериализовать ТЗ в УдобоваримыЙ текст быстро.
0 Живой Ископаемый
 
26.07.12
20:40
1. Я тоже пробовал, не получилось 0% (0)
2. Есть способ преобразовать, щас расскажу 0% (0)
3. Нужно делать по-другому, щас расскажу 0% (0)
4. авно ваша в8 0% (0)
5. Работает в в8.3 0% (0)
Всего мнений: 0

http://screencast.com/t/WBUfDhiSFEo

Или не ТЗ, или например через СКД, но макет будет не табличным документом, а текстовым, можно?

Самое обидное, что в СП написано что ТЗ сериализуется в ХМЛ. Но например

Такой код:
Сообщить(XMLСтрока(тзБуф));
сообщает
Код обработки результата: Строка 3: Ошибка при вызове метода контекста (XMLСтрока): Ошибка преобразования данных XML
1 acsent
 
26.07.12
20:42
сериализация в хмл делается не так
2 Ksandr
 
26.07.12
20:43
СериализаторXDTO не предлагать?
3 H A D G E H O G s
 
26.07.12
20:53
Напиши свой, бинарный.
4 Живой Ископаемый
 
26.07.12
20:57
2(2) Предлагать.. Но если можно на примере.
2(1) а как
2(3) нет, этого не надо
5 Живой Ископаемый
 
26.07.12
20:59
Вообще, например макетом СКД может служить ТекстовыйДокумент? а ПостроителяОтчетов?
6 Живой Ископаемый
 
26.07.12
21:06
в общем, если есть чо, то кидайте, хочу пробовать...
7 H A D G E H O G s
 
26.07.12
21:15
8 KAO111
 
26.07.12
21:15
В типовых есть модуль ТиповыеОтчеты. В нем функция

Функция СериализоватьОбъектXDTO(Объект) Экспорт
   
   ЗаписьXML = Новый ЗаписьXML();
   ЗаписьXML.УстановитьСтроку();
   СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Объект);
   СтрокаXML = ЗаписьXML.Закрыть();
   Возврат СтрокаXML;
   
КонецФункции

ТЗ нормально серилизуется
9 Живой Ископаемый
 
26.07.12
21:16
2(8) И что на выходе?
10 KAO111
 
26.07.12
21:17
ТЗ = новый ТаблицаЗначений;
   ТЗ.Колонки.Добавить("Кол1");
   ТЗ.Колонки.Добавить("Кол2");
   
   Стр = ТЗ.Добавить();
   Стр.Кол1 = 1;
   Стр.Кол2 = "1";
   
   Стр = ТЗ.Добавить();
   Стр.Кол1 = 2;
   Стр.Кол2 = "2";

   Сообщить( ТиповыеОтчеты.СериализоватьОбъектXDTO(ТЗ) );


Выдает

<ValueTable xmlns="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <column>
       <Name xsi:type="xs:string">Кол1</Name>
       <ValueType/>
   </column>
   <column>
       <Name xsi:type="xs:string">Кол2</Name>
       <ValueType/>
   </column>
   <row>
       <Value xsi:type="xs:decimal">1</Value>
       <Value xsi:type="xs:string">1</Value>
   </row>
   <row>
       <Value xsi:type="xs:decimal">2</Value>
       <Value xsi:type="xs:string">2</Value>
   </row>
</ValueTable>
11 KAO111
 
26.07.12
21:18
если типы описать будет с типами
12 Живой Ископаемый
 
26.07.12
22:22
2(8,10) клево... сенкс...

А вот так чтобы на как на картинке в (0) - не? можеткаким-нить читерским, нештатным образом?
13 KAO111
 
26.07.12
23:25
ну если только через XSLT, если 1С использует движок Microsoft работать будет очень быстро


   ТЗ = новый ТаблицаЗначений;
   ТЗ.Колонки.Добавить("Кол1");
   ТЗ.Колонки.Добавить("Кол2");
   ТЗ.Колонки.Добавить("Кол3");
   
   Стр = ТЗ.Добавить();
   Стр.Кол1 = 1;
   Стр.Кол2 = "1";
   Стр.Кол3 = ТекущаяДата();
   
   Стр = ТЗ.Добавить();
   Стр.Кол1 = 2;
   Стр.Кол2 = "2";
   Стр.Кол3 = ТекущаяДата();

   СтрXML = ТиповыеОтчеты.СериализоватьОбъектXDTO(ТЗ);
   
   //Сообщить( СтрXML );
   
   СтрокаXSL = "
|<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:a='http://v8.1c.ru/8.1/data/core'>;
|<xsl:output method='text' indent='yes'/>
|<xsl:template match='/' xml:space='preserve'>
|<xsl:for-each select='a:ValueTable/a:column'><xsl:value-of select='a:Name'/><xsl:if test='position()!=last()'>,</xsl:if></xsl:for-each>
|<xsl:for-each select='a:ValueTable/a:row'><xsl:for-each select='a:Value'><xsl:value-of select='.'/><xsl:if test='position()!=last()'>,</xsl:if></xsl:for-each>
|</xsl:for-each>
|</xsl:template>
|</xsl:stylesheet>";
   
   
   Преобразование = Новый ПреобразованиеXSL;
   Преобразование.ЗагрузитьИзСтроки(СтрокаXSL);
   Результат = Преобразование.ПреобразоватьИзСтроки(СтрXML);
   
   Сообщить( Результат );
14 KAO111
 
26.07.12
23:26
возвращает

Кол1,Кол2,Кол3
1,1,2012-07-27T01:27:20
2,2,2012-07-27T01:27:20
15 Живой Ископаемый
 
27.07.12
00:16
2(14) а у меня нет :(

тзБуф = мРезультатЗапроса.Выгрузить();
//СериализацияТЗ = ТиповыеОтчеты.СериализоватьОбъектXDTO(тзБуф);
//Сообщить(СериализацияТЗ);

           ЗаписьXML = Новый ЗаписьXML();
           ЗаписьXML.УстановитьСтроку();
           СериализаторXDTO.ЗаписатьXML(ЗаписьXML, тзБуф);
           СтрокаXML = ЗаписьXML.Закрыть();
           Сообщить( СтрокаXML );            
СтрокаXSL = "
|<xsl:stylesheet version='1.0' xmlns:xsl='""http://www.w3.org/1999/XSL/Transform"" target=""_blank"" ref=""nofollow"" class=""extralink"">http://www.w3.org/1999/XSL/Transform' xmlns:a='http://v8.1c.ru/8.1/data/core'>;;

|<xsl:output method='text' indent='yes'/>
|<xsl:template match='/' xml:space='preserve'>
|<xsl:for-each select='a:ValueTable/a:column'><xsl:value-of select='a:Name'/><xsl:if test='position()!=last()'>,</xsl:if></xsl:for-each>
|<xsl:for-each select='a:ValueTable/a:row'><xsl:for-each select='a:Value'><xsl:value-of select='.'/><xsl:if test='position()!=last()'>,</xsl:if></xsl:for-each>
|</xsl:for-each>
|</xsl:template>
|</xsl:stylesheet>";
   
   
   Преобразование = Новый ПреобразованиеXSL;
   Преобразование.ЗагрузитьИзСтроки(СтрокаXSL);
   Результат = Преобразование.ПреобразоватьИзСтроки(СтрокаXML);
   
   Сообщить( Результат );



============


Возвращает:



==========



<ValueTable xmlns="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <column>
       <Name xsi:type="xs:string">Field1</Name>
       <ValueType>
           <Type>Null</Type>
           <Type>xs:decimal</Type>
           <NumberQualifiers>
               <Digits>0</Digits>
               <FractionDigits>0</FractionDigits>
               <AllowedSign>Any</AllowedSign>
           </NumberQualifiers>
       </ValueType>
       <Title>Field1</Title>
       <Width xsi:type="xs:decimal">32</Width>
   </column>
   <column>
       <Name xsi:type="xs:string">Field2</Name>
       <ValueType>
           <Type>xs:string</Type>
           <Type>Null</Type>
           <StringQualifiers>
               <Length>6</Length>
               <AllowedLength>Variable</AllowedLength>
           </StringQualifiers>
       </ValueType>
       <Title>Field2</Title>
       <Width xsi:type="xs:decimal">6</Width>
   </column>
   <column>
       <Name xsi:type="xs:string">Field3</Name>
       <ValueType>
           <Type>xs:dateTime</Type>
           <Type>Null</Type>
           <DateQualifiers>
               <DateFractions>DateTime</DateFractions>
           </DateQualifiers>
       </ValueType>
       <Title>Field3</Title>
       <Width xsi:type="xs:decimal">19</Width>
   </column>
   <row>
       <Value xsi:type="xs:decimal">2</Value>
       <Value xsi:type="xs:string">Second</Value>
       <Value xsi:type="xs:dateTime">2012-07-26T00:00:00</Value>
   </row>
   <row>
       <Value xsi:type="xs:decimal">1</Value>
       <Value xsi:type="xs:string">First</Value>
       <Value xsi:type="xs:dateTime">2012-07-26T00:00:00</Value>
   </row>
</ValueTable>
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl='"http://www.w3.org/1999/XSL/Transform" target="_blank" ref="nofollow" class="extralink">http://www.w3.org/1999/XSL/Transform' xmlns:a="http://v8.1c.ru/8.1/data/core">;
<xsl:output method="text" indent="yes"/><xsl:template match="/" xml:space="preserve">
<xsl:for-each select="a:ValueTable/a:column"><xsl:value-of select="a:Name"/><xsl:if test="position()!=last()">,</xsl:if></xsl:for-each>
<xsl:for-each select="a:ValueTable/a:row"><xsl:for-each select="a:Value"><xsl:value-of select="."/><xsl:if test="position()!=last()">,</xsl:if></xsl:for-each>
</xsl:for-each>
</xsl:template></xsl:stylesheet>

=====


а вот если бы именно как в (14) - это было бы здорово!
16 Живой Ископаемый
 
27.07.12
00:39
Блин, вообще круто... только жалко что-то не работает...
В любом случае спасибо огромное!
17 KAO111
 
27.07.12
07:53
Там лишние кавычки поставил форум в описании XSL, достаточно версию указать. Но XSL работает, можно попробовать в каком-нибудь XML редакторе, тогда ошибки покажет. Скорость преобразования конечно очень хорошая.  

СтрокаXSL = "
|<xsl:stylesheet version='1.0'>
|<xsl:output method='text' indent='yes'/>
|<xsl:template match='/' xml:space='preserve'>
|<xsl:for-each select='a:ValueTable/a:column'><xsl:value-of select='a:Name'/><xsl:if test='position()!=last()'>,</xsl:if></xsl:for-each>
|<xsl:for-each select='a:ValueTable/a:row'><xsl:for-each select='a:Value'><xsl:value-of select='.'/><xsl:if test='position()!=last()'>,</xsl:if></xsl:for-each>
|</xsl:for-each>
|</xsl:template>
|</xsl:stylesheet>";
18 Живой Ископаемый
 
27.07.12
08:04
не, все равно не получается.. Но я добьюсь, сенкс.. Ты мне просто глаза открыл. Я уже накачал книжек по XSL| XLT
буду читать и пробовать
19 KAO111
 
27.07.12
08:26
Я с давних времен времен использую редактор Stylus Studio.

Там визуально все выбирается - и вот это преобразование точно работает
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший