Капитально об программе 1С 8.0-8.3-8.4, 7.7

1С выгрузить таблицу значений в таблицу значений

Таблицу значений можно выгрузить (скопировать) для обработки в новую таблицу значений четырьмя способами:

Первый вариант выгрузки — копирование

Для начала, инициализируем тестовую таблицу с двумя колонками и двумя строками

ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить(«Колонка1»);
ТаблицаЗначений.Колонки.Добавить(«Колонка2»);
 
Строка1 = ТаблицаЗначений.Добавить();
Строка1.Колонка1 = 1;
Строка1.Колонка2 = 2;
 
Строка2 = ТаблицаЗначений.Добавить();
Строка2.Колонка1 = 2;
Строка2.Колонка2 = 1;
//Такой код полностью копирует таблицу
НоваяТаблицаЗначений = ТаблицаЗначений.Скопировать();
НоваяТаблицаЗначений.ВыбратьСтроку()
//Такой код копирует таблицу по простому условию — отбираются строки с определенным значением колонки
НоваяТаблицаЗначений = ТаблицаЗначений.Скопировать(Новый Структура(«Колонка1»,1));
НоваяТаблицаЗначений.ВыбратьСтроку();

Вариант второй — перебор с заполнением

Заготавливаем пустую таблицу по подобию первой

НоваяТаблица = ТаблицаЗначений.Скопировать();
НоваяТаблица.Очистить();
 
//Заполняем перебором с условием
Для каждого СтрокаИсходнойТаблицы по ТаблицаЗначений Цикл
       Если СтрокаИсходнойТаблицы.Колонка1>0 Тогда
                НоваяСтрока = НоваяТаблица.Добавить();
                ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаИсходнойТаблицы);
       КонецЕсли;
КонецЦикла;

Вариант третий — через внутреннее строковое представление

СтрокаВнутр = ЗначениеВСтрокуВнутр(ТаблицаЗначений);
 
Сообщить(СтрокаВнутр);
 
НоваяТаблицаЗначений = ЗначениеИзСтрокиВнутр(СтрокаВнутр);
НоваяТаблицаЗначений.ВыбратьСтроку();
 

СтрокаВнутр принимает вот такой вид для тестовой таблицы:

{"#",acf6192e-81ca-46ef-93a6-5a6968b78663,
{8,
{2,
{0,"Колонка1",
{"Pattern"},"",0},
{1,"Колонка2",
{"Pattern"},"",0}
},
{2,2,0,0,1,1,
{1,2,
{2,0,2,
{"N",1},
{"N",2},0},
{2,1,2,
{"N",2},
{"N",1},0}
},1,1}
}
}

Его можно сразу использовать, записывать в файл, передавать через веб-сервисы, главное при этом не менять кодировку, чтобы не получилось вот такого случая

Последний вариант — сериализация и десериализация

ЗаписьВXML = Новый ЗаписьXML();
ЗаписьВXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьВXML, ТаблицаЗначений);
СтрокаXML = ЗаписьВXML.Закрыть();
 
Сообщить( СтрокаXML );
 
//Обратное преобразование
ЧтениеИзXML = Новый ЧтениеXML;
ЧтениеИзXML.УстановитьСтроку(СтрокаXML);
НоваяТаблицаЗначений = СериализаторXDTO.ПрочитатьXML(ЧтениеИзXML);
ЧтениеИз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»>Колонка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:decimal»>2</Value>
</row>
<row>
<Value xsi:type=»xs:decimal»>2</Value>
<Value xsi:type=»xs:decimal»>1</Value>
</row>
</ValueTable>