Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 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 , "Файл выбран.");
Иначе
Предупреждение("Файл не выбран.");
Возврат;
КонецЕсли;
СоздатьТЗ();
ПереборСтрокВЭксель();
ПереборСтрокТЗ();
КонецПроцедуры
ПоказатьМежду
ЭлементыФормы.Товары.ТекущиеДанные
ЭтотОбъект.Товары.Добавить()
Прикрепленные файлы:
По теме из базы знаний
- Универсальная обработка для загрузки данных из Экселя в табличную часть документа
- Загрузка данных из ОФД в 1С:Бухгалтерию 3.0, 1С:КА 2.4, 2.5, УНФ 1.6/3.0 о денежных поступлениях (чеках)
- Загрузка номенклатуры из Эксель (новый взгляд)
- Универсальная загрузка данных из Экселя по основным параметрам для УТ 11.5
- Загрузка данных из экселя в Распоряжение на перечисление на карты МИР
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) (2) Спасибо за ответы. Все работает. Но есть проблемы можете проста дать подсказку?
У меня экселя есть 5 строк но это может быть 10, 20 или более строк тогда программ не будить работать. Как исправить с этим?
И сейчас проста ток показывает по моему проблема в цикле.
У меня экселя есть 5 строк но это может быть 10, 20 или более строк тогда программ не будить работать. Как исправить с этим?
И сейчас проста ток показывает по моему проблема в цикле.
Прикрепленные файлы:
(4) Вам нужно создать переменную в которой будет храниться номер строки Excel и затем в цикле надо будет увеличить на 1 единицу, то есть этот будет счетчик по сути. И Вам нужно определить какая колонка в Excel-файле всегда будет заполнена? И на основании этой заполненной колонки, пишите код прерывания, если следующая строка будет пустой.
(4)
Тогда будут обрабатываться файлы до 1000 строк, но обработка будет прерываться на первой же строке с незаполненной Номенклатурой.
У меня экселя есть 5 строк но это может быть 10, 20 или более строк тогда программ не будить работать. Как исправить с этим?
Ну, если с минимальными изменениями в коде, то примерно так:
Для Стр = 1 ПО 1000 Цикл
НоваяНоменклатура = СокрЛП(Эксель.Cells(Стр,1).Value);
Если НЕ ЗначениеЗаполнено(НоваяНоменклатура) Тогда
Прервать;
Конецесли;
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = НоваяНоменклатура;
НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
КонецЦикла;
ПоказатьТогда будут обрабатываться файлы до 1000 строк, но обработка будет прерываться на первой же строке с незаполненной Номенклатурой.
Можно и так попробовать
И тогда
Либо условный цикл
ПоследняяСтрока = Эксель.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);
КонецЦикла;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот