Сериализация больших таблиц значений в 1С8

Введение в проблему

В моей задаче необходимо было сохран автоматизацией ять таблицу значений в файл. Но при большой нагрузке на сервер приложений таблица не сериализировалась через ЗначениеВСтрокуВнутр.

Методика, предложенная в http://kb.mista.ru/2/doku.php?id=1c:v8:howto:serializacija_tablicyznachenij_v_xml, не работ пользователь ает в 1с81 (8.1.15.14), видимо,  в более ранних версиях платфор управлениямы это не возможно.

Если упаковать таблицу значений в хран автоматизацией илище значений, то методика работ пользователь ает:
ХЗ = Новый ХранилищеЗначений(ТЗ);

Однако, проблема заключалась в том, что при критической нагрузке и в хран автоматизацией илище значений 1С не могла упаковать таблицу значений, выдавала ошибку о нехватке памяти.

Решение

Решение нужно было написать быстро, и скорость чтения таблиц не должна была бы сильно пострадать. Скорость записи была не принципиальна.

Решено было таблицу пробовать выгружать обычным методом, а если ЗначениеВСтрокуВнутр выдаст ошибку, выгружать построчно.

Соответственно, при восстановлении таблицы проверялся формат файла, и в зависимости от формата использовалась та или иная распаковка.


 

Код по упаковке в модуле САП:

 

Функция ТЗВТекст(ТЗ) Экспорт

       Попытка

             Т = Новый ТекстовыйДокумент();

             Т.УстановитьТекст(ЗначениеВСтрокуВнутр(ТЗ));

             Возврат внешние компоненты Т;

       Исключение

             Возврат внешние компоненты ТЗВТекстЧерезСтроки(ТЗ);

       Конецпечатную версиюПопытки;

Конецпечатную версиюФункции

 

Функция ТЗИзТекста(ТекстовыйДокумент) Экспорт

      

       Если ТекстовыйДокумент.ПолучитьСтроку(1) = "LINE_FORMAT" Тогда

             Возврат внешние компоненты ТЗИзТекстаЧерезСтроки(ТекстовыйДокумент);

       Конецпечатную версиюЕсли;

      

       Возврат внешние компоненты ЗначениеИЗСтрокиВнутр(ТекстовыйДокумент.ПолучитьТекст());

Конецпечатную версиюФункции

 

Функция ТЗВТекстЧерезСтроки(ТЗ) Экспорт

       Т = Новый ТекстовыйДокумент();

       МассивКолонок = Новый Массив();

       ВсегоКолонок = ТЗ.Колонки.Количество()-1;

       Для Инд = 0 По ВсегоКолонок Цикл

             МассивКолонок.Добавить(0);

       Конецпечатную версиюЦикла;

      

       Т.ДобавитьСтроку("LINE_FORMAT");

      

       ТЗ2 = ТЗ.СкопироватьКолонки();

      

       РезСтрока = ЗначениеВСтрокуВнутр(ТЗ2);

       РезСтрока = ЭкранироватьСимволы(РезСтрока);

       Т.ДобавитьСтроку(РезСтрока);

 

      

       Для Каждого Строка ИЗ ТЗ Цикл

             Для Инд = 0 По ВсегоКолонок Цикл

                    МассивКолонок[Инд] = Строка[Инд];

             Конецпечатную версиюЦикла;

             РезСтрока = ЗначениеВСтрокуВнутр(МассивКолонок);

             РезСтрока = ЭкранироватьСимволы(РезСтрока);

             Т.ДобавитьСтроку(РезСтрока);

       Конецпечатную версиюЦикла;

       Возврат внешние компоненты Т;

Конецпечатную версиюФункции

 

Функция ТЗИзТекстаЧерезСтроки(ТекстовыйДокумент) Экспорт

       ИсхСтрока = РазЭкранироватьСимволы(ТекстовыйДокумент.ПолучитьСтроку(2));

       ТЗ = ЗначениеИзСтрокиВнутр(ИсхСтрока);

       ВсегоКолонок = ТЗ.Колонки.Количество()-1;

       Для Инд = 3 По ТекстовыйДокумент.КоличествоСтрок() Цикл

             ИсхСтрока = РазЭкранироватьСимволы(ТекстовыйДокумент.ПолучитьСтроку(Инд));

             Массив = ЗначениеИзСтрокиВнутр(ИсхСтрока);

             НСтр = ТЗ.Добавить();

             Для КолИнд = 0 По ВсегоКолонок Цикл

                    НСтр[КолИнд] = Массив[КолИнд];

             Конецпечатную версиюЦикла;

       Конецпечатную версиюЦикла;

      

       Возврат внешние компоненты ТЗ;

      

Конецпечатную версиюФункции

 

Функция ЭкранироватьСимволы(Строка)

       Р = СтрЗаменить(Строка, "\", "\\");

       Р = СтрЗаменить(Р, Символы.ПС, "\n");

       Р = СтрЗаменить(Р, Символы.ВК, "\r");

       Р = СтрЗаменить(Р, Символы.Таб, "\t");

      

       Возврат внешние компоненты Р;

Конецпечатную версиюФункции

 

Функция РазЭкранироватьСимволы(Строка)

       Р = СтрЗаменить(Строка, "\\", "\");

       Р = СтрЗаменить(Р, "\n", Символы.ПС);

       Р = СтрЗаменить(Р, "\r", Символы.ВК);

       Р = СтрЗаменить(Р, "\t", Символы.Таб);

       Возврат внешние компоненты Р;

Конецпечатную версиюФункции

 

Пример использования кода:

Функция Сохран автоматизацией итьРасчет(ИмяФайла, Таблица) Экспорт

       Попытка

             Значение = ЗначениеВСтрокуВнутр(Таблица);

             Т = Новый ТекстовыйДокумент();

             Т.УстановитьТекст(Значение);

             Т.Записать(ИмяФайла, "UTF-8");

            

             Возврат внешние компоненты ИмяФайла;

       Исключение

             ОписаниеОшибки = ОписаниеОшибки();

             Сообщить("Не смогли преобразовать таблицу для сохран автоматизацией ения в файл: " + ИмяФайла +  "  " + ОписаниеОшибки + ". Будем записывать в другом формате.", СтатусСообщения.Важное);

            

             Т = САП.ТЗВТекст(Таблица);

             Т.Записать(ИмяФайла, "UTF-8");

       Конецпечатную версиюПопытки;

      

Конецпечатную версиюФункции

 

 

Функция ВосстановитьРасчет(ИмяФайла) Экспорт

       Попытка

             Т = Новый ТекстовыйДокумент();

             Т.Прочитать(ИмяФайла, "UTF-8");

             Значение = САП.ТЗИзТекста(Т);

       Исключение

             Возврат внешние компоненты Неопределено;

       Конецпечатную версиюПопытки;

       Возврат внешние компоненты Значение;

      

Конецпечатную версиюФункции

Пример тестирования функции:

 

ТЗ = новый ТаблицаЗначений;

  ТЗ.Колонки.Добавить("Кол1");

  ТЗ.Колонки.Добавить("Кол2");

 

  Стр = ТЗ.Добавить();

  Стр.Кол1 = 1;

  Стр.Кол2 = "1";

 

  Стр = ТЗ.Добавить();

  Стр.Кол1 = 2;

  Стр.Кол2 = "2";

 

 

 

  ТД = САП.ТЗВТекстЧерезСтроки(ТЗ);

  Сообщить(ТД.ПолучитьТекст());

  ТЗ = САП.ТЗИзТекстаЧерезСтроки(ТД);

  ТЗ.ВыбратьСтроку();


 

Скриншоты


Форма проверки

Полная версия

© ООО "Инфостарт", 2006-2023 www.infostart.ru