Запросы в цикле при проверке создания элементов справочника из файла JSON: как избавиться?
Здравствуйте!
Самописная конфигурация.
Имеется справочник "Номенклатура" (Ссылка, Наименование, Артикул и т.д.)
Программно пытаюсь из файла (JSON) заполнить, дополнить, обработать этот справочник.
Критерий поиска по Артикулу.
Получил массив номенклатур из файла JSON: МассивНоменклатур //= Новый Массив();
Изначально сделал алгоритм следующий:
1. Цикл по массиву номенклатур
2. Создал запрос (функция), которая проверяет наличие этой номенклатуры по Артикулу. Артикул получаю из цикла в пункте №1
3. Далее в зависимости от наличия или отсутствия номенклатуры создаю или не создаю элемент справочника.
Всё как бы работает, но получается, что я использую выполнение запроса в цикле, что запрещено и не рекомендуется.
Никак не могу сообразить, как сделать правильно, т.е. выйти из порочного цикла выполнения одного и того же запроса.
Попробовал в условие запроса загнать весь массив номенклатур из файла.
Получил список номенклатур, которые уже есть.
Но вот как получить список номенклатур, которых нет, чтобы создавать их - не могу сообразить, ну чтобы более простым способом.
Есть мысли: создать таблицу значений из номенклатур файла JSON, прикреплять ее каким-либо соединением. Ну еще пару мыслей.
Посоветуйте что можно сделать в моей ситуации с точки зрения оптимизации и правильности (особенно выхода из цикла создания запросов).
Самописная конфигурация.
Имеется справочник "Номенклатура" (Ссылка, Наименование, Артикул и т.д.)
Программно пытаюсь из файла (JSON) заполнить, дополнить, обработать этот справочник.
Критерий поиска по Артикулу.
Получил массив номенклатур из файла JSON: МассивНоменклатур //= Новый Массив();
Изначально сделал алгоритм следующий:
1. Цикл по массиву номенклатур
2. Создал запрос (функция), которая проверяет наличие этой номенклатуры по Артикулу. Артикул получаю из цикла в пункте №1
3. Далее в зависимости от наличия или отсутствия номенклатуры создаю или не создаю элемент справочника.
Всё как бы работает, но получается, что я использую выполнение запроса в цикле, что запрещено и не рекомендуется.
Никак не могу сообразить, как сделать правильно, т.е. выйти из порочного цикла выполнения одного и того же запроса.
Попробовал в условие запроса загнать весь массив номенклатур из файла.
|ГДЕ
| Номенклатура.Артикул В(&МассивНоменклатур)";Получил список номенклатур, которые уже есть.
Но вот как получить список номенклатур, которых нет, чтобы создавать их - не могу сообразить, ну чтобы более простым способом.
Есть мысли: создать таблицу значений из номенклатур файла JSON, прикреплять ее каким-либо соединением. Ну еще пару мыслей.
Посоветуйте что можно сделать в моей ситуации с точки зрения оптимизации и правильности (особенно выхода из цикла создания запросов).
Найденные решения
7.
RoyFincher
4
16.02.26 19:39
Сейчас в теме
Получи ТаблицуЗначенй и
ВЫБРАТЬ
ТЗ.Артикул КАК Артикул
ПОМЕСТИТЬ ВТ_ТЗ
ИЗ
&ТЗ КАК ТЗ
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_ТЗ.Артикул КАК Артикул,
ВЫБОР
КОГДА СпрНоменклатура.Ссылка ЕСТЬ NULL
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ КАК ЕстьВБазе
ИЗ
ВТ_ТЗ КАК ВТ_ТЗ
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
ПО (ВТ_ТЗ.Артикул = СпрНоменклатура.Артикул
Показать
(7)
Потом ТЗ в запрос (6)
Только там можно несколько соединений: по артикулу, по коду, по наименованию, etc, etc, etc
А запрос будет один
ТаблицаД = Новый ТаблицаЗначений;
ТаблицаД.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
ТаблицаД.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
....
Потом ТЗ в запрос (6)
Только там можно несколько соединений: по артикулу, по коду, по наименованию, etc, etc, etc
А запрос будет один
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) А чем тебе плохо спится? У тебя емкость справочника номенклатуры миллионы строк?
Обмены по жсону в оперативных движениях в модулях проведения?
Обменов миллионы?
Это точно самое тонкое звено твоей учетной системы что и смотреть больше не на что?
так то
1) получаешь массив артикулов из жсона.
2) запросом ходишь в справочник.номенклатура по поиску того, что есть - возвращается массив артикулов которые есть
3) если артикула нет во втором массиве - значит его в БД нет
Но только это надо делать в транзакции, что бы в момент записи не получилось так, что в БД артикул уже появился пока ваш код работал.
А это значит большая общая транзакция, а не тысячи мелких.
А оно тебе надо? Чего добиться хочешь, человек?
Обмены по жсону в оперативных движениях в модулях проведения?
Обменов миллионы?
Это точно самое тонкое звено твоей учетной системы что и смотреть больше не на что?
так то
1) получаешь массив артикулов из жсона.
2) запросом ходишь в справочник.номенклатура по поиску того, что есть - возвращается массив артикулов которые есть
3) если артикула нет во втором массиве - значит его в БД нет
Но только это надо делать в транзакции, что бы в момент записи не получилось так, что в БД артикул уже появился пока ваш код работал.
А это значит большая общая транзакция, а не тысячи мелких.
А оно тебе надо? Чего добиться хочешь, человек?
7.
RoyFincher
4
16.02.26 19:39
Сейчас в теме
Получи ТаблицуЗначенй и
ВЫБРАТЬ
ТЗ.Артикул КАК Артикул
ПОМЕСТИТЬ ВТ_ТЗ
ИЗ
&ТЗ КАК ТЗ
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_ТЗ.Артикул КАК Артикул,
ВЫБОР
КОГДА СпрНоменклатура.Ссылка ЕСТЬ NULL
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ КАК ЕстьВБазе
ИЗ
ВТ_ТЗ КАК ВТ_ТЗ
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
ПО (ВТ_ТЗ.Артикул = СпрНоменклатура.Артикул
Показать
(7)
Потом ТЗ в запрос (6)
Только там можно несколько соединений: по артикулу, по коду, по наименованию, etc, etc, etc
А запрос будет один
ТаблицаД = Новый ТаблицаЗначений;
ТаблицаД.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
ТаблицаД.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
....
Потом ТЗ в запрос (6)
Только там можно несколько соединений: по артикулу, по коду, по наименованию, etc, etc, etc
А запрос будет один
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот