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

1. _7445_ 09.03.19 19:35 Сейчас в теме
Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 1С программирование. В УТ 10.3. Обработка работает но есть токая проблема. Если в файле эксел есть номенклатура который нет в базу тогда программ автоматически добавляет номенклатуру в базе. Но после этого в справочнике появляется дубль для товаров который не находится не в одном группе. Как исправится с этим? Можете дать подсказке для решение?
Спасибо всем за ранее. В коде (комментариях) есть еще один вариант но когда не работал так.
Процедура КнопкаВыполнитьНажатие(Кнопка)	
	Если  ТабличнаяЧасть.Количество() = 0 Тогда
		Предупреждение("Для создания документа необходимо заполнить таблицу",,"Внимание");
		Возврат;
	КонецЕсли;
	
	Поступление = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
	Для Каждого Стр Из ТабличнаяЧасть Цикл
		СтрокаЗаказ = ТабличнаяЧасть.Добавить();
		СтрокаЗаказ.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Стр.Номенклатура);
		СтрокаЗаказ.Цена = Стр.Цена;
		СтрокаЗаказ.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("ƏD");
		СтрокаЗаказ.Коэффициент =  1;
		СтрокаЗаказ.Количество = Стр.Количество; 			
		СтрокаЗаказ.Сумма =  Стр.Сумма;
		СтрокаЗаказ.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
	КонецЦикла;
	ОткрытьЗначение(Поступление);	
КонецПроцедуры


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


Процедура ЗаполнитьНажатие(Элемент)
	ТабличнаяЧасть.Очистить();
	ИмяФайла = ПутьКФайлу;
	Если ПустаяСтрока(ИмяФайла) Тогда
		Предупреждение("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
		Возврат;
	КонецЕсли;
	
	Попытка
		ExcelПриложение = Новый COMОбъект("Excel.Application");
	Исключение
		Сообщить("Ошибка при загрузке Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат;
	КонецПопытки;

	Попытка
		ExcelПриложение.WorkBooks.Open(ИмяФайла);
	Исключение
		Сообщить("Ошибка открытия файла Microsoft Excel." + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
	КонецПопытки;

	Попытка
		ExcelПриложение.Sheets().Select();
		Версия = Лев(ExcelПриложение.Version,Найти(ExcelПриложение.Version,".")-1);
		Если Версия = "8" тогда
			ExcelПоследняяСтрока   = ExcelПриложение.Cells.CurrentRegion.Rows.Count;
			ExcelПоследняяКолонка = Макс(ExcelПриложение.Cells.CurrentRegion.Columns.Count, 13);
		Иначе
			ExcelПоследняяСтрока   = ExcelПриложение.Cells(1,1).SpecialCells(11).Row;
			ExcelПоследняяКолонка = ExcelПриложение.Cells(1,1).SpecialCells(11).Column;   
		Конецесли;
	Исключение
		Сообщить("Ошибка открытия листа №1 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
		ExcelПриложение.Quit();
	КонецПопытки;

	КЧ = Новый КвалификаторыЧисла(15,2);
	КС = Новый КвалификаторыСтроки(100);
	Массив = Новый Массив;
	Массив.Добавить(Тип("Строка"));
	ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
	Массив.Очистить();
	Массив.Добавить(Тип("Число"));
	ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
	Массив.Очистить();
	Массив.Добавить(Тип("СправочникСсылка.Номенклатура"));
	ОписаниеТиповНом = Новый ОписаниеТипов(Массив, , ,КЧ);
  
	ТабличнаяЧасть.Очистить();
	ЭлементыФормы.ТабличнаяЧасть.Значение.Очистить();

	Процессор = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	Процессор.ОтображатьПроцентВывода = Истина;
	Процессор.НачатьВывод();
	Элемент = Новый ЭлементРезультатаКомпоновкиДанных;
  
	Для Строка = 2 По ExcelПоследняяСтрока Цикл
		ОбработкаПрерыванияПользователя();
		ОсновнаяЕдиницаПоКлассификатору = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнаяЕдиницаПоКлассификатору");
		
	СтруктураПолей = Новый Структура;
	ПроверитьНоменклатуры = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	Номенклатура.Ссылка
	               |ИЗ
	               |	Справочник.Номенклатура КАК Номенклатура
	               |ГДЕ
	               |	Номенклатура.Ссылка = &Номенклатура";
	Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
	Выборка = Запрос.Выполнить().Выбрать();
	Если НЕ Выборка.Следующий() Тогда
		    НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
			НоваяНоменклатура.Наименование = ПроверитьНоменклатуры;
			НоваяНоменклатура.НаименованиеПолное = ПроверитьНоменклатуры;				
			НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);		
			НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
			НоваяНоменклатура.ЕдиницаДляОтчетов = ОсновнаяЕдиницаПоКлассификатору;
			НоваяНоменклатура.ЕдиницаХраненияОстатков = ОсновнаяЕдиницаПоКлассификатору;
			НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
			НоваяНоменклатура.Записать();
		    КонецЕсли;
	
	Наименование = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);
	Количество = ExcelПриложение.Cells(Строка, КоличествоКол).Value;
	Цена = ExcelПриложение.Cells(Строка, ЦенаКол).Value;
	Сумма = ExcelПриложение.Cells(Строка, СуммаКол).Value;

	СтруктураПолей.Вставить("Наименование", Наименование);
	СтруктураПолей.Вставить("Количество", Количество);
	СтруктураПолей.Вставить("Цена", Цена);
	СтруктураПолей.Вставить("Сумма", Сумма);
	
		
	//ПроверитьНоменклатуры = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование));
	//Если НЕ ЗначениеЗаполнено(ПроверитьНоменклатуры) Тогда
			//НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
			//НоваяНоменклатура.Наименование = Наименование;
			//НоваяНоменклатура.НаименованиеПолное = Наименование;				
			//НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);		
			//НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
			//НоваяНоменклатура.ЕдиницаДляОтчетов = НоваяНоменклатура.БазоваяЕдиницаИзмерения;
			//НоваяНоменклатура.ЕдиницаХраненияОстатков = НоваяНоменклатура.БазоваяЕдиницаИзмерения;
			//НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
			//НоваяНоменклатура.Записать();
		//	КонецЕсли;	

	Стр = ЭлементыФормы.ТабличнаяЧасть.Значение.Добавить();
 	Стр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование));	
	Стр.Количество = Количество;
	Стр.Цена = Цена;
	Стр.Сумма = Сумма;	

	Элемент.ПроцентВывода = Строка/ExcelПоследняяСтрока*100;
	Процессор.ВывестиЭлемент(Элемент);
	
  КонецЦикла;
  Процессор.ЗакончитьВывод();
  ExcelПриложение.Quit();
КонецПроцедуры
Показать
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1050439 7 09.03.19 20:01 Сейчас в теме
Может попробовать

Результат = Запрос.Выполнить();

Если Результат.Пустой() Тогда

КонецЕсли;
5. _7445_ 10.03.19 10:00 Сейчас в теме
3. user790109 10 09.03.19 21:11 Сейчас в теме
Ну во первых лучше на небольшом примере где у тебя дублируется номенклатура посмотреть почему твой код не отрабатывает. Во вторых я считаю что лучше искать через ПОДОБНО и обращаться к Наименованию.. В Третих
ПроверитьНоменклатуры = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);    --это тип строка?
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Номенклатура.Ссылка
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |ГДЕ
                   |    Номенклатура.Ссылка = &Номенклатура";

ПроверитьНоменклатуры--- что за тип данных, не строка случаем? а в запросе ты сраниваешь Ссылку с строкой?
4. _7445_ 10.03.19 10:00 Сейчас в теме
(3)
Да это тип строка.
В запросе сравниваются ссылка с типом строка.
Это не хороший способ?
7. user1050439 7 10.03.19 10:07 Сейчас в теме
(4)

Нет конечно, надо Номенклатура.Наименование сравнивать, это тип строка - с Экселевской строкой.
10. _7445_ 10.03.19 10:17 Сейчас в теме
(7)
ВЫБРАТЬ
                   |    Номенклатура.Наименование
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |ГДЕ
                   |    Номенклатура.Наименование= &Номенклатура";

Так же не будить работать
11. user790109 10 10.03.19 10:21 Сейчас в теме
(4) Это неверны способ сравнивать различные типы данных. Попробуйте как нибудь так
Запрос.Текст = "ВЫБРАТЬ
    |    Номенклатура.Наименование
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Наименование ПОДОБНО &Номенклатура";
    Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры + "%");
12. _7445_ 10.03.19 10:30 Сейчас в теме
(11)

Код не проверяет номенклатуры
(11)
Прикрепленные файлы:
20. user790109 10 10.03.19 12:09 Сейчас в теме
(12)т.е при выполнении запроса Запрос.Выполнить().Выгрузить().Количество() = 0?
21. _7445_ 10.03.19 12:19 Сейчас в теме
(20)
Я уже не знаю в чем беда. Код проста не работает этот дубль там.
Вариант 1 - Если Запрос.Выполнить().Выгрузить().Количество() = 0 Тогда
Вариант 2 - Выборка = Запрос.Выполнить().Выгрузить();
Если Выборка.Количество() = 0 Тогда
Не работает
Полный код обработке -
Процедура КнопкаВыполнитьНажатие(Кнопка)	
	Если  ТабличнаяЧасть.Количество() = 0 Тогда
		Предупреждение("Для создания документа необходимо заполнить таблицу",,"Внимание");
		Возврат;
	КонецЕсли;
	
	Поступление = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
	Для Каждого Стр Из ТабличнаяЧасть Цикл
		СтрокаЗаказ = ТабличнаяЧасть.Добавить();
		СтрокаЗаказ.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Стр.Номенклатура);
		СтрокаЗаказ.Цена = Стр.Цена;
		СтрокаЗаказ.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("ƏD");
		СтрокаЗаказ.Коэффициент =  1;
		СтрокаЗаказ.Количество = Стр.Количество; 			
		СтрокаЗаказ.Сумма =  Стр.Сумма;
		СтрокаЗаказ.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
	КонецЦикла;
	ОткрытьЗначение(Поступление);	
КонецПроцедуры


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


Процедура ЗаполнитьНажатие(Элемент)
	ТабличнаяЧасть.Очистить();
	ИмяФайла = ПутьКФайлу;
	Если ПустаяСтрока(ИмяФайла) Тогда
		Предупреждение("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
		Возврат;
	КонецЕсли;
	
	Попытка
		ExcelПриложение = Новый COMОбъект("Excel.Application");
	Исключение
		Сообщить("Ошибка при загрузке Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат;
	КонецПопытки;

	Попытка
		ExcelПриложение.WorkBooks.Open(ИмяФайла);
	Исключение
		Сообщить("Ошибка открытия файла Microsoft Excel." + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
	КонецПопытки;

	Попытка
		Если Страница = 0 Или Страница < 0 Тогда
		ExcelПриложение.Sheets(1).Select();
	Иначе
		ExcelПриложение.Sheets(Страница).Select();
		КонецЕсли;
		Версия = Лев(ExcelПриложение.Version,Найти(ExcelПриложение.Version,".")-1);
		Если Версия = "8" тогда
			ExcelПоследняяСтрока   = ExcelПриложение.Cells.CurrentRegion.Rows.Count;
			ExcelПоследняяКолонка = Макс(ExcelПриложение.Cells.CurrentRegion.Columns.Count, 13);
		Иначе
			ExcelПоследняяСтрока   = ExcelПриложение.Cells(1,1).SpecialCells(11).Row;
			ExcelПоследняяКолонка = ExcelПриложение.Cells(1,1).SpecialCells(11).Column;   
		Конецесли;
	Исключение
		Сообщить("Ошибка открытия листа №1 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
		ExcelПриложение.Quit();
	КонецПопытки;

	КЧ = Новый КвалификаторыЧисла(15,2);
	КС = Новый КвалификаторыСтроки(100);
	Массив = Новый Массив;
	Массив.Добавить(Тип("Строка"));
	ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
	Массив.Очистить();
	Массив.Добавить(Тип("Число"));
	ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
	Массив.Очистить();
	Массив.Добавить(Тип("СправочникСсылка.Номенклатура"));
	ОписаниеТиповНом = Новый ОписаниеТипов(Массив, , ,КЧ);
  
	ТабличнаяЧасть.Очистить();
	ЭлементыФормы.ТабличнаяЧасть.Значение.Очистить();

	Процессор = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	Процессор.ОтображатьПроцентВывода = Истина;
	Процессор.НачатьВывод();
	Элемент = Новый ЭлементРезультатаКомпоновкиДанных;
  
	Для Строка = 2 По ExcelПоследняяСтрока Цикл
		ОбработкаПрерыванияПользователя();
		ОсновнаяЕдиницаПоКлассификатору = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнаяЕдиницаПоКлассификатору");
		
	СтруктураПолей = Новый Структура;
	ПроверитьНоменклатуры = Строка(СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value));	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	Номенклатура.Ссылка
	               |ИЗ
	               |	Справочник.Номенклатура КАК Номенклатура
	               |ГДЕ
	               |	Номенклатура.Ссылка = &Номенклатура";
	Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
	Выборка = Запрос.Выполнить().Выгрузить();
	 Если Выборка.Количество() = 0 Тогда
			НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
			НоваяНоменклатура.Наименование = ПроверитьНоменклатуры;
			НоваяНоменклатура.НаименованиеПолное = ПроверитьНоменклатуры;				
			НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);		
			НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
			НоваяНоменклатура.ЕдиницаДляОтчетов = ОсновнаяЕдиницаПоКлассификатору;
			НоваяНоменклатура.ЕдиницаХраненияОстатков = ОсновнаяЕдиницаПоКлассификатору;
			НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
			НоваяНоменклатура.Записать();
			КонецЕсли;
			
				
	Наименование = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);
	Количество = ExcelПриложение.Cells(Строка, КоличествоКол).Value;
	Цена = ExcelПриложение.Cells(Строка, ЦенаКол).Value;
	Сумма = ExcelПриложение.Cells(Строка, СуммаКол).Value;

	СтруктураПолей.Вставить("Наименование", Наименование);
	СтруктураПолей.Вставить("Количество", Количество);
	СтруктураПолей.Вставить("Цена", Цена);
	СтруктураПолей.Вставить("Сумма", Сумма);
	

	Стр = ЭлементыФормы.ТабличнаяЧасть.Значение.Добавить();
 	Стр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование),ИСТИНА);	
	Стр.Количество = Количество;
	Стр.Цена = Цена;
	Стр.Сумма = Сумма;	

	Элемент.ПроцентВывода = Строка/ExcelПоследняяСтрока*100;
	Процессор.ВывестиЭлемент(Элемент);
	
  КонецЦикла;
  Процессор.ЗакончитьВывод();
  ExcelПриложение.Quit();
КонецПроцедуры

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

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
	СохранитьЗначение("НоменклатураКолонка", НоменклатураКол);
	СохранитьЗначение("КоличествоКолонка", КоличествоКол);
	СохранитьЗначение("ЦенаКолонка", ЦенаКол);
	СохранитьЗначение("СуммаКолонка", СуммаКол);
КонецПроцедуры
Показать
22. user790109 10 10.03.19 13:00 Сейчас в теме
(21) Еще раз почему вы к ТИПУ "СправочникСсылка.Номенклатура" в параметр ставите ТИП "Строка"? Если вы не понимаете разницы почитайте про типы данных, как правильно строить запросы и тд. Ниже уже много хороших советов предложили да и я писал про ПОДОБНО. Ну если не нравится подобно хотя бы Номенклатура.наименование = &ПроверитьНоменклатуры. Если Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ПроверитьНоменклатуры),ИСТИНА) не находит, значит есть отличие. Попробуйте на той номенклатуре которая дублируется при загрзку посмотреть в отладке почему не отрабатывает. Самый эффективный способ разобраться самому. надлеюсь умеете ставить точку останова
6. alivan 10.03.19 10:07 Сейчас в теме
Такое впечатление, что много лишнего кода.

Вот это непонятно зачем:
СтруктураПолей = Новый Структура;
ПроверитьНоменклатуры = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
Выборка = Запрос.Выполнить().Выбрать();
Если НЕ Выборка.Следующий() Тогда
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = ПроверитьНоменклатуры;
НоваяНоменклатура.НаименованиеПолное = ПроверитьНоменклатуры;
НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);
НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.ЕдиницаДляОтчетов = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.ЕдиницаХраненияОстатков = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
НоваяНоменклатура.Записать();
КонецЕсли;
Показать


Сначала проверьте

Имя = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование));
Если Имя = Справочники.Номенклатура.ПустаяСсылка() Тогда
///..... создаем новый элемент..
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = Имя;
..............
КонецЕсли;


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

Понятно, что с запросом было бы более правильно и оптимально, однако вы и запрос используете не совсем коррестно и все равно используете метод НайтиПоНаименованию.
8. _7445_ 10.03.19 10:10 Сейчас в теме
(6)
Запрос.Текст = "ВЫБРАТЬ
	|	Номенклатура.Наименование
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Наименование ПОДОБНО &Номенклатура";
	Запрос.УстановитьПараметр("Номенклатура", "%" + ПроверитьНоменклатуры + "%");
	Выборка = Запрос.Выполнить().Выбрать();
	Если НЕ Выборка.Следующий() Тогда
Показать


Написал так. работает дубль нет но есть токая проблема что у меня в файле есть товар - "экран делл" и "экран" а код проста добавляет "экран делл" два раза. Но "экран" не проверяет
13. alivan 10.03.19 11:25 Сейчас в теме
(8)
а код проста добавляет "экран делл" два раза. Но "экран" не проверяет


Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование),ИСТИНА);

Для поиска ТОЧНОГО СООТВЕТСТВИЯ нужно обязательно это указать.
9. _7445_ 10.03.19 10:15 Сейчас в теме
(6)
Справочники.Номенклатура.ПустаяСсылка() Тогда

Сейчас есть дубль и не проверка номенклатуры
14. alivan 10.03.19 11:31 Сейчас в теме
(9)
Сейчас есть дубль и не проверка номенклатуры

Вы два раза делаете одно и то же, либо я чего-то не понимаю.
Сначала вы ищите элемент справочника по наименованию.
Затем добавляете, если не находите.
Потом, снова ищите по этому же наименованию.
Зачем? В одном месте ищите, добавляете или используете найденный, и используете для создания документа.
15. _7445_ 10.03.19 11:32 Сейчас в теме
(14)
Проблема здесь.
Прикрепленные файлы:
18. alivan 10.03.19 11:41 Сейчас в теме
(15)
Проблема здесь.

Пробуйте
 Стр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование),ИСТИНА)
16. _7445_ 10.03.19 11:35 Сейчас в теме
(14)
Только один раз проверяет номенклатуру если нет тогда добавляет иначе проста записывает а ТЗ. Но если есть товар с именам "Телевизор большой" и "Телевизор" тогда код показывает только "Телевизор большой".
17. alivan 10.03.19 11:40 Сейчас в теме
(16)
1. Первый раз ищите номенклатуру и добавляете, если нет
 СтруктураПолей = Новый Структура;
/// Берете из Excel
    ПроверитьНоменклатуры = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);   
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Номенклатура.Ссылка
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |ГДЕ
                   |    Номенклатура.Ссылка = &Номенклатура";
    Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
    Выборка = Запрос.Выполнить().Выбрать();
    Если НЕ Выборка.Следующий() Тогда
            НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
            НоваяНоменклатура.Наименование = ПроверитьНоменклатуры;
            НоваяНоменклатура.НаименованиеПолное = ПроверитьНоменклатуры;                
            НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);        
            НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
            НоваяНоменклатура.ЕдиницаДляОтчетов = ОсновнаяЕдиницаПоКлассификатору;
            НоваяНоменклатура.ЕдиницаХраненияОстатков = ОсновнаяЕдиницаПоКлассификатору;
            НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
            НоваяНоменклатура.Записать();
            КонецЕсли;
    
Показать


2. Второй раз ищите номенклатуру
   
/// Берете из Excel
Наименование = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);
........
Стр = ЭлементыФормы.ТабличнаяЧасть.Значение.Добавить();
     Стр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование));  
    Стр.Количество = Количество;
    Стр.Цена = Цена;
    Стр.Сумма = Сумма;    
Показать


И все в одной процедуре.
19. _7445_ 10.03.19 11:56 Сейчас в теме
(17)всё работает но дубль есть
ТабличнаяЧасть.Очистить();
	ИмяФайла = ПутьКФайлу;
	Если ПустаяСтрока(ИмяФайла) Тогда
		Предупреждение("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
		Возврат;
	КонецЕсли;
	
	Попытка
		ExcelПриложение = Новый COMОбъект("Excel.Application");
	Исключение
		Сообщить("Ошибка при загрузке Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат;
	КонецПопытки;

	Попытка
		ExcelПриложение.WorkBooks.Open(ИмяФайла);
	Исключение
		Сообщить("Ошибка открытия файла Microsoft Excel." + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
	КонецПопытки;

	Попытка
		Если Страница = 0 Или Страница < 0 Тогда
		ExcelПриложение.Sheets(1).Select();
	Иначе
		ExcelПриложение.Sheets(Страница).Select();
		КонецЕсли;
		Версия = Лев(ExcelПриложение.Version,Найти(ExcelПриложение.Version,".")-1);
		Если Версия = "8" тогда
			ExcelПоследняяСтрока   = ExcelПриложение.Cells.CurrentRegion.Rows.Count;
			ExcelПоследняяКолонка = Макс(ExcelПриложение.Cells.CurrentRegion.Columns.Count, 13);
		Иначе
			ExcelПоследняяСтрока   = ExcelПриложение.Cells(1,1).SpecialCells(11).Row;
			ExcelПоследняяКолонка = ExcelПриложение.Cells(1,1).SpecialCells(11).Column;   
		Конецесли;
	Исключение
		Сообщить("Ошибка открытия листа №1 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
		ExcelПриложение.Quit();
	КонецПопытки;

	КЧ = Новый КвалификаторыЧисла(15,2);
	КС = Новый КвалификаторыСтроки(100);
	Массив = Новый Массив;
	Массив.Добавить(Тип("Строка"));
	ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
	Массив.Очистить();
	Массив.Добавить(Тип("Число"));
	ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
	Массив.Очистить();
	Массив.Добавить(Тип("СправочникСсылка.Номенклатура"));
	ОписаниеТиповНом = Новый ОписаниеТипов(Массив, , ,КЧ);
  
	ТабличнаяЧасть.Очистить();
	ЭлементыФормы.ТабличнаяЧасть.Значение.Очистить();

	Процессор = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	Процессор.ОтображатьПроцентВывода = Истина;
	Процессор.НачатьВывод();
	Элемент = Новый ЭлементРезультатаКомпоновкиДанных;
  
	Для Строка = 2 По ExcelПоследняяСтрока Цикл
		ОбработкаПрерыванияПользователя();
		ОсновнаяЕдиницаПоКлассификатору = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнаяЕдиницаПоКлассификатору");
		
	СтруктураПолей = Новый Структура;
	ПроверитьНоменклатуры = Строка(СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value));	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	Номенклатура.Ссылка
	               |ИЗ
	               |	Справочник.Номенклатура КАК Номенклатура
	               |ГДЕ
	               |	Номенклатура.Ссылка = &Номенклатура";
	//Запрос.Текст = "ВЫБРАТЬ
	//|    Номенклатура.Наименование
	//|ИЗ
	//|    Справочник.Номенклатура КАК Номенклатура
	//|ГДЕ
	//|    Номенклатура.Наименование ПОДОБНО &Номенклатура";
	Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
	Выборка = Запрос.Выполнить().Выбрать();
	Если НЕ Выборка.Следующий() Тогда
			НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
			НоваяНоменклатура.Наименование = ПроверитьНоменклатуры;
			НоваяНоменклатура.НаименованиеПолное = ПроверитьНоменклатуры;				
			НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);		
			НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
			НоваяНоменклатура.ЕдиницаДляОтчетов = ОсновнаяЕдиницаПоКлассификатору;
			НоваяНоменклатура.ЕдиницаХраненияОстатков = ОсновнаяЕдиницаПоКлассификатору;
			НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
			НоваяНоменклатура.Записать();
			КонецЕсли;
			
				
	Наименование = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);
	Количество = ExcelПриложение.Cells(Строка, КоличествоКол).Value;
	Цена = ExcelПриложение.Cells(Строка, ЦенаКол).Value;
	Сумма = ExcelПриложение.Cells(Строка, СуммаКол).Value;

	СтруктураПолей.Вставить("Наименование", Наименование);
	СтруктураПолей.Вставить("Количество", Количество);
	СтруктураПолей.Вставить("Цена", Цена);
	СтруктураПолей.Вставить("Сумма", Сумма);
	

	Стр = ЭлементыФормы.ТабличнаяЧасть.Значение.Добавить();
 	Стр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование),ИСТИНА);	
	Стр.Количество = Количество;
	Стр.Цена = Цена;
	Стр.Сумма = Сумма;	

	Элемент.ПроцентВывода = Строка/ExcelПоследняяСтрока*100;
	Процессор.ВывестиЭлемент(Элемент);
	
  КонецЦикла;
  Процессор.ЗакончитьВывод();
  ExcelПриложение.Quit();
Показать
23. alivan 10.03.19 17:56 Сейчас в теме
(19)
всё работает но дубль есть

Может в самом справочнике есть дубли и нужно почистить справочник?
24. Tatitutu 3847 12.03.19 14:06 Сейчас в теме
Оставьте свое сообщение

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