почему то меняется состав массивов

1. Malcev_a 14.08.24 16:42 Сейчас в теме
Добрый день!
Не пинайте сильно, помогите разобраться.
Есть задача загружать в справочник номенклатуры данные из внешнего файла.
Эта задача включает в себя проверку на отсутствие дублей, чтобы проверялся артикул и наименование.

Я сделал алгоритм, но дубли все равно создаются, всю голову сломал уже.
По итогу выяснилось что почему то в массивах итоговых остается только одна номенклатура и один артикул на момент начала проверки, хотя я выгружаю из запроса все наименования и артикулы которые уже есть в загруженных данных и в справочнике номенклатура.
Хотя эти массивы (ИтоговыйМассивНаименований и ИтоговыйМассивАртикулов) не находятся в циклах.
То есть сначала в них есть все данные, все ок, но потом когда начинается проверка данные из них пропадают.

Помогите разобраться в чем проблема.
Вот код

  
 МассивАртикулов 		= Новый Массив;   //В этом массиве все артикулы номенклатуры, которую хотим загрузить
	  МассивНаименований    = Новый Массив;   //В этом массиве все наименнования номенклатуры, которую хотим загрузить
	  
	 
	  
	  Для Каждого СтрокаДанных из Объект.ДанныеФайла Цикл
		  МассивАртикулов.Добавить(СтрокаДанных.Артикул);
		  МассивНаименований.Добавить(СтрокаДанных.Наименование);		  
	  КонецЦикла; 
	  
	  
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Номенклатура.Ссылка,
		|	Номенклатура.Артикул,
		|	Номенклатура.Наименование
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|ГДЕ
		|	Номенклатура.Артикул В(&МассивАртикулов)
		|	И Номенклатура.Наименование В(&МассивНаименований)";   
	
	//Запросом выбрали всю номенклатуру из справочника, в котором Артикул и Наименование находятся в списке из массива. 
	
	Запрос.УстановитьПараметр("МассивАртикулов", МассивАртикулов);
	Запрос.УстановитьПараметр("МассивНаименований", МассивНаименований);
	
	РезультатЗапроса = Запрос.Выполнить();  
	
	ИтоговаяТаблица = РезультатЗапроса.Выгрузить();
	
	ИтоговыйМассивНаименований = Новый Массив;
	ИтоговыйМассивАртикулов = Новый Массив;   
	
	Для каждого СтрокаТаблицы из ИтоговаяТаблица Цикл
		
		ИтоговыйМассивНаименований.Добавить(СтрокаТаблицы.Наименование);
		ИтоговыйМассивАртикулов.Добавить(СтрокаТаблицы.Артикул);	
		
	КонецЦикла;
	
	 //Сложили в два массива все наименования и артикулы с которыми загружаемые данные не должны совпадать.	
			
	Для каждого Строка из Объект.ДанныеФайла Цикл
		
		НайденноеНаименование = ИтоговыйМассивНаименований.Найти(Строка.Наименование); // Если не найдено = неопределено
        НайденныйАртикул = ИтоговыйМассивАртикулов.Найти(Строка.Артикул);  			 // Если не найдено = неопределено
		
		
		Если НайденныйАртикул <> Неопределено Тогда
			Если НайденноеНаименование = Строка.Наименование Тогда
				Продолжить;  // Пропускаем создание, если совпал артикул, но не совпало наименование
			КонецЕсли;
		КонецЕсли;
		
		Если НайденноеНаименование <> Неопределено Тогда
			Если НайденныйАртикул = Строка.Артикул Тогда
				Продолжить;  // Пропускаем создание, если совпало наименование, но не совпал артикул
			КонецЕсли;
		КонецЕсли;
		
	
	
		НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
		НоваяНоменклатура.Наименование = Строка.Наименование;
		НоваяНоменклатура.Артикул = Строка.Артикул;
		
		НоваяНоменклатура.Записать(); 		
		
		
		// Обновляем массивы после добавления новой записи
		ИтоговыйМассивАртикулов.Добавить(Строка.Артикул);
		ИтоговыйМассивНаименований.Добавить(Строка.Наименование);
		
	КонецЦикла;
	
	  
	 Сообщить("Данные успешно загружены!");



Показать
По теме из базы знаний
Найденные решения
4. Westonline82 14.08.24 16:58 Сейчас в теме
(3) в условиях запроса поменяй И на ИЛИ
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user2033930 14.08.24 16:50 Сейчас в теме
1. Потому что ты не обновляешь, а добавляешь.
2. У тебя в запросе есть Ссылка. Если есть несколько ссылок с одинаковыми наименованиями и артикулами - то это не дубли (исходя из твоего кода).

Да и вообще работать не будет. Ты в качестве дубля ищешь не связанную пару, а два разных значения из разных массивов.
3. Malcev_a 14.08.24 16:57 Сейчас в теме
(2)
ищешь не связа


По ТЗ нет связанных пар - может совпасть либо наименование либо артикул, у заказчика этот момент уточнялся, поэтому я пары и не проверяю.

Может быть так, что наименование одинаковое, а артикулы разные и это дубль, второй раз его создавать не нужно.

"Потому что ты не обновляешь, а добавляешь." - вот это не понял, у массива есть метод добавить, я добавляю данные в массив.

спасибо за отклик)
4. Westonline82 14.08.24 16:58 Сейчас в теме
(3) в условиях запроса поменяй И на ИЛИ
6. Malcev_a 14.08.24 17:13 Сейчас в теме
(4)
поменяй И


Да, Вы правы)
Но теперь почему то

Если НайденноеНаименование <> Неопределено Тогда
Если НайденныйАртикул = Строка.Артикул Тогда
Продолжить; // Пропускаем создание, если совпало наименование, но не совпал артикул
КонецЕсли;
КонецЕсли;

НайденноеНаименование в отладчике = 4, но алгоритм почему то идет дальше и создает новый объект, хотя должен в это если((
5. Sashares 35 14.08.24 17:05 Сейчас в теме
(3) Если НайденныйАртикул <> Неопределено Тогда
Если НайденноеНаименование = Строка.Наименование Тогда
Продолжить; // Пропускаем создание, если совпал артикул, но не совпало наименование
КонецЕсли;
КонецЕсли;

Если НайденноеНаименование <> Неопределено Тогда
Если НайденныйАртикул = Строка.Артикул Тогда
Продолжить; // Пропускаем создание, если совпало наименование, но не совпал артикул
КонецЕсли;
КонецЕсли;

Комментарии не соответствуют коду.
7. Malcev_a 14.08.24 17:14 Сейчас в теме
(5)
Да, поправил, спасибо!
Я просто разные варианты пробовал и комментировал для себя.
8. soft_wind 14.08.24 17:18 Сейчас в теме
вообще уникальность не по парам должна проверяться а по отдельости
не должно быть в справочнике элементов
1.ни с совпадающими Артикулами
2.ни с совпадающими Наименованиями

отсуда и ошибки задвоений
9. Malcev_a 14.08.24 17:24 Сейчас в теме
(8)
дающими Наиме


Так вроде бы так и делаю, отдельно проверяю наименования и отдельно артикулы)) Полностью с Вами согласен
10. Malcev_a 14.08.24 17:32 Сейчас в теме
Всем спасибо!

Проблема была тут

Если НайденныйАртикул <> Неопределено Тогда
//Если НайденноеНаименование <> Неопределено Тогда
Продолжить; // Пропускаем создание, если совпал артикул
//КонецЕсли;
КонецЕсли;

Если НайденноеНаименование <> Неопределено Тогда
//Если НайденныйАртикул <> Неопределено Тогда
Продолжить; // Пропускаем создание, если совпало наименование
//КонецЕсли;
КонецЕсли;


И в смене И на ИЛИ в запросе
11. soft_wind 14.08.24 17:36 Сейчас в теме
сделайте такой запрос

выбрать
спр.Артикул как Реквизит
из справочник.Номенклатура спр

объединить

выбрать
спр.Наименование как Реквизит
из справочник.Номенклатура спр


выгрузите значение колонки Реквизит в массив,

и в цикле при обходе строк загружаемых данных
ищите И Артикул и Наименование
и если оба НЕ найдены в этом массиве - тогда добавляете новую номенклатуру
Оставьте свое сообщение

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