Запросы в цикле при проверке создания элементов справочника из файла JSON: как избавиться?

1. Arkadag 16.02.26 16:33 Сейчас в теме
Здравствуйте!
Самописная конфигурация.
Имеется справочник "Номенклатура" (Ссылка, Наименование, Артикул и т.д.)

Программно пытаюсь из файла (JSON) заполнить, дополнить, обработать этот справочник.
Критерий поиска по Артикулу.

Получил массив номенклатур из файла JSON: МассивНоменклатур //= Новый Массив();

Изначально сделал алгоритм следующий:
1. Цикл по массиву номенклатур
2. Создал запрос (функция), которая проверяет наличие этой номенклатуры по Артикулу. Артикул получаю из цикла в пункте №1
3. Далее в зависимости от наличия или отсутствия номенклатуры создаю или не создаю элемент справочника.

Всё как бы работает, но получается, что я использую выполнение запроса в цикле, что запрещено и не рекомендуется.

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

Попробовал в условие запроса загнать весь массив номенклатур из файла.

		|ГДЕ
		|	Номенклатура.Артикул В(&МассивНоменклатур)";


Получил список номенклатур, которые уже есть.
Но вот как получить список номенклатур, которых нет, чтобы создавать их - не могу сообразить, ну чтобы более простым способом.

Есть мысли: создать таблицу значений из номенклатур файла JSON, прикреплять ее каким-либо соединением. Ну еще пару мыслей.

Посоветуйте что можно сделать в моей ситуации с точки зрения оптимизации и правильности (особенно выхода из цикла создания запросов).
Найденные решения
6. reg0303 16.02.26 17:20 Сейчас в теме
Как вариант JSON в таблицу значений загрузить, после соединиться левым соединением с номенклатурой по артикулу и в конце чтобы отсеять уже существующую номенклатуру:
ГДЕ
	Номенклатура.Ссылка ЕСТЬ NULL
7. RoyFincher 4 16.02.26 19:39 Сейчас в теме
Получи ТаблицуЗначенй и
ВЫБРАТЬ
	ТЗ.Артикул КАК Артикул
ПОМЕСТИТЬ ВТ_ТЗ
ИЗ
	&ТЗ КАК ТЗ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ТЗ.Артикул КАК Артикул,
	ВЫБОР
		КОГДА СпрНоменклатура.Ссылка ЕСТЬ NULL
			ТОГДА ЛОЖЬ
		ИНАЧЕ ИСТИНА
	КОНЕЦ КАК ЕстьВБазе
ИЗ
	ВТ_ТЗ КАК ВТ_ТЗ
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
		ПО (ВТ_ТЗ.Артикул = СпрНоменклатура.Артикул
Показать
8. dehro 14 16.02.26 22:39 Сейчас в теме
(7)
ТаблицаД = Новый ТаблицаЗначений;
ТаблицаД.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
ТаблицаД.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
....


Потом ТЗ в запрос (6)
Только там можно несколько соединений: по артикулу, по коду, по наименованию, etc, etc, etc

А запрос будет один
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 16.02.26 16:48 Сейчас в теме
(1) Ищете в этом списке - нет создаете и добавляете в список.
5. Sashares 33 16.02.26 16:56 Сейчас в теме
(1) А какая проблема решается?
Долго выполняется?
Если да, то замер производительности что показывает?
3. puzo50 16.02.26 16:48 Сейчас в теме
запрос по массиву номенклатур. слева присоединяете артикул. выгружаете в ТЗ
идёте по тз. нет артикула - создаёте. нет - не создаёте.
4. truba 16.02.26 16:50 Сейчас в теме
(1) А чем тебе плохо спится? У тебя емкость справочника номенклатуры миллионы строк?
Обмены по жсону в оперативных движениях в модулях проведения?
Обменов миллионы?
Это точно самое тонкое звено твоей учетной системы что и смотреть больше не на что?

так то
1) получаешь массив артикулов из жсона.
2) запросом ходишь в справочник.номенклатура по поиску того, что есть - возвращается массив артикулов которые есть
3) если артикула нет во втором массиве - значит его в БД нет

Но только это надо делать в транзакции, что бы в момент записи не получилось так, что в БД артикул уже появился пока ваш код работал.

А это значит большая общая транзакция, а не тысячи мелких.

А оно тебе надо? Чего добиться хочешь, человек?
6. reg0303 16.02.26 17:20 Сейчас в теме
Как вариант JSON в таблицу значений загрузить, после соединиться левым соединением с номенклатурой по артикулу и в конце чтобы отсеять уже существующую номенклатуру:
ГДЕ
	Номенклатура.Ссылка ЕСТЬ NULL
7. RoyFincher 4 16.02.26 19:39 Сейчас в теме
Получи ТаблицуЗначенй и
ВЫБРАТЬ
	ТЗ.Артикул КАК Артикул
ПОМЕСТИТЬ ВТ_ТЗ
ИЗ
	&ТЗ КАК ТЗ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ТЗ.Артикул КАК Артикул,
	ВЫБОР
		КОГДА СпрНоменклатура.Ссылка ЕСТЬ NULL
			ТОГДА ЛОЖЬ
		ИНАЧЕ ИСТИНА
	КОНЕЦ КАК ЕстьВБазе
ИЗ
	ВТ_ТЗ КАК ВТ_ТЗ
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
		ПО (ВТ_ТЗ.Артикул = СпрНоменклатура.Артикул
Показать
8. dehro 14 16.02.26 22:39 Сейчас в теме
(7)
ТаблицаД = Новый ТаблицаЗначений;
ТаблицаД.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
ТаблицаД.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
....


Потом ТЗ в запрос (6)
Только там можно несколько соединений: по артикулу, по коду, по наименованию, etc, etc, etc

А запрос будет один
9. Arkadag 17.02.26 10:01 Сейчас в теме
Благодарю. Сделал через ТЗ в запросе
Для отправки сообщения требуется регистрация/авторизация

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