Здравствуйте. Я плохо знаю русский. Извините за этого. Я еще новичок в 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();
КонецПроцедуры
ПоказатьПрикрепленные файлы:
По теме из базы знаний
- Универсальная обработка для загрузки данных из Экселя в табличную часть документа
- Загрузка данных из ОФД в 1С:Бухгалтерию 3.0, 1С:КА 2.4, 2.5, УНФ 1.6/3.0 о денежных поступлениях (чеках)
- Загрузка номенклатуры из Эксель (новый взгляд)
- Универсальная загрузка данных из Экселя по основным параметрам для УТ 11.5
- Загрузка данных из экселя в Распоряжение на перечисление на карты МИР
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Ну во первых лучше на небольшом примере где у тебя дублируется номенклатура посмотреть почему твой код не отрабатывает. Во вторых я считаю что лучше искать через ПОДОБНО и обращаться к Наименованию.. В Третих
ПроверитьНоменклатуры--- что за тип данных, не строка случаем? а в запросе ты сраниваешь Ссылку с строкой?
ПроверитьНоменклатуры = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value); --это тип строка?
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Номенклатура";
ПроверитьНоменклатуры--- что за тип данных, не строка случаем? а в запросе ты сраниваешь Ссылку с строкой?
(4) Это неверны способ сравнивать различные типы данных. Попробуйте как нибудь так
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры + "%");
(20)
Я уже не знаю в чем беда. Код проста не работает этот дубль там.
Вариант 1 - Если Запрос.Выполнить().Выгрузить().Количество() = 0 Тогда
Вариант 2 - Выборка = Запрос.Выполнить().Выгрузить();
Если Выборка.Количество() = 0 Тогда
Не работает
Полный код обработке -
Я уже не знаю в чем беда. Код проста не работает этот дубль там.
Вариант 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();
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
НоменклатураКол = ВосстановитьЗначение("НоменклатураКолонка");
КоличествоКол = ВосстановитьЗначение("КоличествоКолонка");
ЦенаКол = ВосстановитьЗначение("ЦенаКолонка");
СуммаКол = ВосстановитьЗначение("СуммаКолонка");
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
СохранитьЗначение("НоменклатураКолонка", НоменклатураКол);
СохранитьЗначение("КоличествоКолонка", КоличествоКол);
СохранитьЗначение("ЦенаКолонка", ЦенаКол);
СохранитьЗначение("СуммаКолонка", СуммаКол);
КонецПроцедуры
Показать
(21) Еще раз почему вы к ТИПУ "СправочникСсылка.Номенклатура" в параметр ставите ТИП "Строка"? Если вы не понимаете разницы почитайте про типы данных, как правильно строить запросы и тд. Ниже уже много хороших советов предложили да и я писал про ПОДОБНО. Ну если не нравится подобно хотя бы Номенклатура.наименование = &ПроверитьНоменклатуры. Если Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ПроверитьНоменклатуры),ИСТИНА) не находит, значит есть отличие. Попробуйте на той номенклатуре которая дублируется при загрзку посмотреть в отладке почему не отрабатывает. Самый эффективный способ разобраться самому. надлеюсь умеете ставить точку останова
Такое впечатление, что много лишнего кода.
Вот это непонятно зачем:
Сначала проверьте
Имя = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование));
Если Имя = Справочники.Номенклатура.ПустаяСсылка() Тогда
///..... создаем новый элемент..
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = Имя;
..............
КонецЕсли;
Стр = ЭлементыФормы.ТабличнаяЧасть.Значение.Добавить();
Стр.Номенклатура = НоваяНоменклатура ;
Стр.Количество = Количество;
Стр.Цена = Цена;
Стр.Сумма = Сумма; Показать
Понятно, что с запросом было бы более правильно и оптимально, однако вы и запрос используете не совсем коррестно и все равно используете метод НайтиПоНаименованию.
Вот это непонятно зачем:
СтруктураПолей = Новый Структура;
ПроверитьНоменклатуры = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
Выборка = Запрос.Выполнить().Выбрать();
Если НЕ Выборка.Следующий() Тогда
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = ПроверитьНоменклатуры;
НоваяНоменклатура.НаименованиеПолное = ПроверитьНоменклатуры;
НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);
НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.ЕдиницаДляОтчетов = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.ЕдиницаХраненияОстатков = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
НоваяНоменклатура.Записать();
КонецЕсли;
ПоказатьПроверитьНоменклатуры = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
Выборка = Запрос.Выполнить().Выбрать();
Если НЕ Выборка.Следующий() Тогда
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = ПроверитьНоменклатуры;
НоваяНоменклатура.НаименованиеПолное = ПроверитьНоменклатуры;
НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);
НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.ЕдиницаДляОтчетов = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.ЕдиницаХраненияОстатков = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
НоваяНоменклатура.Записать();
КонецЕсли;
Сначала проверьте
Имя = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование));
Если Имя = Справочники.Номенклатура.ПустаяСсылка() Тогда
///..... создаем новый элемент..
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = Имя;
..............
КонецЕсли;
Стр = ЭлементыФормы.ТабличнаяЧасть.Значение.Добавить();
Стр.Номенклатура = НоваяНоменклатура ;
Стр.Количество = Количество;
Стр.Цена = Цена;
Стр.Сумма = Сумма;
Понятно, что с запросом было бы более правильно и оптимально, однако вы и запрос используете не совсем коррестно и все равно используете метод НайтиПоНаименованию.
(6)
Написал так. работает дубль нет но есть токая проблема что у меня в файле есть товар - "экран делл" и "экран" а код проста добавляет "экран делл" два раза. Но "экран" не проверяет
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", "%" + ПроверитьНоменклатуры + "%");
Выборка = Запрос.Выполнить().Выбрать();
Если НЕ Выборка.Следующий() Тогда
ПоказатьНаписал так. работает дубль нет но есть токая проблема что у меня в файле есть товар - "экран делл" и "экран" а код проста добавляет "экран делл" два раза. Но "экран" не проверяет
(9)
Вы два раза делаете одно и то же, либо я чего-то не понимаю.
Сначала вы ищите элемент справочника по наименованию.
Затем добавляете, если не находите.
Потом, снова ищите по этому же наименованию.
Зачем? В одном месте ищите, добавляете или используете найденный, и используете для создания документа.
Сейчас есть дубль и не проверка номенклатуры
Вы два раза делаете одно и то же, либо я чего-то не понимаю.
Сначала вы ищите элемент справочника по наименованию.
Затем добавляете, если не находите.
Потом, снова ищите по этому же наименованию.
Зачем? В одном месте ищите, добавляете или используете найденный, и используете для создания документа.
(16)
1. Первый раз ищите номенклатуру и добавляете, если нет
2. Второй раз ищите номенклатуру
И все в одной процедуре.
1. Первый раз ищите номенклатуру и добавляете, если нет
СтруктураПолей = Новый Структура;
/// Берете из Excel
ПроверитьНоменклатуры = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", ПроверитьНоменклатуры);
Выборка = Запрос.Выполнить().Выбрать();
Если НЕ Выборка.Следующий() Тогда
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = ПроверитьНоменклатуры;
НоваяНоменклатура.НаименованиеПолное = ПроверитьНоменклатуры;
НоваяНоменклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоРеквизиту("ТипНоменклатуры",Перечисления.ТипыНоменклатуры.Товар);
НоваяНоменклатура.БазоваяЕдиницаИзмерения = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.ЕдиницаДляОтчетов = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.ЕдиницаХраненияОстатков = ОсновнаяЕдиницаПоКлассификатору;
НоваяНоменклатура.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
НоваяНоменклатура.Записать();
КонецЕсли;
Показать2. Второй раз ищите номенклатуру
/// Берете из Excel
Наименование = СокрЛП(ExcelПриложение.Cells(Строка, НоменклатураКол).Value);
........
Стр = ЭлементыФормы.ТабличнаяЧасть.Значение.Добавить();
Стр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Наименование));
Стр.Количество = Количество;
Стр.Цена = Цена;
Стр.Сумма = Сумма;
ПоказатьИ все в одной процедуре.
(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();
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот