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

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 33 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 Сейчас в теме
сделайте такой запрос

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

объединить

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


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

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

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