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

1. _7445_ 13.02.19 11:29 Сейчас в теме
Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 1С программирование. Данные загружается из эксель файла. Мне надо что он проверил все товары. Таким образом как есть ли токай товар в базе или нет. Если нет тогда он в низу показывало сообщение что токай товар не найден и он не добавил его в ТЗ документа. Сообщение сделал можно но как фильтр поставить ?
Написал код но он добавляет товара. Мне проста надо подсказка что как исправится с этим.
Ниже код и картинка
Спасибо всем за ранее.

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

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

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

	
    Путь = "C:\Users\User\Desktop\Лист Microsoft Excel.xlsx";
    Эксель = Новый 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(Стр,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 , "Файл выбран.");
	Иначе
		Предупреждение("Файл не выбран.");
		Возврат;
	КонецЕсли;
	


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

	ПереборСтрокВЭксель();
	
	
	ПереборСтрокТЗ();

КонецПроцедуры
Показать
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
4. SedovSU@mail.ru 297 13.02.19 12:00 Сейчас в теме
(3) можно просто не добавлять эту строку и все

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

Проблему можно так решить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SedovSU@mail.ru 297 13.02.19 11:32 Сейчас в теме
В коде добишите вот в этом месте

Для Стр = 1 ПО ФайлСтрок Цикл 
НоваяСтрока = ТЗ.Добавить(); 
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
Если Номенклатура.Пустая() Тогда
Сообщить("Номенклатура " + СокрЛП(Эксель.Cells(Стр,1).Value) + " не найдена!");
Иначе
НоваяСтрока.Номенклатура = Номенклатура; 
Конецесли
//НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value)); 
НоваяСтрока.Количество = СокрЛП(Эксель.Cells(Стр,2).Value); 
НоваяСтрока.Цена = СокрЛП(Эксель.Cells(Стр,3).Value); 
НоваяСтрока.Сумма = СокрЛП(Эксель.Cells(Стр,4).Value); 
КонецЦикла; 
Показать
3. _7445_ 13.02.19 11:53 Сейчас в теме
(2)
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эксель.Cells(Стр,1).Value));
Если Номенклатура.Пустая() Тогда
Сообщить("Номенклатура " + СокрЛП(Эксель.Cells(Стр,1).Value) + " не найдена!");
Иначе
НоваяСтрока.Номенклатура = Номенклатура;
Конецесли

Спасибо вам за вниманию
Код работает но по моему надо добавить код для удаление строк из ТЗ или сразу в экселя.
Это так надо решить или есть более оптимальный вариант?
Прикрепленные файлы:
4. SedovSU@mail.ru 297 13.02.19 12:00 Сейчас в теме
(3) можно просто не добавлять эту строку и все

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

Проблему можно так решить
5. _7445_ 13.02.19 12:07 Сейчас в теме
(4) Спасибо вам огромное. Вы много раз помогли мне решить проблему.
Но интересна что почему этот код не работал
Эксель.Rows(Строка(Стр)).Delete();
или
Эксель.Worksheets("Лист1").Rows(Стр).Delete();
. Когда запускаешь программу бывает без конечный цикл.
И еще последний какие книги можете рекомендовать для программирование и для COM объектов?
Спасибо вам еще раз
6. SedovSU@mail.ru 297 13.02.19 12:15 Сейчас в теме
(5) Да не зачто!

Вот по вопросу Эксель.Rows(Строка(Стр)).Delete(); Смотрите, в екселе 250 тыс. строк, если вы хоть какую то удалите то их количество все равно останется. Сам я ни когда не пробывал удалять строки в ексель но чтобы убедиться работатает или нет, до сделайте 10 строк в екселе с разными цветами и удалите хоть одну, если вы действительно увидите что они удалились то тогда данный функционал работает.

Что касается книжек, мне большего всего нравиться книга "Просты примеры разработки на 1С:Предприятии" в ней собраны основные методы и подходы к решению, там кстати и про com-объекты есть описание

А вот если у вас зацикливание происходит, следовательно, у вас программа не знает когда ее завершить. Тут нужен какой-то либо признак или счетчик чтобы выходит из цикла
Оставьте свое сообщение

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