Имя: Пароль:
1C
1С v8
простой пример с использованием XML и XSL - Ошибка объема данных
0 Kerk
 
08.11.11
18:02
Вот пример взятый из ветки v8: Как ускорить выгрузку в эксель? последний пост.

   тз = Новый ТаблицаЗначений;
   тз.Колонки.Добавить("Число", Новый ОписаниеТипов("Число"), "Число", 10);
   тз.Колонки.Добавить("Строка", Новый ОписаниеТипов("Строка"), "Строка", 30);
   тз.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"), "Дата", 10);
   Для инд = 1 По 10 Цикл
       стр = тз.Добавить();
       стр.Число = инд;
       стр.Строка = "Строка";
       стр.Дата = ТекущаяДата();
   КонецЦикла;
   записьXML = Новый ЗаписьXML;
   записьXML.УстановитьСтроку("windows-1251");
   записьXML.ЗаписатьОбъявлениеXML();
   записьXML.ЗаписатьНачалоЭлемента("ТаблицаЗначений");
   записьXML.ЗаписатьНачалоЭлемента("Колонки");
   Для Каждого колонка из тз.Колонки Цикл
       записьXML.ЗаписатьНачалоЭлемента("Колонка");
       записьXML.ЗаписатьАтрибут("Заголовок", колонка.Заголовок);
       записьXML.ЗаписатьАтрибут("Ширина", Строка(колонка.Ширина));
       записьXML.ЗаписатьКонецЭлемента();
   КонецЦикла;
   записьXML.ЗаписатьКонецЭлемента();
   Для Каждого строка из тз Цикл
       записьXML.ЗаписатьНачалоЭлемента("Строка");
       Для Каждого колонка из тз.Колонки Цикл
           записьXML.ЗаписатьНачалоЭлемента(колонка.Имя);
           записьXML.ЗаписатьТекст(XMLСтрока(строка[колонка.Имя]));
           записьXML.ЗаписатьКонецЭлемента();
       КонецЦикла;
       записьXML.ЗаписатьКонецЭлемента();
   КонецЦикла;
   записьXML.ЗаписатьКонецЭлемента();
   хсл = Новый ПреобразованиеXSL;
   хсл.ЗагрузитьИзСтроки(  "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"">
                           |
                           |    <xsl:template match=""/"">
                           |        <ss:Workbook>
                           |            <ss:Styles>
                           |                <ss:Style ss:ID=""1"">
                           |                    <ss:Font ss:Bold=""1""/>
                           |                </ss:Style>
                           |            </ss:Styles>
                           |            <ss:Worksheet ss:Name=""Test"">
                           |                <ss:Table>
                           |                    <xsl:apply-templates />
                           |                </ss:Table>
                           |            </ss:Worksheet>
                           |        </ss:Workbook>
                           |    </xsl:template>
                           |
                           |    <xsl:template match=""ТаблицаЗначений/Колонки"">
                           |        <ss:Row ss:StyleID=""1"">
                           |            <xsl:for-each select=""Колонка"">
                           |                <ss:Cell>
                           |                    <ss:Data ss:Type=""String""><xsl:value-of select=""@Заголовок""/></ss:Data>
                           |                </ss:Cell>
                           |            </xsl:for-each>
                           |        </ss:Row>
                           |        <xsl:apply-templates />
                           |    </xsl:template>
                           |
                           |    <xsl:template match=""ТаблицаЗначений/Строка"">
                           |        <ss:Row>
                           |            <xsl:for-each select=""*"">
                           |                <ss:Cell>
                           |                    <ss:Data ss:Type=""String"">
                           |                        <xsl:value-of select=""."" />
                           |                    </ss:Data>
                           |                </ss:Cell>
                           |            </xsl:for-each>
                           |        </ss:Row>
                           |    </xsl:template>
                           |
                           |</xsl:stylesheet>");
   результат = Новый ЗаписьXML;
   результат.ОткрытьФайл("c:\work\temp\test.xls");
   хсл.ПреобразоватьИзСтроки(записьXML.Закрыть(), результат);
   результат.Закрыть();


Если Просто поменять количество 10 на 50 то вываливается ошибка.


{Форма.Форма.Форма(521)}: Ошибка при вызове метода контекста (ПреобразоватьИзСтроки)
   хсл.ПреобразоватьИзСтроки(записьXML.Закрыть(), результат);
по причине:

по причине:
Ошибка разбора XML:  - [96,13]
Фатальная ошибка:
Premature end of data in tag ТаблицаЗначений line 2


И как это победить?

P.S. Если брать из Книга знаний: v8: Быстрый вывод данных в Excel по OLE с помощью COMSafeArray. что "Обязательно в строке соединения указывать параметр IMEX=1" тогда вообще не создается файл.
1 Kerk
 
08.11.11
18:04
(0) про  IMEX=1 я перепутал с ADODB.Connection :)
2 Kerk
 
08.11.11
18:27
Платформа 8.2.13.205, конфигурация не типовая.
3 Kashemir
 
08.11.11
18:38
(0) Не пробовал инструмент, однако судя по ошибке скорее проблема в структуре хмл, чем в объеме.
4 Kerk
 
08.11.11
19:08
(3) Ошибка про структуру, но если взять 40 строк, уже "структура" нормальная.
По данной ошибке, на этом форуме нашел догадку, что сама 1С плохо преобразовывает XML...
5 Kashemir
 
08.11.11
19:17
(4) Похоже на то. Попробовал то же реализовать через ПреобразоватьИзФайла на ТЗ из 60000 строк - осилило без ошибок.
6 Kerk
 
09.11.11
10:32
(5) Если можешь скинь кусок кода. Или хотя бы текст "хсл.ЗагрузитьИзСтроки(  "<xsl:stylesheet version=""1.0"" ... "
7 Kashemir
 
09.11.11
19:57
Процедура КнопкаВыполнитьНажатие(Кнопка)
   тз = Новый ТаблицаЗначений;
   тз.Колонки.Добавить("ТипЧисло", Новый ОписаниеТипов("Число"), "ЗаголовокЧисло", 10);
   тз.Колонки.Добавить("ТипСтрока", Новый ОписаниеТипов("Строка"), "ЗаголовокСтрока", 30);
   тз.Колонки.Добавить("ТипДата", Новый ОписаниеТипов("Дата"), "ЗаголовокДата", 10);
   Для инд = 1 По 60000 Цикл
       стр = тз.Добавить();
       стр.ТипЧисло = инд;
       стр.ТипСтрока = "ЗначениеСтрока";
       стр.ТипДата = ТекущаяДата();
   КонецЦикла;
   записьXML = Новый ЗаписьXML;
   записьXML.ОткрытьФайл("D:\test.xml", "windows-1251");
   //записьXML.УстановитьСтроку("windows-1251");
   записьXML.ЗаписатьОбъявлениеXML();
   записьXML.ЗаписатьНачалоЭлемента("ТаблицаЗначений");
   записьXML.ЗаписатьНачалоЭлемента("Колонки");
   Для Каждого колонка из тз.Колонки Цикл
       записьXML.ЗаписатьНачалоЭлемента("Колонка");
       записьXML.ЗаписатьАтрибут("Заголовок", колонка.Заголовок);
       записьXML.ЗаписатьАтрибут("Ширина", Строка(колонка.Ширина));
       записьXML.ЗаписатьКонецЭлемента();
   КонецЦикла;
   записьXML.ЗаписатьКонецЭлемента();
   Для Каждого строка из тз Цикл
       записьXML.ЗаписатьНачалоЭлемента("Строка");
       Для Каждого колонка из тз.Колонки Цикл
           записьXML.ЗаписатьНачалоЭлемента(колонка.Имя);
           записьXML.ЗаписатьТекст(XMLСтрока(строка[колонка.Имя]));
           записьXML.ЗаписатьКонецЭлемента();
       КонецЦикла;
       записьXML.ЗаписатьКонецЭлемента();
   КонецЦикла;
   записьXML.ЗаписатьКонецЭлемента();
   хсл = Новый ПреобразованиеXSL;
   хсл.ЗагрузитьИзСтроки(  "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"">

                           |
                           |    <xsl:template match=""/"">
                           |        <ss:Workbook>
                           |            <ss:Styles>
                           |                <ss:Style ss:ID=""1"">
                           |                    <ss:Font ss:Bold=""1""/>
                           |                </ss:Style>
                           |            </ss:Styles>
                           |            <ss:Worksheet ss:Name=""Test"">
                           |                <ss:Table>
                           |                    <xsl:apply-templates />
                           |                </ss:Table>
                           |            </ss:Worksheet>
                           |        </ss:Workbook>
                           |    </xsl:template>
                           |
                           |    <xsl:template match=""ТаблицаЗначений/Колонки"">
                           |        <ss:Row ss:StyleID=""1"">
                           |            <xsl:for-each select=""Колонка"">
                           |                <ss:Cell>
                           |                    <ss:Data ss:Type=""String"">
                           |                        <xsl:value-of select=""@Заголовок""/>
                           |                    </ss:Data>
                           |                </ss:Cell>
                           |            </xsl:for-each>
                           |        </ss:Row>
                           |        <xsl:apply-templates />
                           |    </xsl:template>
                           |
                           |    <xsl:template match=""ТаблицаЗначений/Строка"">
                           |        <ss:Row>
                           |            <xsl:for-each select=""*"">
                           |                <ss:Cell>
                           |                    <ss:Data ss:Type=""String"">
                           |                        <xsl:value-of select=""."" />
                           |                    </ss:Data>
                           |                </ss:Cell>
                           |            </xsl:for-each>
                           |        </ss:Row>
                           |    </xsl:template>
                           |
                           |</xsl:stylesheet>");
   результат = Новый ЗаписьXML;
   результат.ОткрытьФайл("D:\test.xls");
   
   СтрокаХМЛ = записьXML.Закрыть();
   
   //хсл.ПреобразоватьИзСтроки(СтрокаХМЛ, результат);
   хсл.ПреобразоватьИзФайла("D:\test.xml", Результат);
   
   результат.Закрыть();

КонецПроцедуры
8 Kerk
 
10.11.11
10:08
Спасибо, попробую.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший