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 Сейчас в теме
У вас он почему не создает потому что у вас "Подобно", поставьте "Равно"
Оставьте свое сообщение

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