Доброго времени суток, уважаемые участники форума! Пожалуйста помогите советом.

Возникла необходимость создать документ Операция (бухгалтерская) и заполнить его движениями, которые хранятся в табличном документе. Простым копированием-вставкой дело не решается :)

Универсальная загрузка с помощью обработки "Загрузка данных из табличного документа" не подошла, ибо обработка неправильно определяет колонки.

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

Возможно, есть другие способы решения задачи? Буду признательна, если подскажете! :)

P.S. 1С 8.3, конфигурация "Бухгалтерия государственного учреждения 1.0", обычные формы.
---
через ПостроительОтчета работать не будет, вернее будет, но будет чушь в итоге.
Структура хранения данных в ТабДоке уже задана: одна проводка вместо 1 строки занимает 3 и значения субконто 2/3/4 представлены одним строковым значением с каким-то разделителем.

Вот с эти учетом вам необходимо циклом обойти весь ТабДок и сформировать ТЗ, в которой каждая проводка будет занимать 1 строку, а не 3.

что-то вроде такого:

```1c
    Для Строка = 1 ПО КоличествоСтрок Цикл
    НСтр = ТЗ.Добавить();
    Для Колонка 1 По КоличествоКолонок Цикл
    НСтр[Колонка - 1] = ТабДок.Область(Строка, Колонка).Текст;
    КонецЦикла;
    КонецЦикла;
```

Дальше делаете что-то вроде:

```1c
    НЗ = РегистрыБухгалтерии.<НужныйРегистр>.СоздатьНаборЗаписей();
    НЗ.Отбор.Регистратор.Установить(СсылкаНаДокументОперацияБух);
    НЗ.Загрузить(ТЗ);
    НЗ.Записать();
```

Значения субконто придется устанавливать "вручную" кодом что-то вроде:

```1c
    Для Каждого Стр ИЗ НЗ Цикл
    НЗ.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.БанковскиеСчета] = ТЗ[ИндексСтрок][КолонкаСоЗначениемСубконто];
    КонецЦикла;
```
---
Но у заголовков сложная структура, не получается правильно прочитать :(
А заголовки в файле нельзя расположить в одну строку?
---
К сожалению нет, в документе несколько тысяч записей
---
в смысле, формировать его правильно, адаптировано для машинной обработки
---
Насколько я знаю, этот табличный документ был сформирован путём вывода списка в табличный документ другого документа Операция (бухгалтерская). Поэтому повлиять на его формирование к сожалению не могу.
---
а попросить заново сформировать в нужном виде тоже никак?
в таком случае только самостоятельное написание обработки загрузки данных спасет.

ТабличныйДокумент.Прочитать() - вы прочитали данные в ТабДок.

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

Далее загрузите ТЗ в НаборЗаписей нужного регистра бухгалтерии и собственно все.
---
Если я верно поняла вашу мысль, то примерно как-то так должно выглядеть? И не совсем понятно, как задавать структуру хранения данных.

```1c
    ТабДок = Новый ТабличныйДокумент;
    ПутьКФайлу = "C:\doc.mxl";

    Попытка
    ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    Исключение
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Не удалось прочитать указанный файл по причине: " + ОписаниеОшибки();
    Сообщение.Сообщить();
    КонецПопытки;

    ПоследняяСтрока = ТабДок.ВысотаТаблицы;
    ПоследняяКолонка = ТабДок.ШиринаТаблицы;
    ОбластьЯчеек = ТабДок.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка);

    // Где-то здесь задаётся структура?

    ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);

    ПостроительОтчета = Новый ПостроительОтчета;
    ПостроительОтчета.ИсточникДанных = ИсточникДанных;
    ПостроительОтчета.Выполнить();

    ТабЗначений = ПостроительОтчета.Результат.Выгрузить();

    ДокОперация = Документы.ОперацияБух.СоздатьДокумент();
    ДокОперация.Записать();

    НаборЗаписей = РегистрыСведений.РС.СоздатьНаборЗаписей();

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

    НаборЗаписей.Записать();
```
---
через ПостроительОтчета работать не будет, вернее будет, но будет чушь в итоге.
Структура хранения данных в ТабДоке уже задана: одна проводка вместо 1 строки занимает 3 и значения субконто 2/3/4 представлены одним строковым значением с каким-то разделителем.

Вот с эти учетом вам необходимо циклом обойти весь ТабДок и сформировать ТЗ, в которой каждая проводка будет занимать 1 строку, а не 3.

что-то вроде такого:

```1c
    Для Строка = 1 ПО КоличествоСтрок Цикл
    НСтр = ТЗ.Добавить();
    Для Колонка 1 По КоличествоКолонок Цикл
    НСтр[Колонка - 1] = ТабДок.Область(Строка, Колонка).Текст;
    КонецЦикла;
    КонецЦикла;
```

Дальше делаете что-то вроде:

```1c
    НЗ = РегистрыБухгалтерии.<НужныйРегистр>.СоздатьНаборЗаписей();
    НЗ.Отбор.Регистратор.Установить(СсылкаНаДокументОперацияБух);
    НЗ.Загрузить(ТЗ);
    НЗ.Записать();
```

Значения субконто придется устанавливать "вручную" кодом что-то вроде:

```1c
    Для Каждого Стр ИЗ НЗ Цикл
    НЗ.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.БанковскиеСчета] = ТЗ[ИндексСтрок][КолонкаСоЗначениемСубконто];
    КонецЦикла;
```
---
Большое спасибо, завтра обязательно попробую и отмечу решением, если получится :3
Можно будет вам написать, если не получится?
---
пишите, по возможности подскажу
---
Попробовала. Отлаживала по шагам, первая строка заголовков обрабатывается замечательно, но пока не могу сообразить, как обрабатывать остальные три строки с субконто. Был бы документ с заголовками одной строкой, проблем бы не было, но тут де-факто 1 движение занимает 4 строки табличного документа.

```1c
    КоличествоСтрок = ТабДок.ВысотаТаблицы;
    КоличествоКолонок = ТабДок.ШиринаТаблицы;

    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Вставить(1, "КФО");
    ТЗ.Колонки.Вставить(2, "ДтКПС");
    ТЗ.Колонки.Вставить(3, "ДтСчет");
    ТЗ.Колонки.Вставить(4, "КтКПС");
    ТЗ.Колонки.Вставить(5, "КтСчет");
    ТЗ.Колонки.Вставить(6, "ДтКоличество");
    ТЗ.Колонки.Вставить(7, "КтКоличество");
    ТЗ.Колонки.Вставить(8, "Сумма");
    ТЗ.Колонки.Вставить(9, "Содержание");
    ТЗ.Колонки.Вставить(10, "ПервичныйДокумент");

    Для Строка = 5 ПО КоличествоСтрок Цикл
    НСтр = ТЗ.Добавить();
    Для Колонка = 2 По КоличествоКолонок Цикл
    НСтр[Колонка-2] = ТабДок.ПолучитьОбласть("R" + Формат(Строка, "ЧГ=0") + "C" + Формат(Колонка, "ЧГ=0")).ТекущаяОбласть.Текст;
    КонецЦикла;
    //Строка = Строка + 3;
    КонецЦикла;
```
---
Как-то так:

```1c
    СписокКолонокСАналитикой = Новый Соответствие;//содержит соответствие индекса колонки ТЗ номеру колонки ТабДока
    СписокКолонокСАналитикой.Вставить(2, 4);
    СписокКолонокСАналитикой.Вставить(5, 7);

    Для Строка = 5 ПО КоличествоСтрок Цикл
    НСтр = ТЗ.Добавить();
    Для СтрокаСубконто = Строка По Строка + 3 Цикл
    Для Каждого Элемент ИЗ СписокКолонокСАналитикой Цикл
    НСтр[Элемент.Ключ + (СтрокаСубконто - Строка)] = ТабДок.Область(СтрокаСубконто, Элемент.Значение).Текст;
    КонецЦикла;
    КонецЦикла;
    Строка = Строка + 3;
    КонецЦикла;
```
---
Большое вам спасибо за помощь! Ваша идея должна сработать, но у меня к сожалению пока не хватает толку её реализовать. Не буду больше вас отвлекать, ещё раз спасибо за отзывчивость! :3
---
В верхнем правом углу обработки "Загрузка данных из табличного документа" можно выбрать табличную часть в которую происходит загрузка, скорее всего выбрана не та табличная часть.
---
там только 1 табличная часть Запрашиваемые параметры
---
Собственно, если знаешь программирование, то задача на пол часа и документ заполнен данными. Если нет, то...Никак наверное. Только вручную.
---
В 1С-программировании я ещё учусь и некоторые вещи мне пока непонятны. Буду рада, если подскажете, в какую сторону двигаться при решении данной задачи.
---
попробуйте использовать ответ из https://forum.infostart.ru/forum9/topic269494/
---
Лично я делал так: создавал кнопку на форме, открывал ввод строки, копипастил из экселя в строку, дальше Для Каждого Строка ИЗ СтрРазделить(Текст, Символы.ПС)...Для Каждого Колонка ИЗ СтрРазделить(Строка, Символы.ТАБ)... Дальше уже парсил соответствующую колонку: Запись.СчетКт = ПланыСчетов.ХХХ.НайтиПоКоду(Колонка);...

В общем в части кода все очень просто обычно.
---
Да, на форме документа отражены движения, поэтому записывать нужно в таблицу движений. Если обойтись без доработок, можно сначала создать и записать документ Операция, затем загрузкой в РБ Хозрасчетный можно сформировать набор записей с указанием регистратора - созданного документа.