1. ulvi96 11.02.19 12:19 Сейчас в теме

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

Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 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) Вам нужно вместо "Стр = ЭлементыФормы.Товары.ТекущиеДанные" написать "Стр = Товары.Добавить()", и тогда будут добавляться Ваши записи в таблицу
ulvi96; killitch; +2 Ответить
3. ishelper 11.02.19 12:25 Сейчас в теме
(1) Надо "НоваяСтрока = ТЗ.Добавить();" переместить внутрь цикла "Для Стр = 1 ПО 5 Цикл"

А то сейчас вы всего один раз добавляете новую строку, а потом пять раз меняете в ней данные.
ulvi96; killitch; +2 Ответить
4. ulvi96 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);
КонецЦикла;
Показать
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Благовещенск (Амурская область)
зарплата от 40 000 руб. до 70 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 100 000 руб.
Полный день

Программист 1С
Москва
зарплата от 110 000 руб.
Полный день

Ведущий программист 1С
Ставрополь
зарплата от 80 000 руб.
Полный день