Добрый день!
Не пинайте сильно, помогите разобраться.
Есть задача загружать в справочник номенклатуры данные из внешнего файла.
Эта задача включает в себя проверку на отсутствие дублей, чтобы проверялся артикул и наименование.
Я сделал алгоритм, но дубли все равно создаются, всю голову сломал уже.
По итогу выяснилось что почему то в массивах итоговых остается только одна номенклатура и один артикул на момент начала проверки, хотя я выгружаю из запроса все наименования и артикулы которые уже есть в загруженных данных и в справочнике номенклатура.
Хотя эти массивы (ИтоговыйМассивНаименований и ИтоговыйМассивАртикулов) не находятся в циклах.
То есть сначала в них есть все данные, все ок, но потом когда начинается проверка данные из них пропадают.
Помогите разобраться в чем проблема.
Вот код
Не пинайте сильно, помогите разобраться.
Есть задача загружать в справочник номенклатуры данные из внешнего файла.
Эта задача включает в себя проверку на отсутствие дублей, чтобы проверялся артикул и наименование.
Я сделал алгоритм, но дубли все равно создаются, всю голову сломал уже.
По итогу выяснилось что почему то в массивах итоговых остается только одна номенклатура и один артикул на момент начала проверки, хотя я выгружаю из запроса все наименования и артикулы которые уже есть в загруженных данных и в справочнике номенклатура.
Хотя эти массивы (ИтоговыйМассивНаименований и ИтоговыйМассивАртикулов) не находятся в циклах.
То есть сначала в них есть все данные, все ок, но потом когда начинается проверка данные из них пропадают.
Помогите разобраться в чем проблема.
Вот код
МассивАртикулов = Новый Массив; //В этом массиве все артикулы номенклатуры, которую хотим загрузить
МассивНаименований = Новый Массив; //В этом массиве все наименнования номенклатуры, которую хотим загрузить
Для Каждого СтрокаДанных из Объект.ДанныеФайла Цикл
МассивАртикулов.Добавить(СтрокаДанных.Артикул);
МассивНаименований.Добавить(СтрокаДанных.Наименование);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Артикул,
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул В(&МассивАртикулов)
| И Номенклатура.Наименование В(&МассивНаименований)";
//Запросом выбрали всю номенклатуру из справочника, в котором Артикул и Наименование находятся в списке из массива.
Запрос.УстановитьПараметр("МассивАртикулов", МассивАртикулов);
Запрос.УстановитьПараметр("МассивНаименований", МассивНаименований);
РезультатЗапроса = Запрос.Выполнить();
ИтоговаяТаблица = РезультатЗапроса.Выгрузить();
ИтоговыйМассивНаименований = Новый Массив;
ИтоговыйМассивАртикулов = Новый Массив;
Для каждого СтрокаТаблицы из ИтоговаяТаблица Цикл
ИтоговыйМассивНаименований.Добавить(СтрокаТаблицы.Наименование);
ИтоговыйМассивАртикулов.Добавить(СтрокаТаблицы.Артикул);
КонецЦикла;
//Сложили в два массива все наименования и артикулы с которыми загружаемые данные не должны совпадать.
Для каждого Строка из Объект.ДанныеФайла Цикл
НайденноеНаименование = ИтоговыйМассивНаименований.Найти(Строка.Наименование); // Если не найдено = неопределено
НайденныйАртикул = ИтоговыйМассивАртикулов.Найти(Строка.Артикул); // Если не найдено = неопределено
Если НайденныйАртикул <> Неопределено Тогда
Если НайденноеНаименование = Строка.Наименование Тогда
Продолжить; // Пропускаем создание, если совпал артикул, но не совпало наименование
КонецЕсли;
КонецЕсли;
Если НайденноеНаименование <> Неопределено Тогда
Если НайденныйАртикул = Строка.Артикул Тогда
Продолжить; // Пропускаем создание, если совпало наименование, но не совпал артикул
КонецЕсли;
КонецЕсли;
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = Строка.Наименование;
НоваяНоменклатура.Артикул = Строка.Артикул;
НоваяНоменклатура.Записать();
// Обновляем массивы после добавления новой записи
ИтоговыйМассивАртикулов.Добавить(Строка.Артикул);
ИтоговыйМассивНаименований.Добавить(Строка.Наименование);
КонецЦикла;
Сообщить("Данные успешно загружены!");
ПоказатьПо теме из базы знаний
- Собираем образ виртуальной машины с PostgreSQL и платформой 1С. Цикл "Многопоточный CI для 1С c Packer, Vagrant и Jenkins", часть 2
- Опыт руководителя проекта со стороны заказчика. Ищем баланс. Достигаем результата
- Работа с требованиями при автоматизации процессов планирования. Как не получить «лоскутное одеяло» и при этом удержать границы проекта
- Что нам стоит обмен настроить, или Как кролик спас «зоопарк»
- Быстрый фронт в базе размером 8.8 терабайт – наши стандарты при разработке компонентов системы
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
1. Потому что ты не обновляешь, а добавляешь.
2. У тебя в запросе есть Ссылка. Если есть несколько ссылок с одинаковыми наименованиями и артикулами - то это не дубли (исходя из твоего кода).
Да и вообще работать не будет. Ты в качестве дубля ищешь не связанную пару, а два разных значения из разных массивов.
2. У тебя в запросе есть Ссылка. Если есть несколько ссылок с одинаковыми наименованиями и артикулами - то это не дубли (исходя из твоего кода).
Да и вообще работать не будет. Ты в качестве дубля ищешь не связанную пару, а два разных значения из разных массивов.
(2)
По ТЗ нет связанных пар - может совпасть либо наименование либо артикул, у заказчика этот момент уточнялся, поэтому я пары и не проверяю.
Может быть так, что наименование одинаковое, а артикулы разные и это дубль, второй раз его создавать не нужно.
"Потому что ты не обновляешь, а добавляешь." - вот это не понял, у массива есть метод добавить, я добавляю данные в массив.
спасибо за отклик)
ищешь не связа
По ТЗ нет связанных пар - может совпасть либо наименование либо артикул, у заказчика этот момент уточнялся, поэтому я пары и не проверяю.
Может быть так, что наименование одинаковое, а артикулы разные и это дубль, второй раз его создавать не нужно.
"Потому что ты не обновляешь, а добавляешь." - вот это не понял, у массива есть метод добавить, я добавляю данные в массив.
спасибо за отклик)
(4)
Да, Вы правы)
Но теперь почему то
Если НайденноеНаименование <> Неопределено Тогда
Если НайденныйАртикул = Строка.Артикул Тогда
Продолжить; // Пропускаем создание, если совпало наименование, но не совпал артикул
КонецЕсли;
КонецЕсли;
НайденноеНаименование в отладчике = 4, но алгоритм почему то идет дальше и создает новый объект, хотя должен в это если((
поменяй И
Да, Вы правы)
Но теперь почему то
Если НайденноеНаименование <> Неопределено Тогда
Если НайденныйАртикул = Строка.Артикул Тогда
Продолжить; // Пропускаем создание, если совпало наименование, но не совпал артикул
КонецЕсли;
КонецЕсли;
НайденноеНаименование в отладчике = 4, но алгоритм почему то идет дальше и создает новый объект, хотя должен в это если((
(3) Если НайденныйАртикул <> Неопределено Тогда
Если НайденноеНаименование = Строка.Наименование Тогда
Продолжить; // Пропускаем создание, если совпал артикул, но не совпало наименование
КонецЕсли;
КонецЕсли;
Если НайденноеНаименование <> Неопределено Тогда
Если НайденныйАртикул = Строка.Артикул Тогда
Продолжить; // Пропускаем создание, если совпало наименование, но не совпал артикул
КонецЕсли;
КонецЕсли;
Комментарии не соответствуют коду.
Если НайденноеНаименование = Строка.Наименование Тогда
Продолжить; // Пропускаем создание, если совпал артикул, но не совпало наименование
КонецЕсли;
КонецЕсли;
Если НайденноеНаименование <> Неопределено Тогда
Если НайденныйАртикул = Строка.Артикул Тогда
Продолжить; // Пропускаем создание, если совпало наименование, но не совпал артикул
КонецЕсли;
КонецЕсли;
Комментарии не соответствуют коду.
Всем спасибо!
Проблема была тут
Если НайденныйАртикул <> Неопределено Тогда
//Если НайденноеНаименование <> Неопределено Тогда
Продолжить; // Пропускаем создание, если совпал артикул
//КонецЕсли;
КонецЕсли;
Если НайденноеНаименование <> Неопределено Тогда
//Если НайденныйАртикул <> Неопределено Тогда
Продолжить; // Пропускаем создание, если совпало наименование
//КонецЕсли;
КонецЕсли;
И в смене И на ИЛИ в запросе
Проблема была тут
Если НайденныйАртикул <> Неопределено Тогда
//Если НайденноеНаименование <> Неопределено Тогда
Продолжить; // Пропускаем создание, если совпал артикул
//КонецЕсли;
КонецЕсли;
Если НайденноеНаименование <> Неопределено Тогда
//Если НайденныйАртикул <> Неопределено Тогда
Продолжить; // Пропускаем создание, если совпало наименование
//КонецЕсли;
КонецЕсли;
И в смене И на ИЛИ в запросе
сделайте такой запрос
выбрать
спр.Артикул как Реквизит
из справочник.Номенклатура спр
объединить
выбрать
спр.Наименование как Реквизит
из справочник.Номенклатура спр
выгрузите значение колонки Реквизит в массив,
и в цикле при обходе строк загружаемых данных
ищите И Артикул и Наименование
и если оба НЕ найдены в этом массиве - тогда добавляете новую номенклатуру
выбрать
спр.Артикул как Реквизит
из справочник.Номенклатура спр
объединить
выбрать
спр.Наименование как Реквизит
из справочник.Номенклатура спр
выгрузите значение колонки Реквизит в массив,
и в цикле при обходе строк загружаемых данных
ищите И Артикул и Наименование
и если оба НЕ найдены в этом массиве - тогда добавляете новую номенклатуру
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот