1С загрузка данных Excel УТ 10.3

1. _7445_ 25.01.19 10:53 Сейчас в теме
Здравствуйте. Я очень мало знаю русский. Извините за этого. Я еще новичок в 1С программирование. Есть токая задания "Загрузить данные из экселя в ТЗ документа". Написал код, есть ошибка но не знаю как исправит с этим. Пример : у меня экселя есть 10 строк но программ выбирает только последний.
Эксель:
Номенклатура Количество
1 - Монитор 10
2 - Экран 23
3 - Клавиатура 23
В документа отображается только последний ("Клавиатура") (ПоступлениеТоваровУслуг.Товары)
Как исправится с этим?
Спасибо всем за ранее.
Вот полный код:
Перем СЗ, ТЗ;
Процедура СозданиеТаблицыЗначений() 
ТЗ = Новый ТаблицаЗначений;
//ТЗ.Колонки.Добавить("ПолноеНаименование",,,);
ТЗ.Колонки.Добавить("Номенклатура",,,);
ТЗ.Колонки.Добавить("Количество",,,);
ТЗ.Колонки.Добавить("Цена",,,);
ТЗ.Колонки.Добавить("Сумма",,,);
//ТЗ.Колонки.Добавить("ПолноеНазвание" ,Новый ОписаниеТипов("СписокЗначений"));
КонецПроцедуры

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

Функция ПоискПодстроки(Подстрока, ПодстрокаРасшифровка)
	
	ПозицияСимвола = Найти(Подстрока, ",");
	ПозицияСимволаРасшифровка = Найти(ПодстрокаРасшифровка, ",");
	
	Если ПозицияСимвола <> 0 Тогда
		ПерваяНоменклатура = Лев(Подстрока, ПозицияСимвола - 1);
		ПерваяНоменклатураРасшифровка = Лев(ПодстрокаРасшифровка, ПозицияСимволаРасшифровка - 1);
		
		СЗ.Добавить(ПерваяНоменклатура, ПерваяНоменклатураРасшифровка);
		Остаток = СтрДлина(Подстрока) - (СтрДлина(ПерваяНоменклатура) + 1);
		ОстатокРасшифровка = СтрДлина(ПодстрокаРасшифровка) - (СтрДлина(ПерваяНоменклатураРасшифровка) + 1);
		
		Возврат ПоискПодстроки(Прав(Подстрока, Остаток), Прав(ПодстрокаРасшифровка,ОстатокРасшифровка));  

	Иначе
		СЗ.Добавить(СокрЛП(Подстрока), СокрЛП(ПодстрокаРасшифровка));
		Возврат ПозицияСимвола;
		КонецЕсли;
КонецФункции

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

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

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

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

Процедура ПереборСтрокТЗ() Экспорт
    Стр = ЭлементыФормы.Товары.ТекущиеДанные;
	Для Каждого Ст из ТЗ Цикл
	Стр.Номенклатура = Ст.Номенклатура;
	Стр.Количество = Ст.Количество;
	Стр.Цена = Ст.Цена;
	Стр.Сумма = Ст.Сумма;
	КонецЦикла;
КонецПроцедуры

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

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

	ПереборСтрокТЗ();

КонецПроцедуры
Показать
По теме из базы знаний
Найденные решения
15. senshkr 13 25.01.19 13:44 Сейчас в теме
(13)Пардон, на увидел сначала, что это форма документа.
тогда все через Объект
Объект.Товары.Добавить();
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. SedovSU@mail.ru 298 25.01.19 12:02 Сейчас в теме
Попробуйте вот так

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

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

Функция ПоискПодстроки(Подстрока, ПодстрокаРасшифровка)
    
    ПозицияСимвола = Найти(Подстрока, ",");
    ПозицияСимволаРасшифровка = Найти(ПодстрокаРасшифровка, ",");
    
    Если ПозицияСимвола <> 0 Тогда
        ПерваяНоменклатура = Лев(Подстрока, ПозицияСимвола - 1);
        ПерваяНоменклатураРасшифровка = Лев(ПодстрокаРасшифровка, ПозицияСимволаРасшифровка - 1);
        
        СЗ.Добавить(ПерваяНоменклатура, ПерваяНоменклатураРасшифровка);
        Остаток = СтрДлина(Подстрока) - (СтрДлина(ПерваяНоменклатура) + 1);
        ОстатокРасшифровка = СтрДлина(ПодстрокаРасшифровка) - (СтрДлина(ПерваяНоменклатураРасшифровка) + 1);
        
        Возврат ПоискПодстроки(Прав(Подстрока, Остаток), Прав(ПодстрокаРасшифровка,ОстатокРасшифровка));  

    Иначе
        СЗ.Добавить(СокрЛП(Подстрока), СокрЛП(ПодстрокаРасшифровка));
        Возврат ПозицияСимвола;
        КонецЕсли;
КонецФункции

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

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

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

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

Процедура ПереборСтрокТЗ() Экспорт 
Для Каждого Ст из ТЗ Цикл 
Стр = Объект.Товары.Добавить();
Стр.Номенклатура = Ст.Номенклатура; 
Стр.Количество = Ст.Количество; 
Стр.Цена = Ст.Цена; 
Стр.Сумма = Ст.Сумма; 
КонецЦикла; 
КонецПроцедуры 

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

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

    ПереборСтрокТЗ();

КонецПроцедуры
Показать
2. SedovSU@mail.ru 298 25.01.19 10:56 Сейчас в теме
В коде ошибка

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


Нудно метод добавить в цикле использовать


Для Стр = 1 ПО 10 Цикл    
 НоваяСтрока = ТЗ.Добавить();        
//НоваяСтрока.ПолноеНаименование = СокрЛП(Эксель.Cells(Стр,1).Value);
        НоваяСтрока.Номенклатура = СокрЛП(Эксель.Cells(Стр,1).Value);
        НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
        НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
        НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
        //ПозицияСимвола = ПоискПодстроки(СокрЛП(Эксель.Cells(Стр,1).Value),СокрЛП(Эксель.Cells(Стр,1).Value));
        //НоваяСтрока.ПолноеНазвание = СЗ;
    КонецЦикла
Показать
8. senshkr 13 25.01.19 12:58 Сейчас в теме
Последнее Ваше предположение - что-то совсем не то.
(2), (3) - правильно, но не достаточно.
надо еще здесь исправить

Процедура ПереборСтрокТЗ() Экспорт
    Стр = ЭлементыФормы.Товары.ТекущиеДанные;
    Для Каждого Ст из ТЗ Цикл
    Стр.Номенклатура = Ст.Номенклатура;
    Стр.Количество = Ст.Количество;
    Стр.Цена = Ст.Цена;
    Стр.Сумма = Ст.Сумма;
    КонецЦикла;
КонецПроцедуры
Показать


чтобы было так:

Процедура ПереборСтрокТЗ() Экспорт
 //Стр = ЭлементыФормы.Товары.ТекущиеДанные;// неправильно
    Для Каждого Ст из ТЗ Цикл
    НовСтр = Элементы.Товары.Добавить();
    НовСтр.Номенклатура = Ст.Номенклатура;
    НовСтр.Количество = Ст.Количество;
    НовСтр.Цена = Ст.Цена;
    НовСтр.Сумма = Ст.Сумма;
    КонецЦикла;
КонецПроцедуры
Показать
10. _7445_ 25.01.19 13:34 Сейчас в теме
(8)
Спасибо за вниманию.
Писал так:
Процедура ПереборСтрокТЗ() Экспорт 
Для Каждого Ст из ТЗ Цикл 
НовСтр = Элементы.Товары.Добавить(); 
НовСтр.Номенклатура.Наименование = Ст.Номенклатура; 
НовСтр.Количество = Ст.Количество; 
НовСтр.Цена = Ст.Цена; 
НовСтр.Сумма = Ст.Сумма; 
КонецЦикла; 
КонецПроцедуры
Показать

Но выдают ошибку: {Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокумента.Форма(3439,8)}: Переменная не определена (Элементы)
Стр = <<?>>Элементы.Товары.Добавить(); (Проверка: Толстый клиент (обычное приложение))
12. senshkr 13 25.01.19 13:39 Сейчас в теме
(10)
НовСтр = Элементы.Товары.Добавить();


попробуй
НовСтр = ЭлементыФормы.Товары.Добавить();
13. _7445_ 25.01.19 13:43 Сейчас в теме
(12)
Выдают ошибку
{Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокумента.Форма(3438)}: Метод объекта не обнаружен (Добавить)
Стр = ЭлементыФормы.Товары.Добавить();

ДобавитьСтроку() тоже написал
{Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокумента.Форма(3438)}: Обращение к процедуре объекта как к функции (ДобавитьСтроку)
Стр = ЭлементыФормы.Товары.ДобавитьСтроку();
15. senshkr 13 25.01.19 13:44 Сейчас в теме
(13)Пардон, на увидел сначала, что это форма документа.
тогда все через Объект
Объект.Товары.Добавить();
16. _7445_ 25.01.19 13:47 Сейчас в теме
(15)
Спасибо вам огромное
Написал так :
Стр = ЭтотОбъект.Товары.Добавить()
Работает как надо
Спасибо
3. SedovSU@mail.ru 298 25.01.19 10:57 Сейчас в теме
Вот так нужно написать - НоваяСтрока = ТЗ.Добавить(); в цикле укажите

Для Стр = 1 ПО 10 Цикл    
        НоваяСтрока = ТЗ.Добавить();
       //НоваяСтрока.ПолноеНаименование = СокрЛП(Эксель.Cells(Стр,1).Value);
        НоваяСтрока.Номенклатура = СокрЛП(Эксель.Cells(Стр,1).Value);
        НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value);
        НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value);
        НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value);
        //ПозицияСимвола = ПоискПодстроки(СокрЛП(Эксель.Cells(Стр,1).Value),СокрЛП(Эксель.Cells(Стр,1).Value));
        //НоваяСтрока.ПолноеНазвание = СЗ;
    КонецЦикла
Показать
4. _7445_ 25.01.19 11:00 Сейчас в теме
(3)
Не чего не изменился в результате.
И еще почему то не показывает названию номенклатуры
Прикрепленные файлы:
5. _7445_ 25.01.19 11:05 Сейчас в теме
(3)
В окладке здесь цикл не работает. Сразу прерывает
Процедура ПереборСтрокТЗ() Экспорт
    Стр = ЭлементыФормы.Товары.ТекущиеДанные;
    Для Каждого Ст из ТЗ Цикл
    Стр.Номенклатура = Ст.Номенклатура;
    Стр.Количество = Ст.Количество;
    Стр.Цена = Ст.Цена;
    Стр.Сумма = Ст.Сумма;
    КонецЦикла;
КонецПроцедуры
Показать


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


Процедура ПереборСтрокТЗ() Экспорт
    Стр = ЭлементыФормы.Товары.ТекущиеДанные;
    Для Каждого Ст из НоваяСтрока Цикл
    Стр.Номенклатура = Ст.Номенклатура;
    Стр.Количество = Ст.Количество;
    Стр.Цена = Ст.Цена;
    Стр.Сумма = Ст.Сумма;
    КонецЦикла;
КонецПроцедуры
Показать


Тогда в окладке не бывает проблема но результат то и самое (Не показывает все товары)
6. SedovSU@mail.ru 298 25.01.19 11:59 Сейчас в теме
Последняя процедура написано не верно, у вас нет добавления строк в табличную часть. Нужно написать как то так

Процедура ПереборСтрокТЗ() Экспорт 
Для Каждого Ст из НоваяСтрока Цикл 
Стр = Объект.Товары.Добавить();
Стр.Номенклатура = Ст.Номенклатура; 
Стр.Количество = Ст.Количество; 
Стр.Цена = Ст.Цена; 
Стр.Сумма = Ст.Сумма; 
КонецЦикла; 
КонецПроцедуры 
Показать
9. senshkr 13 25.01.19 13:10 Сейчас в теме
Не показывает название Номенклатуры...
Какой тип объекта "Номенклатура"?

Если Справочник, тогда надо еще добавить:
Стр.Номенклатура.Наименование = Ст.Номенклатура;
11. _7445_ 25.01.19 13:37 Сейчас в теме
(9)
Да это справочник. Написал так:
Процедура ПереборСтрокВЭксель()
	
	Попытка
		Путь = "C:\Users\Ulvi Mammadov\Desktop\55.xlsx";
		Excel = Новый COMОбъект("Excel.Application");
		Excel.Workbooks.Open(Путь);
	Исключение
		Сообщить("При открытии файла произошла ошибка! Операция прервана!");
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	 СЗ = Новый СписокЗначений;
	 Попытка
		 Excel.Sheets(1).Select();
	 Исключение
		 Excel.ActiveWorkbook.Close(); 	
		 Excel = 0;
		 Сообщить("Первый лист не найден!");
		 ОтменитьТранзакцию();
		 Возврат;
	 КонецПопытки;
	 
	 vExcel = Лев(Excel.Version, Найти(Excel.Version,".")-1);
	 Если vExcel = "8" тогда
		 КоличествоСтрок = Excel.Cells.CurrentRegion.Rows.Count;
		 КоличествоКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
	 Иначе
		 КоличествоСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
		 КоличествоКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
	 Конецесли;

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

Процедура ПереборСтрокТЗ() Экспорт

	Для Каждого Ст из ТЗ Цикл
    Стр = ЭлементыФормы.Товары.ТекущиеДанные;
	//Стр = Элементы.Товары.Добавить();
	Стр.Номенклатура.Наименование = Ст.Номенклатура;
	Стр.Количество = Ст.Количество;
	Стр.Цена = Ст.Цена;
	Стр.Сумма = Ст.Сумма;
    КонецЦикла;

КонецПроцедуры
Показать


но не показывает названию.
14. senshkr 13 25.01.19 13:44 Сейчас в теме
(11)Пардон, на увидел сначала, что это форма документа.
тогда все через Объект
Объект.Товары.Добавить();
Оставьте свое сообщение

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