Имя: Пароль:
1C
1С v8
Оптимизация поиска по номенклатуре
,
0 unknown181538
 
02.06.18
18:20
Вроде бы тривиальная задача, но впал в ступор.
Есть загрузка из excel файла. Колонок, допустим 25. Почти по всем нужно сделать поиск по наименованию из соответствующего справочника.
Сначала делал запросом, успешно, но теперь колонок уже 25, и получается следующее:
ВЫБРАТЬ
Спр1.Ссылка,
Спр2.Ссылка,
...
Спр25.Ссылка
Из ВТ КАК ВТ
Левое Соединение Спр1 КАК СПр1
По ВТ.Наименование1Файл = Спр1.Наименование
...
..
Левое СоЕДИНЕНИЕ Спр25
ПО....


Стало валиться "Недостаточно памяти", хотя строк всего 5
Попробовал разбить на пакеты по 5 соединений, валится все равно
Как будет оптимально? на каждый справочник по отдельному запросу пакета?
1 Cyberhawk
 
02.06.18
19:10
Разбить на несколько запросов
2 unknown181538
 
02.06.18
19:20
(1) один пакетный или надо именно несколько разных?
чтобы один запрос на один справочник? 25 запросов?
3 Cyberhawk
 
02.06.18
20:54
(2) Пакетный не пойдет.
Разбей на два, при повторении проблемы - на 4, и т.д.
Ну это так - тушение пожара. По-правильному сначала разбирайся (расследуй) причину падения
4 Optan
 
02.06.18
20:58
(0) А с результатом запроса что делаешь после загрузки? Куда то записываешь?
5 mistеr
 
02.06.18
21:21
(0) Небольшие справочники загнать в Соответствия. По большим НайтиПоНаименованию(). Если скорость не устроит, делать свой кэш.
6 Garykom
 
гуру
02.06.18
22:23
(0) Изучи уже программирование и алгоритмы, а не только запросы.
7 unknown181538
 
02.06.18
22:38
(4) в документ потом все идет. Но падает на выполнении запроса.
ОК. Буду писать процедуру, которая будет составлять текст запроса отдельно по справочникам
8 Garykom
 
гуру
02.06.18
22:40
не тупи, кто тебе мешает сделать и выполнить несколько различных запросов а затем собрать данные/результат из них вместе?

причем собирать часто лучше кодом а не запросом
9 Garykom
 
гуру
02.06.18
22:41
берешь файл экселя, данные из колонки 1 в запрос 1, результат в тз
затем данные из колонки 2 в запрос 2, результат в тз и т.д.

затем собрал все вместе из тз
10 VS-1976
 
02.06.18
22:57
Делаешь таблицу значений
1-я колонка Наименование
2-2 колонка Номер колонки
И делаешь с 1-й колонкой соединение
Потом результат раскидываешь
11 unknown181538
 
02.06.18
22:57
(8) Я уже делаю.
На каждую колонку процедура будет выполнять запрос.
"Собирать кодом лучше" - имеешь в виду, что выполнить НайтиПоНаименованию по каждой строке может оказаться быстрее, чем выполнить запрос к справочнику по всей колонке?
12 unknown181538
 
02.06.18
22:57
&НаСервере
Процедура ПодобратьЭлементПоНаименованию(ВРТЗ,ИмяСправочника,ИмяРеквизита)
    
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |  ВЫБРАТЬ
    |ВРТЗ.Инд КАК Инд,
    |ВРТЗ.[ИмяРеквизитаФайл] КАК ИмяРеквизитаФайл
    |ПОМЕСТИТЬ ВТ
    | ИЗ  &ВрТЗ КАК ВРТЗ
    |;
    |ВЫБРАТЬ
    |ТаблСправочник.Ссылка,
    |ВТ.Инд
    |ИЗ
    |ВТ КАК ВТ
    |ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник[ИмяСправочника] КАК ТаблСправочник
    |ПО ВТ.ИмяРеквизитаФайл = ТаблСправочник.Наименование    
    |";
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"[ИмяРеквизитаФайл]",ИмяРеквизита+"Файл");
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"[ИмяСправочника]",ИмяСправочника);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл    
        СтрТЗ = ТЗ[Выборка.Инд];
        СтрТЗ[ИмяРеквизита] = Выборка.Ссылка;    
    КонецЦикла;
        
КонецПроцедуры
13 VS-1976
 
02.06.18
22:59
(10) Забыл ещё колонка номер строки
14 Garykom
 
гуру
02.06.18
23:26
(11) Какое отношение НайтиПоНаименованию имеет к "собирать"?

У тебя несколько колонок/ТЗ с найденными ссылками на элементы нужных справочников, какой смысл загонять эти ТЗ в запрос для сборки в одну ТЗ ? Это подразумевал.
15 youalex
 
02.06.18
23:31
(0) И в каждой из этих 25 колонок - наименование из справочника в 1С, по которому нужно найти ссылку?
Или наименование в одной колонке, а остальные 24 колонки - это типа реквизиты?
16 youalex
 
02.06.18
23:36
Собственно, если первое - заливай ТЗ из экселя в ВТ, и дальше в пакете. каждую колонку из ТЗ - цепляй с нужным справочником. Одна колонка - один запрос пакета. Имя поля еще можно вывести, чтобы ориентироваться, а сам запрос можно программно сформировать.

Если второе - добавь в ТЗ Ключ (типа номерСтроки) - и помещай в ВТ только его, и саму строку наименования, на выходе, в выборке получишь номер строки и ссылку, найденную по наименованию
17 Tateossian
 
02.06.18
23:38
Обходи поколоночно, загружая массив параметром. По каждому справочнику.