Дано тестовое Задание
Необходимо с помощью программных средств платформы и языка 1С разработать
внешнюю обработку «Перегрузка документа».
В верхнем поле должна быть возможность выбрать любой документ из базы данных.
В нижнем поле указывается путь и имя файла для загрузки. На форме нужно обеспечить
возможность просмотра выгруженного текстового файла.
2. При нажатии кнопки «Выгрузить» информация, содержащаяся в выбранном
пользователем документе, должна выгрузиться в указанный файл. Информация должна
быть исчерпывающей, то есть выгружаться должны данные, чтобы при нажатии кнопки
«Загрузить» в базе создавалась бы копия исходного документа (за исключением номера,
т.к. номера документов уникальные).
3. При написании обработки необходимо использовать Метаданные, это делается
для универсализации программного кода.
4. При написании обработки нельзя использовать функции
«ЗначениеВСтрокуВнутр()», «УникальныеИдентификатор()» и подобные функции,
выгружающие уникальные идентификаторы объектов, а также нельзя делать выгрузку и
загрузку в формате XML или JSON.

Выгружаю табличную часть, ЧастьТаблицы|НомерСтроки|Число|1 такой строчкой обозначается начало новой строки в тч, как программно сделать так что бы после этой строки начиналось заполнение строки тч и когда доходит до
ЧастьТаблицы|НомерСтроки|Число|2
Начиналось заполнение следующей строки тч
Щас мой код каждый раз создает отдельную строку тч
---
Загрузка данных

```1c
    ИмяТаблицы = Неопределено;

    //Работа с текстом
    ПрочитанныйТекст = Новый ЧтениеТекста(Объект.Файл,КодировкаТекста.UTF8);
    СтрокаТекстовогоФайла = ПрочитанныйТекст.ПрочитатьСтроку();

    //Создание документа
    НовыйДокумент = Документы[СтрокаТекстовогоФайла].СоздатьДокумент();
    СтрокаТекстовогоФайла = ПрочитанныйТекст.ПрочитатьСтроку();

    //Установка даты
    НовыйДокумент.Дата = СтрокаТекстовогоФайла;
    СтрокаТекстовогоФайла = ПрочитанныйТекст.ПрочитатьСтроку();

    //Цикл записи
    Пока СтрокаТекстовогоФайла <> Неопределено Цикл

    МассивСлов = СтрРазделить(СтрокаТекстовогоФайла,"|");

    Если МассивСлов[0] = "ЧастьТаблицы" Тогда //цикл записи табличной части

    // Получаем имя таблицы
    Если МассивСлов.Количество() = 2 Тогда
    ИмяТаблицы = МассивСлов[1];
    КонецЕсли;

    //Записываем актуальные данные в нужную таблицу
    Если МассивСлов.Количество() = 4 Тогда

    ИмяКолонки = МассивСлов[1];
    ТипКолонки = МассивСлов[2];
    ЗначениеКолонки = МассивСлов[3];

    Если ИмяКолонки = "НомерСтроки" Тогда

    ИначеЕсли ТипКолонки = "Строка" Или ТипКолонки = "Число" Или ТипКолонки = "Дата" Или ТипКолонки = "Булево" Тогда

    НоваяСтрока = НовыйДокумент[ИмяТаблицы].Добавить();
    НоваяСтрока[ИмяКолонки] = ЗначениеКолонки;

    Иначе
    //Если тип составной сначала получаем его имя
    МассивКолонок = СтрРазделить(ТипКолонки,".");
    ИмяОбъекта = МассивКолонок[0];
    НаименованиеОбъекта = МассивКолонок[1];
    Путь = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ТипКолонки);

    //Ищем объект по имени и записываем ссылку
    Если ИмяОбъекта = "Справочник" Тогда
    НоваяСтрока = НовыйДокумент[ИмяТаблицы].Добавить();
    НоваяСтрока[ИмяКолонки] = Путь.НайтиПонаименованию(ЗначениеКолонки);
    ИначеЕсли ИмяОбъекта = "Перечисление" Тогда

    Для Индекс = 0 По Путь.Количество() - 1 Цикл

    Строка = Строка(Путь[Индекс]);

    Если Строка = ЗначениеКолонки Тогда
    ИмяПеречисления = Путь[Индекс];
    КонецЕсли;

    КонецЦикла;

    НоваяСтрока = НовыйДокумент[ИмяТаблицы].Добавить();
    НоваяСтрока[ИмяКолонки] = ИмяПеречисления;

    ИначеЕсли ИмяОбъекта = "ПланСчетов" Тогда
    НоваяСтрока = НовыйДокумент[ИмяТаблицы].Добавить();
    НоваяСтрока[ИмяКолонки] = Путь.НайтиПоКоду(ЗначениеКолонки);
    ИначеЕсли ИмяОбъекта = "Документ" Тогда

    КонецЕсли;

    КонецЕсли;

    КонецЕсли;

    КонецЕсли;// конец цикла записи табличной части
```
---
Загрузка данных

```1c
    ИмяТаблицы = Неопределено;

    //Работа с текстом
    ПрочитанныйТекст = Новый ЧтениеТекста(Объект.Файл,КодировкаТекста.UTF8);
    СтрокаТекстовогоФайла = ПрочитанныйТекст.ПрочитатьСтроку();

    //Создание документа
    НовыйДокумент = Документы[СтрокаТекстовогоФайла].СоздатьДокумент();
    СтрокаТекстовогоФайла = ПрочитанныйТекст.ПрочитатьСтроку();

    //Установка даты
    НовыйДокумент.Дата = СтрокаТекстовогоФайла;
    СтрокаТекстовогоФайла = ПрочитанныйТекст.ПрочитатьСтроку();

    //Цикл записи
    Пока СтрокаТекстовогоФайла <> Неопределено Цикл

    МассивСлов = СтрРазделить(СтрокаТекстовогоФайла,"|");

    Если МассивСлов[0] = "ЧастьТаблицы" Тогда //цикл записи табличной части

    // Получаем имя таблицы
    Если МассивСлов.Количество() = 2 Тогда
    ИмяТаблицы = МассивСлов[1];
    КонецЕсли;

    //Записываем актуальные данные в нужную таблицу
    Если МассивСлов.Количество() = 4 Тогда

    ИмяКолонки = МассивСлов[1];
    ТипКолонки = МассивСлов[2];
    ЗначениеКолонки = МассивСлов[3];

    Если ИмяКолонки = "НомерСтроки" Тогда

    ИначеЕсли ТипКолонки = "Строка" Или ТипКолонки = "Число" Или ТипКолонки = "Дата" Или ТипКолонки = "Булево" Тогда

    НоваяСтрока = НовыйДокумент[ИмяТаблицы].Добавить();
    НоваяСтрока[ИмяКолонки] = ЗначениеКолонки;

    Иначе
    //Если тип составной сначала получаем его имя
    МассивКолонок = СтрРазделить(ТипКолонки,".");
    ИмяОбъекта = МассивКолонок[0];
    НаименованиеОбъекта = МассивКолонок[1];
    Путь = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ТипКолонки);

    //Ищем объект по имени и записываем ссылку
    Если ИмяОбъекта = "Справочник" Тогда
    НоваяСтрока = НовыйДокумент[ИмяТаблицы].Добавить();
    НоваяСтрока[ИмяКолонки] = Путь.НайтиПонаименованию(ЗначениеКолонки);
    ИначеЕсли ИмяОбъекта = "Перечисление" Тогда

    Для Индекс = 0 По Путь.Количество() - 1 Цикл

    Строка = Строка(Путь[Индекс]);

    Если Строка = ЗначениеКолонки Тогда
    ИмяПеречисления = Путь[Индекс];
    КонецЕсли;

    КонецЦикла;

    НоваяСтрока = НовыйДокумент[ИмяТаблицы].Добавить();
    НоваяСтрока[ИмяКолонки] = ИмяПеречисления;

    ИначеЕсли ИмяОбъекта = "ПланСчетов" Тогда
    НоваяСтрока = НовыйДокумент[ИмяТаблицы].Добавить();
    НоваяСтрока[ИмяКолонки] = Путь.НайтиПоКоду(ЗначениеКолонки);
    ИначеЕсли ИмяОбъекта = "Документ" Тогда

    КонецЕсли;

    КонецЕсли;

    КонецЕсли;

    КонецЕсли;// конец цикла записи табличной части
```
---
Выгрузка данных в файл

```1c
    //Работа с табличной частью
    Для Каждого ТЧ Из Объект.Документ.Метаданные().ТабличныеЧасти Цикл

    ТекстовыйДок.ДобавитьСтроку("ЧастьТаблицы" + "|" + ТЧ);
    ТекстовыйДок.Записать(Объект.Файл, КодировкаТекста.UTF8);

    Таблица=Объект.Документ[ТЧ.Имя].Выгрузить();

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

    Для Каждого Колонка из Таблица.Колонки Цикл

    ЗначениеКол = Строк[Колонка.имя];
    ТипЗначенияКолонки = ТипЗнч(ЗначениеКол);
    ИмяКолонки = Колонка.Имя;

    Если ТипЗначенияКолонки = Тип("Строка") Или ТипЗначенияКолонки = Тип("Число") Или ТипЗначенияКолонки = Тип("Дата") Или ТипЗначенияКолонки = Тип("Булево") Тогда
    ТекстовыйДок.ДобавитьСтроку("ЧастьТаблицы" + "|" + ИмяКолонки + "|" + ТипЗначенияКолонки + "|" + ЗначениеКол);
    ТекстовыйДок.Записать(Объект.Файл, КодировкаТекста.UTF8);
    ИначеЕсли ТипЗначенияКолонки = Тип("Неопределено") Тогда
    //Уточнить по этому тут документ оприходования
    Иначе
    ТипКолонки = Метаданные.НайтиПоТипу(ТипЗначенияКолонки).ПолноеИмя();
    ТекстовыйДок.ДобавитьСтроку("ЧастьТаблицы" + "|" + ИмяКолонки + "|" + ТипКолонки + "|" + ЗначениеКол);
    ТекстовыйДок.Записать(Объект.Файл, КодировкаТекста.UTF8);
    КонецЕсли;

    КонецЦикла;

    КонецЦикла;

    КонецЦикла;
```
---
ЧастьТаблицы|Товары
ЧастьТаблицы|НомерСтроки|Число|1
ЧастьТаблицы|Номенклатура|Справочник.Номенклатура|Ассорти (конфеты)
ЧастьТаблицы|КоличествоМест|Число|0
ЧастьТаблицы|ЕдиницаИзмерения|Справочник.КлассификаторЕдиницИзмерения|шт
ЧастьТаблицы|Коэффициент|Число|1
ЧастьТаблицы|Количество|Число|170
ЧастьТаблицы|Цена|Число|500
ЧастьТаблицы|Сумма|Число|85 000
ЧастьТаблицы|СтавкаНДС|Перечисление.СтавкиНДС|Без НДС
ЧастьТаблицы|СуммаНДС|Число|0
ЧастьТаблицы|СчетУчета|ПланСчетов.Хозрасчетный|41.01
ЧастьТаблицы|ПереданныеСчетУчета|ПланСчетов.Хозрасчетный|
ЧастьТаблицы|СчетДоходов|ПланСчетов.Хозрасчетный|90.01.1
ЧастьТаблицы|Субконто|Справочник.НоменклатурныеГруппы|
ЧастьТаблицы|СчетУчетаНДСПоРеализации|ПланСчетов.Хозрасчетный|90.03
ЧастьТаблицы|СчетРасходов|ПланСчетов.Хозрасчетный|90.02.1
ЧастьТаблицы|Себестоимость|Число|0
ЧастьТаблицы|НомерГТД|Справочник.НомераГТД|
ЧастьТаблицы|СтранаПроисхождения|Справочник.СтраныМира|
ЧастьТаблицы|КиЗ_ГИСМ|Справочник.КонтрольныеЗнакиГИСМ|
ЧастьТаблицы|КодТНВЭД|Справочник.КлассификаторТНВЭД|
ЧастьТаблицы|НомерСтроки|Число|2
Данные в файле выглядят так
---
что закуча кода? выше
вся эта задача решается в 5 строчек (пример из рабочего кода, передача ЛЮБОГО объекта через строку

```1c
    ...
    //для переноса ссылочных объектов (пока) между идентичными базами через строку ХДТО
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Значение, НазначениеТипаXML.Явное);
    Возврат ЗаписьJSON.Закрыть();

    ...
```