1С Загрузка данных Эксель

1. _7445_ 11.02.19 12:19 Сейчас в теме
Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 1С программирование. Есть токая задание: Загрузка данных из эксель файла. Поставил кнопку в форме документа поступление товаров и написал такой код. Где то есть ошибка что он не выбирает все товары из файла только последний из списка. Как исправиться с этим?
Спасибо всем за ранее.
Перем ТЗ;
Процедура  СоздатьТЗ()
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Номенклатура",,,);
	ТЗ.Колонки.Добавить("Количество",,,);
	ТЗ.Колонки.Добавить("Цена",,,);
	ТЗ.Колонки.Добавить("Сумма",,,);

КонецПроцедуры // СоздатьТЗ()

////////////////////////////////////////////////////////////­/////////

Процедура ПереборСтрокВЭксель()

    Путь = "C:\Users\User\Desktop\Лист Microsoft Excel.xlsx";
    Эксель = Новый COMОбъект("Excel.Application");
    Эксель.Workbooks.Open(Путь);
    Эксель.Sheets(1).Select();
    НоваяСтрока = ТЗ.Добавить();
    Для Стр = 1 ПО 5 Цикл    
        НоваяСтрока.Номенклатура = СокрЛП(Эксель.Cells(Стр,1).Value);
        НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
        НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
        НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
        КонецЦикла;
    
    Эксель.ActiveWorkbook.Close();
    Эксель.Application.Quit();
КонецПроцедуры

////////////////////////////////////////////////////////////­/////////

Процедура ПереборСтрокТЗ()
	Для Каждого Ст из ТЗ Цикл
	Стр = ЭлементыФормы.Товары.ТекущиеДанные;
    Стр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Ст.Номенклатура);
    Стр.Количество = Ст.Количество;
    Стр.Цена = Ст.Цена;
    Стр.Сумма = Ст.Сумма;
	Стр.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
	Стр.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("ƏD");
	Стр.Коэффициент = 1;
    КонецЦикла;
КонецПроцедуры

////////////////////////////////////////////////////////////­/////////

Процедура ОсновныеДействияФормыЗагрузкаДанный(Кнопка)
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выберите excel - файл";
	Диалог.ПолноеИмяФайла = "С:\";
	Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx";
	
	Если Диалог.Выбрать() Тогда
		Предупреждение(Диалог.ПолноеИмяФайла, 10 , "Файл выбран.");
	Иначе
		Предупреждение("Файл не выбран.");
		Возврат;
	КонецЕсли;
	


	СоздатьТЗ();
	

	ПереборСтрокВЭксель();
	
	
	ПереборСтрокТЗ();
	
КонецПроцедуры
Показать


Между
ЭлементыФормы.Товары.ТекущиеДанные
этого написал
ЭтотОбъект.Товары.Добавить()
но тогда тоже не работает.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1088693 11.02.19 12:23 Сейчас в теме
(1) Вам нужно вместо "Стр = ЭлементыФормы.Товары.ТекущиеДанные" написать "Стр = Товары.Добавить()", и тогда будут добавляться Ваши записи в таблицу
_7445_; killitch; +2 Ответить
3. ishelper 11.02.19 12:25 Сейчас в теме
(1) Надо "НоваяСтрока = ТЗ.Добавить();" переместить внутрь цикла "Для Стр = 1 ПО 5 Цикл"

А то сейчас вы всего один раз добавляете новую строку, а потом пять раз меняете в ней данные.
_7445_; killitch; +2 Ответить
4. _7445_ 11.02.19 12:41 Сейчас в теме
(3) (2) Спасибо за ответы. Все работает. Но есть проблемы можете проста дать подсказку?
У меня экселя есть 5 строк но это может быть 10, 20 или более строк тогда программ не будить работать. Как исправить с этим?
И сейчас проста ток показывает по моему проблема в цикле.
Прикрепленные файлы:
5. user1088693 11.02.19 12:53 Сейчас в теме
(4) Вам нужно создать переменную в которой будет храниться номер строки Excel и затем в цикле надо будет увеличить на 1 единицу, то есть этот будет счетчик по сути. И Вам нужно определить какая колонка в Excel-файле всегда будет заполнена? И на основании этой заполненной колонки, пишите код прерывания, если следующая строка будет пустой.
6. ishelper 11.02.19 12:59 Сейчас в теме
(4)
У меня экселя есть 5 строк но это может быть 10, 20 или более строк тогда программ не будить работать. Как исправить с этим?
Ну, если с минимальными изменениями в коде, то примерно так:
    Для Стр = 1 ПО 1000 Цикл
        НоваяНоменклатура = СокрЛП(Эксель.Cells(Стр,1).Value);
        Если НЕ ЗначениеЗаполнено(НоваяНоменклатура) Тогда
            Прервать;
        Конецесли;
        НоваяСтрока = ТЗ.Добавить();
        НоваяСтрока.Номенклатура = НоваяНоменклатура;
        НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
        НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
        НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
    КонецЦикла;
Показать


Тогда будут обрабатываться файлы до 1000 строк, но обработка будет прерываться на первой же строке с незаполненной Номенклатурой.
7. Grey_Lady 11.02.19 17:45 Сейчас в теме
Можно и так попробовать
ПоследняяСтрока = Эксель.ActiveSheet.UsedRange.Row + Эксель.ActiveSheet.UsedRange.Rows.Count - 1

И тогда
Для Стр = 1 По ПоследняяСтрока Цикл
    НоваяСтрока = ТЗ.Добавить();
    НоваяСтрока.Номенклатура = СокрЛП(Эксель.Cells(Стр,1).Value);
    НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
    НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
    НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
КонецЦикла;


Либо условный цикл
НоваяНоменклатура = СокрЛП(Эксель.Cells(1,1).Value);
Стр = 1;
Пока ЗначениеЗаполнено(НоваяНоменклатура) Цикл
    НоваяСтрока = ТЗ.Добавить();
    НоваяСтрока.Номенклатура = НоваяНоменклатура;
    НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
    НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
    НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
    Стр = Стр + 1;
    НоваяНоменклатура = СокрЛП(Эксель.Cells(Стр,1).Value);
КонецЦикла;
Показать
Оставьте свое сообщение

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