Загрузка из табличного документа в документ Операция (бухгалтерская)

1. katyabelova 21.09.21 14:54 Сейчас в теме
Доброго времени суток, уважаемые участники форума! Пожалуйста помогите советом.

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

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


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


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

P.S. 1С 8.3, конфигурация "Бухгалтерия государственного учреждения 1.0", обычные формы.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
13. nomad_irk 76 21.09.21 16:13 Сейчас в теме +0.5 $m
(11)через ПостроительОтчета работать не будет, вернее будет, но будет чушь в итоге.
Структура хранения данных в ТабДоке уже задана: одна проводка вместо 1 строки занимает 3 и значения субконто 2/3/4 представлены одним строковым значением с каким-то разделителем.

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

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

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


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

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


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

Для Каждого Стр ИЗ НЗ Цикл
НЗ.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.БанковскиеСчета] = ТЗ[ИндексСтрок][КолонкаСоЗначениемСубконто];
КонецЦикла;
katyabelova; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. nomad_irk 76 21.09.21 15:05 Сейчас в теме
(1)
Но у заголовков сложная структура, не получается правильно прочитать :(

А заголовки в файле нельзя расположить в одну строку?
6. katyabelova 21.09.21 15:07 Сейчас в теме
(4) К сожалению нет, в документе несколько тысяч записей
7. nomad_irk 76 21.09.21 15:08 Сейчас в теме
(6)в смысле, формировать его правильно, адаптировано для машинной обработки
8. katyabelova 21.09.21 15:13 Сейчас в теме
(7) Насколько я знаю, этот табличный документ был сформирован путём вывода списка в табличный документ другого документа Операция (бухгалтерская). Поэтому повлиять на его формирование к сожалению не могу.
9. nomad_irk 76 21.09.21 15:18 Сейчас в теме
(8)а попросить заново сформировать в нужном виде тоже никак?
в таком случае только самостоятельное написание обработки загрузки данных спасет.

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

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

Далее загрузите ТЗ в НаборЗаписей нужного регистра бухгалтерии и собственно все.
katyabelova; +1 Ответить
11. katyabelova 21.09.21 15:55 Сейчас в теме
(9) Если я верно поняла вашу мысль, то примерно как-то так должно выглядеть? И не совсем понятно, как задавать структуру хранения данных.

        ТабДок = Новый ТабличныйДокумент;     
	ПутьКФайлу = "C:\doc.mxl";       
	                                                                              
	Попытка
		ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Не удалось прочитать указанный файл по причине: " + ОписаниеОшибки();
		Сообщение.Сообщить(); 
	КонецПопытки;  
	
 	ПоследняяСтрока = ТабДок.ВысотаТаблицы;
	ПоследняяКолонка = ТабДок.ШиринаТаблицы;
	ОбластьЯчеек = ТабДок.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка);
	
	// Где-то здесь задаётся структура?
	
	ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
	
	ПостроительОтчета = Новый ПостроительОтчета;	
	ПостроительОтчета.ИсточникДанных = ИсточникДанных;
	ПостроительОтчета.Выполнить();

	ТабЗначений = ПостроительОтчета.Результат.Выгрузить(); 
 
	
	ДокОперация = Документы.ОперацияБух.СоздатьДокумент();
	ДокОперация.Записать();

	НаборЗаписей = РегистрыСведений.РС.СоздатьНаборЗаписей();    
	
	Для каждого ИсточникДанных из ТабЗначений цикл 
		НоваяЗапись = НаборЗаписей.Добавить()
		ЗаполнитьЗначенияСвойств(НоваяЗапись, ИсточникДанных);
		НоваяЗапись.Регистратор = ДокОперация.Ссылка;
	КонецЦикла;     
	
	НаборЗаписей.Записать();
Показать
13. nomad_irk 76 21.09.21 16:13 Сейчас в теме +0.5 $m
(11)через ПостроительОтчета работать не будет, вернее будет, но будет чушь в итоге.
Структура хранения данных в ТабДоке уже задана: одна проводка вместо 1 строки занимает 3 и значения субконто 2/3/4 представлены одним строковым значением с каким-то разделителем.

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

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

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


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

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


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

Для Каждого Стр ИЗ НЗ Цикл
НЗ.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.БанковскиеСчета] = ТЗ[ИндексСтрок][КолонкаСоЗначениемСубконто];
КонецЦикла;
katyabelova; +1 Ответить
15. katyabelova 21.09.21 16:51 Сейчас в теме
(13) Большое спасибо, завтра обязательно попробую и отмечу решением, если получится :3
Можно будет вам написать, если не получится?
17. nomad_irk 76 21.09.21 20:05 Сейчас в теме
(15)пишите, по возможности подскажу
18. katyabelova 22.09.21 11:59 Сейчас в теме
(17) Попробовала. Отлаживала по шагам, первая строка заголовков обрабатывается замечательно, но пока не могу сообразить, как обрабатывать остальные три строки с субконто. Был бы документ с заголовками одной строкой, проблем бы не было, но тут де-факто 1 движение занимает 4 строки табличного документа.

КоличествоСтрок = ТабДок.ВысотаТаблицы;
	КоличествоКолонок = ТабДок.ШиринаТаблицы;
	
	ТЗ = Новый ТаблицаЗначений;   
    ТЗ.Колонки.Вставить(1, "КФО");
	ТЗ.Колонки.Вставить(2, "ДтКПС");
	ТЗ.Колонки.Вставить(3, "ДтСчет");
	ТЗ.Колонки.Вставить(4, "КтКПС");
	ТЗ.Колонки.Вставить(5, "КтСчет"); 
	ТЗ.Колонки.Вставить(6, "ДтКоличество");
	ТЗ.Колонки.Вставить(7, "КтКоличество");
	ТЗ.Колонки.Вставить(8, "Сумма");
	ТЗ.Колонки.Вставить(9, "Содержание");
	ТЗ.Колонки.Вставить(10, "ПервичныйДокумент"); 
	
	Для Строка = 5 ПО КоличествоСтрок Цикл
		НСтр = ТЗ.Добавить();
		Для Колонка = 2 По КоличествоКолонок Цикл
			НСтр[Колонка-2] = ТабДок.ПолучитьОбласть("R" + Формат(Строка, "ЧГ=0") + "C" + Формат(Колонка, "ЧГ=0")).ТекущаяОбласть.Текст; 			
		КонецЦикла; 
		//Строка = Строка + 3;
	КонецЦикла;

Показать
19. nomad_irk 76 22.09.21 12:25 Сейчас в теме
(18) Как-то так:

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

Для Строка = 5 ПО КоличествоСтрок Цикл
    НСтр = ТЗ.Добавить();
    Для СтрокаСубконто = Строка По Строка + 3 Цикл
        Для Каждого Элемент ИЗ СписокКолонокСАналитикой Цикл
             НСтр[Элемент.Ключ + (СтрокаСубконто - Строка)] = ТабДок.Область(СтрокаСубконто, Элемент.Значение).Текст;
        КонецЦикла; 
    КонецЦикла;
    Строка = Строка + 3;
КонецЦикла;
Показать
katyabelova; +1 Ответить
20. katyabelova 22.09.21 14:14 Сейчас в теме
(19) Большое вам спасибо за помощь! Ваша идея должна сработать, но у меня к сожалению пока не хватает толку её реализовать. Не буду больше вас отвлекать, ещё раз спасибо за отзывчивость! :3
12. anykey_vrn 21.09.21 16:12 Сейчас в теме
(1)В верхнем правом углу обработки "Загрузка данных из табличного документа" можно выбрать табличную часть в которую происходит загрузка, скорее всего выбрана не та табличная часть.
14. katyabelova 21.09.21 16:15 Сейчас в теме
(12) там только 1 табличная часть Запрашиваемые параметры
2. zelenii 21.09.21 14:59 Сейчас в теме
Собственно, если знаешь программирование, то задача на пол часа и документ заполнен данными. Если нет, то...Никак наверное. Только вручную.
3. katyabelova 21.09.21 15:05 Сейчас в теме
(2) В 1С-программировании я ещё учусь и некоторые вещи мне пока непонятны. Буду рада, если подскажете, в какую сторону двигаться при решении данной задачи.
5. parker_j 21.09.21 15:06 Сейчас в теме
10. starik-2005 3039 21.09.21 15:27 Сейчас в теме
Лично я делал так: создавал кнопку на форме, открывал ввод строки, копипастил из экселя в строку, дальше Для Каждого Строка ИЗ СтрРазделить(Текст, Символы.ПС)...Для Каждого Колонка ИЗ СтрРазделить(Строка, Символы.ТАБ)... Дальше уже парсил соответствующую колонку: Запись.СчетКт = ПланыСчетов.ХХХ.НайтиПоКоду(Колонка);...

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот