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

1. _7445_ 07.03.19 05:14 Сейчас в теме
Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 1С программирование. В УТ 10.3. Сам код работает, загружает данные и заполняет табличный часть. Но пользователю надо что он могла вводить номер колонку. Пример : В Excel есть 4 колонку (Номенклатура, Цена, Количество, Сумма). Но Номенклатуры в третий колонке, цена 2, сумма 4 и количество 1. Как исправить с этим?
Рабочий код ниже. Как могу изменить ?
Спасибо всем за ранее.
Процедура  СоздатьТЗ()
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номенклатура",,,);
    ТЗ.Колонки.Добавить("Количество",,,);
    ТЗ.Колонки.Добавить("Цена",,,);
    ТЗ.Колонки.Добавить("Сумма",,,);

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


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

Процедура ОсновныеДействияФормыЗагрузитьДанные(Кнопка)
	
		
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите excel - файл";
    Диалог.ПолноеИмяФайла = "С:\";
    Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx";
    
    Если Диалог.Выбрать() Тогда
        Предупреждение(Диалог.ПолноеИмяФайла, 10 , "Файл выбран.");
    Иначе
        Предупреждение("Файл не выбран.");
        Возврат;
    КонецЕсли;
	
    
	
	
    СоздатьТЗ();
	
	
		
	Эксель = Новый COMОбъект("Excel.Application");
    Эксель.Workbooks.Open(Диалог.ПолноеИмяФайла);
	
    Эксель.Sheets(1).Select();
        Версия = Лев(Эксель.Version,Найти(Эксель.Version,".")-1);
Если Версия = "8" тогда
    ФайлСтрок   = Эксель.Cells.CurrentRegion.Rows.Count;
    ФайлКолонок = Макс(Эксель.Cells.CurrentRegion.Columns.Count, 13);
Иначе
    ФайлСтрок   = Эксель.Cells(1,1).SpecialCells(11).Row;
    ФайлКолонок = Эксель.Cells(1,1).SpecialCells(11).Column;   
Конецесли;
                                                                    
Для Стр = 1 ПО ФайлСтрок Цикл 
	Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
	Если Номенклатура.Пустая() Тогда 
		Сообщить("Строка - " + ФайлСтрок + " Номенклатура " + """" + СокрЛП(Эксель.Cells(Стр,1).Value) + """" + " не найдена!"); 
	Иначе 
		НоваяСтрока = ТЗ.Добавить(); 
		НоваяСтрока.Номенклатура = Номенклатура; 
		НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value); 
		НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value); 
		НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value); 
		НоваяСтрока.Номенклатура = Номенклатура; 
	Конецесли 
КонецЦикла; 
    
    
    Эксель.ActiveWorkbook.Close();
    Эксель.Application.Quit();


   
    
    
    ПереборСтрокТЗ();
КонецПроцедуры
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. SedovSU@mail.ru 298 07.03.19 10:42 Сейчас в теме
Вот так попробуйте

Перем ТЗ Экспорт;

Процедура  СоздатьТЗ()
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номенклатура",,,);
    ТЗ.Колонки.Добавить("Количество",,,);
    ТЗ.Колонки.Добавить("Цена",,,);
    ТЗ.Колонки.Добавить("Сумма",,,);

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

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

Процедура ВыберитеФайлНажатие(Элемент)
     СоздатьТЗ();
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите excel - файл";
    Диалог.ПолноеИмяФайла = "С:\";
    Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx";
    
    Если Диалог.Выбрать() Тогда
        Предупреждение(Диалог.ПолноеИмяФайла, 10 , "Файл выбран.");
    Иначе
        Предупреждение("Файл не выбран.");
        Возврат;
    КонецЕсли;
    ПолеВвода1 = Диалог.ПолноеИмяФайла;
    
    Эксель = Новый COMОбъект("Excel.Application");
    Эксель.Workbooks.Open(Диалог.ПолноеИмяФайла);
    
    Эксель.Sheets(1).Select();
    Версия = Лев(Эксель.Version,Найти(Эксель.Version,".")-1);
    Если Версия = "8" тогда
        ФайлСтрок   = Эксель.Cells.CurrentRegion.Rows.Count;
        ФайлКолонок = Макс(Эксель.Cells.CurrentRegion.Columns.Count, 13);
    Иначе
        ФайлСтрок   = Эксель.Cells(1,1).SpecialCells(11).Row;
        ФайлКолонок = Эксель.Cells(1,1).SpecialCells(11).Column;   
    Конецесли;
       
 НоменклатураКолонка = 2; // колонка 2 по умолчанию в файле екселе, даллее ее пользователь может изменить
        ВвестиЗначение(НоменклатураКолонка, "Введите номер колонки ""Номенклатура""");
    
    Для Стр = 1 ПО ФайлСтрок Цикл 
        Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,НоменклатураКолонка).Value));
        Если Номенклатура.Пустая() Тогда 
            Сообщить("Строка - " + ФайлСтрок + " Номенклатура " + """" + СокрЛП(Эксель.Cells(Стр,НоменклатураКолонка).Value) + """" + " не найдена!"); 
            СсылкаСправочник = Справочники.Номенклатура.СоздатьЭлемент();
            СсылкаСправочник.Наименование = Номенклатура;
            СсылкаСправочник.ПолноеНаименование = Номенклатура;
            СсылкаСправочник.БазоваяЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("ƏD"); 
            СсылкаСправочник.Записать();
            НоваяСтрока = ТЗ.Добавить(); 
            НоваяСтрока.Номенклатура = Номенклатура; 
            НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,КоличествоКолонка).Value); 
            НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,ЦенаКолонка).Value); 
            НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,СуммаКолонка).Value); 
            НоваяСтрока.Номенклатура = Номенклатура;
        Иначе 
            НоваяСтрока = ТЗ.Добавить(); 
            НоваяСтрока.Номенклатура = Номенклатура; 
            НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,КоличествоКолонка).Value); 
            НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,ЦенаКолонка).Value); 
            НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,СуммаКолонка).Value); 
            НоваяСтрока.Номенклатура = Номенклатура; 
        Конецесли 
    КонецЦикла; 
    
    
    Эксель.ActiveWorkbook.Close();
    Эксель.Application.Quit();

    ПереборСтрокТЗ();
КонецПроцедуры
Показать
7. _7445_ 07.03.19 12:17 Сейчас в теме
(6)
У меня в экселя номенклатуры написан в третий колонке. И есть только одно товар (Пример ; Клавиатура).
Код такой
 НоменклатураКолонка = 3; // я сам это поставил 
        ВвестиЗначение(НоменклатураКолонка, "Введите номер колонки ""Номенклатура""");
///// .......
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,НоменклатураКолонка).Value));
НоваяСтрока.Номенклатура = Номенклатура; 

Но код выбирает самую первую который есть списке справочнике номенклатура. И это родитель. Код так то отбор не делает. С отладкей посмотрел но не могла решить проблему ( СОМ объекты не знаю хорошо). Как могу решить эту проблему
2. SedovSU@mail.ru 298 07.03.19 06:27 Сейчас в теме
Я правильно понимаю, что вам необходимо как бы пользователю показать некое сообщение, чтобы он мог указать в какой колонке из файла находиться номенклатура, количество. цена????
3. SedovSU@mail.ru 298 07.03.19 06:33 Сейчас в теме
Вот в этом коде у вас явно указано с каких колонок брать значения. То есть количество из колонки 2, цена из 3.

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


Можете вызвать диалоговое окно с вопросом из какой колонки брать количество, цена и т.д.
4. SedovSU@mail.ru 298 07.03.19 06:38 Сейчас в теме
Вот так по простому можно сделать
КолонкаКоличество = 2;
ВвестиЗначение(КолонкаКоличество, "Введите номер колонки ""Количество""");
НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,КолонкаКоличество).Value);

Можно сделать отдельную форму, красивую форму, на котором пользователь сам укажит для всех необходимые значения
5. _7445_ 07.03.19 09:56 Сейчас в теме
(4)
Спасибо за вниманию.
Создал форму, добавил новую реквизиты. Код изменил. Код выбирает номер колонку который пользователь вводил. Но
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,НоменклатураКолонка).Value));

здесь он выбирает первую номенклатуру ( это группа в первом списке). Можете проста дать подсказку для решения. Спасибо за ранее
Вот полный код
Перем ТЗ Экспорт;

Процедура  СоздатьТЗ()
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номенклатура",,,);
    ТЗ.Колонки.Добавить("Количество",,,);
    ТЗ.Колонки.Добавить("Цена",,,);
    ТЗ.Колонки.Добавить("Сумма",,,);

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

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

Процедура ВыберитеФайлНажатие(Элемент)
	 СоздатьТЗ();
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выберите excel - файл";
	Диалог.ПолноеИмяФайла = "С:\";
	Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx";
	
	Если Диалог.Выбрать() Тогда
		Предупреждение(Диалог.ПолноеИмяФайла, 10 , "Файл выбран.");
	Иначе
		Предупреждение("Файл не выбран.");
		Возврат;
	КонецЕсли;
	ПолеВвода1 = Диалог.ПолноеИмяФайла;
	
	Эксель = Новый COMОбъект("Excel.Application");
	Эксель.Workbooks.Open(Диалог.ПолноеИмяФайла);
	
	Эксель.Sheets(1).Select();
	Версия = Лев(Эксель.Version,Найти(Эксель.Version,".")-1);
	Если Версия = "8" тогда
		ФайлСтрок   = Эксель.Cells.CurrentRegion.Rows.Count;
		ФайлКолонок = Макс(Эксель.Cells.CurrentRegion.Columns.Count, 13);
	Иначе
		ФайлСтрок   = Эксель.Cells(1,1).SpecialCells(11).Row;
		ФайлКолонок = Эксель.Cells(1,1).SpecialCells(11).Column;   
	Конецесли;
	
	Для Стр = 1 ПО ФайлСтрок Цикл 
		//ВвестиЗначение(НоменклатураКолонка, "Введите номер колонки ""Номенклатура""");
		Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,НоменклатураКолонка).Value));
		Если Номенклатура.Пустая() Тогда 
			Сообщить("Строка - " + ФайлСтрок + " Номенклатура " + """" + СокрЛП(Эксель.Cells(Стр,НоменклатураКолонка).Value) + """" + " не найдена!"); 
			СсылкаСправочник = Справочники.Номенклатура.СоздатьЭлемент();
			СсылкаСправочник.Наименование = Номенклатура;
			СсылкаСправочник.ПолноеНаименование = Номенклатура;
		    СсылкаСправочник.БазоваяЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("ƏD"); 
			СсылкаСправочник.Записать();
			НоваяСтрока = ТЗ.Добавить(); 
			НоваяСтрока.Номенклатура = Номенклатура; 
			НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,КоличествоКолонка).Value); 
			НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,ЦенаКолонка).Value); 
			НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,СуммаКолонка).Value); 
			НоваяСтрока.Номенклатура = Номенклатура;
		Иначе 
			НоваяСтрока = ТЗ.Добавить(); 
			НоваяСтрока.Номенклатура = Номенклатура; 
			НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,КоличествоКолонка).Value); 
			НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,ЦенаКолонка).Value); 
			НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,СуммаКолонка).Value); 
			НоваяСтрока.Номенклатура = Номенклатура; 
		Конецесли 
	КонецЦикла; 
	
	
	Эксель.ActiveWorkbook.Close();
	Эксель.Application.Quit();

	ПереборСтрокТЗ();
КонецПроцедуры

 
Показать
Оставьте свое сообщение

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