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

1. _7445_ 11.03.19 08:39 Сейчас в теме
Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 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." + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
	КонецПопытки;

	Попытка
		Если Страница = 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();
КонецПроцедуры

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

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

Запрос так тоже попробовал но не работал. С таким запросам код проста дублировал номенклатуры который не находится не в одном группе. Проста дубль создал для каждого.
Запрос.Текст = "ВЫБРАТЬ
	               |	Номенклатура.Ссылка
	               |ИЗ
	               |	Справочник.Номенклатура КАК Номенклатура
	               |ГДЕ
	               |	Номенклатура.Ссылка = &Номенклатура";
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
14. SedovSU@mail.ru 297 11.03.19 10:18 Сейчас в теме
(13) у вас в запросе нужно параметр изменить, убирите символы %%

Запрос.Текст = "ВЫБРАТЬ
	               |	Номенклатура.Наименование
	               |ИЗ
	               |	Справочник.Номенклатура КАК Номенклатура
	               |ГДЕ
	               |	Номенклатура.Наименование = &Номенклатура";
	Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. SedovSU@mail.ru 297 11.03.19 09:21 Сейчас в теме
Напишите запрос на поиск номенклатуры по другому

    Запрос.Текст = "ВЫБРАТЬ
                   |    Номенклатура.Наименование
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |ГДЕ
                   |    Номенклатура.Наименование = &Номенклатура";
    Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
4. _7445_ 11.03.19 09:45 Сейчас в теме
(2)
Спасибо за вниманию.
Сейчас код делает дубль.
Прикрепленные файлы:
5. SedovSU@mail.ru 297 11.03.19 09:49 Сейчас в теме
(4) а вот так попробуйте работать

    ПроверитьНоменклатуры = Строка(СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value));    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Номенклатура.Наименование
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |ГДЕ
                   |    Номенклатура.Наименование ПОДОБНО &Номенклатура";
    Запрос.УстановитьПараметр("Номенклатура","%" + ПроверитьНоменклатуры + "%");
    Выборка = Запрос.Выполнить().Выбрать();
    Если ВыборкаРезультата.Количество() = 0 Тогда
            НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
            НоваяНоменклатура.Наименование = ПроверитьНоменклатуры;
            НоваяНоменклатура.НаименованиеПолное = ПроверитьНоменклатуры;                
            НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);        
            НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
            НоваяНоменклатура.ЕдиницаДляОтчетов = ОсновнаяЕдиницаПоКлассификатору;
            НоваяНоменклатура.ЕдиницаХраненияОстатков = ОсновнаяЕдиницаПоКлассификатору;
            НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
            НоваяНоменклатура.Записать();
      КонецЕсли;
Показать
6. _7445_ 11.03.19 09:53 Сейчас в теме
(5)Дубль исчезло но пробела остался еще. Уже 2 дня не могу решить
7. SedovSU@mail.ru 297 11.03.19 09:56 Сейчас в теме
(6) Какая еще проблема у вас возникла?
8. _7445_ 11.03.19 09:58 Сейчас в теме
(7)Проблема остался проста.
Для примера говорим что файле в первом строке есть товар с названием "Телевизор самсунг" а в втором строке "Телевизор". Код проверяет что товар. Если в базе нет такого товара тогда автоматически добавляет иначе записывает в табличный часть. Проблема в чем что код добавляет "Телевизор самсунг" но "Телевизор" не добавляет. Видит когда одинокие.
10. SedovSU@mail.ru 297 11.03.19 10:03 Сейчас в теме
(8) НУ вот, вам первое что в запросе нужно убрать подобно и написать равно

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


Второе, там где вы осуществляете поиск номенклатуры - использовать поиск по точному наименованию, то есть добавить параметр ИСТИНА

СтрокаЗаказ.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Стр.Номенклатура, Истина);
9. _7445_ 11.03.19 10:02 Сейчас в теме
(7)
Прикрепленные файлы:
11. SedovSU@mail.ru 297 11.03.19 10:05 Сейчас в теме
(9) Добавить в условие запроса Номенклатура.Наименование ПОДОБНО &Номенклатура, а явно напишите Номенклатура.Наименование = &Номенклатура
12. _7445_ 11.03.19 10:14 Сейчас в теме
(11)В моем коде по-моему полная ерунда.
Но сейчас код заново делает дубль.
13. _7445_ 11.03.19 10:15 Сейчас в теме
14. SedovSU@mail.ru 297 11.03.19 10:18 Сейчас в теме
(13) у вас в запросе нужно параметр изменить, убирите символы %%

Запрос.Текст = "ВЫБРАТЬ
	               |	Номенклатура.Наименование
	               |ИЗ
	               |	Справочник.Номенклатура КАК Номенклатура
	               |ГДЕ
	               |	Номенклатура.Наименование = &Номенклатура";
	Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
15. _7445_ 11.03.19 10:38 Сейчас в теме
(14)
Спасибо вам большое. Два дня не могла решить.
А можете объяснять почему дублировал и Не проверил названию товара ?
16. SedovSU@mail.ru 297 11.03.19 10:52 Сейчас в теме
(15) На самом деле как было написано, программа все верно делала. И поэтому у вас создавались дубли.
Нужно было во первых в условии запрос убрать ПОДОБНО и второе, в параметре запроса убрать символы %%
В противно случае программа например берет номенклатуру Телевизор и подобные ищет в справочнике, и находит Телевизор Самсунг и не создает новую номенклатуру ввиду того что подобную нашел
3. SedovSU@mail.ru 297 11.03.19 09:22 Сейчас в теме
У вас он почему не создает потому что у вас "Подобно", поставьте "Равно"
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)