Как создать столько документов сколько есть в экселе данных

1. skiopolitan 16.11.18 13:42 Сейчас в теме
В эксель файле 100 строк, для каждой строки нужно создать новый документ, т.е. 100 новых документов в Документе Поступление товаров и услуг, как это сделать вот код:
МассивКолонок = Новый ТаблицаЗначений;
	МассивКолонок.Колонки.Добавить("НомерКолонки");
	МассивКолонок.Колонки.Добавить("НазваниеКолонки");
	Для КолонкаОтсчета = 1 по КоличествоКолонок Цикл
		ИмяКолонки = Excel.Cells(1, КолонкаОтсчета).Text;
		ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ",""); 
		Если НЕ НаличиеРеквизитаТЧ(ИмяБезПробелов, Метаданные.Документы.ПоступлениеТоваровУслуг, "Товары") Тогда
		Иначе	
			НовСтрока = МассивКолонок.Добавить();	
			НовСтрока.НомерКолонки = КолонкаОтсчета;
			НовСтрока.НазваниеКолонки = ИмяБезПробелов;
		КонецЕсли;
	КонецЦикла;
	Если МассивКолонок.Количество() <> 0 и МассивКолонок.НайтиСтроки(Новый Структура("НазваниеКолонки", "Номенклатура")).Количество() <> 0 Тогда    
			 Для каждого СтрокаМассив из МассивКолонок Цикл
			 Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
			 ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Value;
		НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
		НовыйДокумент.Дата = ТекущаяДата();
		НовыйДокумент.Организация = Объект.Организация;
		НовыйДокумент.Склад = Объект.Склад;
		НовыйДокумент.ВидОперации = Объект.ВидОперации;
		НовыйДокумент.Контрагент = ТекущееЗначение;
		НаименованиеКонтрагента = Объект.Контрагент.Наименование;
		Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
		Если НаименованиеКонтрагента <> Excel.Cells(СтрокаОтсчета, 23).Text Тогда 
       Продолжить;
КонецЕсли;

НСтр = НовыйДокумент.Товары.Добавить();
				Для каждого СтрокаМассив из МассивКолонок Цикл 
				ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Value;
				ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;
				Значение = Excel.Cells(СтрокаОтсчета, 6).Value;								
				// Заполнение строки данными
					Если ИмяКолонки = "Номенклатура" Тогда
						НСтр.Номенклатура = Объект.Номенклатура;
					ИначеЕсли ИмяКолонки = "Количество" Тогда
						НСтр.Количество = ТекущееЗначение;
					 ИначеЕсли ИмяКолонки = "Цена" Тогда
                        НСтр.Цена = Значение;
					ИначеЕсли ИмяКолонки = "Сумма" Тогда
						НСтр.Сумма = НСтр.Количество*НСтр.Цена;
						ИначеЕсли ИмяКолонки = "Ставка НДС" Тогда
						НСтр.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
						ИначеЕсли ИмяКолонки = "Счет учета" Тогда
						НСтр.СчетУчета = ПланыСчетов.Хозрасчетный.СырьеИМатериалы;
				КонецЕсли;
					КонецЦикла;
				КонецЦикла;
						// Запись и проведение документа
			Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
		НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);		
	КонецЦикла;
КонецЦикла;
КонецЦикла;



		Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
	Иначе
		Сообщить("В Excel файле не достаточно данных для заполнения документа!");
		
	КонецЕсли;
	
			Excel.DisplayAlerts = 0; 
	Excel.Quit();
	Excel.DisplayAlerts = 1;
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. skiopolitan 16.11.18 13:47 Сейчас в теме
П.С.: Создает 7 документов по контрагенту, которого выбрал, надо 4 документа по контрагенту, которого выбрал, потому что 4 строчки из Экселя имеют 1 контрагента. Потом надо, чтобы создавало различных контрагентов (4 одинаковых - 1 контрагент - 1 документ). Извините, если не правильно что-то написал, я сонный.
5. skiopolitan 16.11.18 13:52 Сейчас в теме
(3)Не помогает, говорю же
6. go_margaret 18 16.11.18 13:59 Сейчас в теме
(5) А то что у вас запись в цикле?!
// Запись и проведение документа
Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
Это же даже не логично...

Вам нужен сам алгоритм решения данного вопроса, а уже потом написание модуля для решения данного задачи...

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

Что-то типа:
Для строк
создать документ
//заполнить данными
номенклатура то тоже в строке, за чем цикл на номенклатуру? Если даже она разная в разных строках, то у вас дубли документов будет...
Записываем документ
Конец цикла по строкам
7. VmvLer 16.11.18 14:02 Сейчас в теме
(5) задача простая, код понятный

я бы начал решение задачи на бумаге, а потом переписал код.

за вас код никто писать не будет - тут просто необходимо подумать над последовательностью шагов
Fox-trot; +1 Ответить
4. skiopolitan 16.11.18 13:51 Сейчас в теме
А потом еще надо, чтобы он все данные из экселя подтянул и по контрагенту создавал документы, допустим 100 строк, из них 10, 15,20,10,5,25,15 одинаковых контрагентов, обработка должна создать 7 документов и подтянуть данные из строк в табличную часть товары.
8. alex-l19041 8 16.11.18 14:10 Сейчас в теме
(4) Сначала считать исходный файл в таблицу значений. Затем надо получить список (различных) контрагентов,
далее в цикле для каждого контрагента из списка создавать документ и заполнять, выбирая строки по текущему контрагенту.
YannikAlx; wermah; +2 Ответить
9. Airlord 19.11.18 11:31 Сейчас в теме
Добрый день! Поддержу многих коллег по данной теме. От себя добавлю:
1. Предварительно выгрузить в таблицу значений Лист(ы) Exel.
2. Т.к. (судя по написанному тексту программы) все документы одной датой, стоит вставить сортировку по Контрагенту, если они встречаются одинаковые с помощью
функции
 ТЗ.Сортировать(, "Контрагент"):
.
3. После (вместе с) сортировки моно отсортировать по Номенклатуре - чтобы красиво ложилось в документе (строки без одинаковых Номенклатурных позиций).
4. Грузить в документ с учетом колонки "Контрагент" - грузим в один документ, пока не поменяется Контрагент. Поменялся - записываем док, проводим: создаем новый документ, заполняем.
Оставьте свое сообщение

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