|
v7: Переделать код в запрос с условием. | ☑ | ||
---|---|---|---|---|
0
BarokPro
03.01.18
✎
15:53
|
Здравствуйте. Подскажите каким образом можно организовать запрос из кода:
[code] Спр=СоздатьОбъект("Справочник.Номенклатура"); Для х=2 по КоличествоСтрок Цикл Сообщить("Обрабатываем строку: " + х); Артикул = СокрЛП(Строка(Excel.Cells(х, 1).Value)); Штрихкод = СокрЛП(Строка(Excel.Cells(х, 2).Value)); Спр.ВыбратьЭлементы(); Итератор = 0; Пока Спр.Выбран() = 1 Цикл Попытка НачатьТранзакцию(); Итератор = Итератор +1; Если СокрЛП(Спр.Артикул) = Артикул Тогда Спр.Штрихкод = Штрихкод; Спр.Записать(); КонецЕсли; Если Итератор = 500 Тогда ЗафиксироватьТранзакцию(); НачатьТранзакцию(); Итератор = 0; КонецЕсли; Исключение Сообщить("ошибка транзакции"); КонецПопытки; КонецЦикла; ЗафиксироватьТранзакцию(); КонецЦикла; [/code] |
|||
1
nordbox
03.01.18
✎
15:58
|
а если будет 2 номенклатуры с одинаковым арт. не редкость ?
|
|||
2
BarokPro
03.01.18
✎
16:02
|
(1) В том то и дело что у меня в Номенклатуре могут быть позиции с одинаковым артикулом, поэтому надо для быстроты запросом перебрать все еэлементы справочника и подставить штрихкод при совпадении артикула.
Вот немного подправил код для лучшей наглядности, убрал транзакции: Спр=СоздатьОбъект("Справочник.Номенклатура"); Для х=2 по КоличествоСтрок Цикл Сообщить("Обрабатываем строку: " + х); Артикул = СокрЛП(Строка(Excel.Cells(х, 1).Value)); Штрихкод = СокрЛП(Строка(Excel.Cells(х, 2).Value)); Спр.ВыбратьЭлементы(); Пока Спр.Выбран() = 1 Цикл Если СокрЛП(Спр.Артикул) = Артикул Тогда Спр.Штрихкод = Штрихкод; Спр.Записать(); КонецЕсли; КонецЦикла; КонецЦикла; |
|||
3
nordbox
03.01.18
✎
16:32
|
(2) Ну вот как ты себе представляешь?
Ну можешь загнать Запрос в цикл как и параметр передавай в запрос Артикул)) Ты веселишься что ли? Это из серии "Научи меня плохому" )) |
|||
4
BarokPro
03.01.18
✎
16:36
|
(3) Я просто хочу ускорить обработку, перебором очень долго получается. Подумал, что запросом это будет гораздо быстрее, просто опыта работы с запросами нету, целый день пытаюсь что-то сделать, но не выходит. Либо может есть еще какие варианты ускорить данный процесс.
|
|||
5
nordbox
03.01.18
✎
16:59
|
(4) Ну можешь порнографическим способом ускорить, загнать справочник в память, если хватит памяти и в памяти ищи.
Какой размер справочника? Можешь написать Функцию в которой будет запрос и параметр Артикул, Функция будет возвращать номенклатуру, присваивай ШК и записывай Извращений много https://helpf.pro/faq7/view/300.html |
|||
6
BarokPro
03.01.18
✎
17:01
|
Если простыми словами, то как мне быстро найти все элементы справочника с заранее известным одинаковым артикулом кроме как простым перебором? Должны же быть варианты побыстрее :)
|
|||
7
nordbox
03.01.18
✎
17:02
|
Блин, я тебе только что сказал как
|
|||
8
vova1122
03.01.18
✎
17:04
|
Для начала Сколько строк в екселе. и сколько номенклатуры в базе? чтобы оценить стоит ли игра свеч...
|
|||
9
BarokPro
03.01.18
✎
17:06
|
(8) В экселе примерно 500 строк, в Справочнике около 5000
|
|||
10
nordbox
03.01.18
✎
17:06
|
(8) я у него спрашивал в (5), молчит как партизан
|
|||
11
nordbox
03.01.18
✎
17:08
|
(9) И ты из-за каких то ванючих 500 строк собираешься супер стратегию развивать?
я думал 50000 или 150000 ещё можно было бы возиться |
|||
12
BarokPro
03.01.18
✎
17:08
|
(7) А что ты сказал, ты мне сказал что надо в функции написать запрос, но у меня и так изначально стоял вопрос, как написать этот запрос? То что по ссылке это поиск одного элемента, мне же надо найти не один элемент справочника, а все подходящие под условие (с нужным артикулом)
|
|||
13
BarokPro
03.01.18
✎
17:09
|
(11) Простым перебором у меня оно и за полчаса не отработало
|
|||
14
nordbox
03.01.18
✎
17:10
|
(13) ты на 286-м проце что ли сидишь?
неверю |
|||
15
nordbox
03.01.18
✎
17:10
|
Запихни в ТЗ справочник
https://helpf.pro/faq7/view/516.html |
|||
16
BarokPro
03.01.18
✎
17:11
|
(14) Возможно элементов справочника больше чем 5000, я не знаю как посмотреть
|
|||
17
vova1122
03.01.18
✎
17:11
|
(11) значит крутится еще гдето в другом месте. прогнать простой цикл 3 ляма раз займет примерно 3-5 хв максимум
|
|||
18
nordbox
03.01.18
✎
17:14
|
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Номенклатура = Справочник.Номенклатура; |
|||
19
nordbox
03.01.18
✎
17:17
|
+18
|Атрикул = Справочник.Номенклатура.Артикул; |Условие(Артикул = ВыбАртикул); |"//}}ЗАПРОС; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; Давно в 7.7 не заглядывал |
|||
20
nordbox
03.01.18
✎
17:17
|
Перед условием добавь строку
|Группировка Номенклатура; |
|||
21
nordbox
03.01.18
✎
17:18
|
Пока Запрос.Группировка(1) = 1 Цикл
// Заполнение полей Номенклатура КонецЦикла; |
|||
22
vova1122
03.01.18
✎
17:23
|
Только запрос нужно будет прокрутить 500 раз. Думаю будет не намного быстрее. Затык нужно искать еще где-то. Так как код из (0) не может крутится пол часа при таком объеме данных.
|
|||
23
nordbox
03.01.18
✎
17:27
|
(22) я про это тоже ему говорил в (3) )))
|
|||
24
abfm
03.01.18
✎
17:30
|
Хоть бы конфигурацию назвал.
НайтиПоРеквизиту(<?>,,); В ТИС артикул сортировка стоит галка. Штрих код один на товар вообще песня. Если не весовой. |
|||
25
nordbox
03.01.18
✎
17:40
|
ТС, обиделся походу и сбежал
|
|||
26
vova1122
03.01.18
✎
17:41
|
(25) нет. Крутит запрос. Ееще на пол часа в ауте
|
|||
27
BarokPro
03.01.18
✎
17:56
|
(22) с объемом справочника я скорее всего соврал, там не 5000, а наверн 50000, завтра напишу простеньеую обработку, смогу сказать точное чмсло
(25) не обиделся, просто закончился рабочий день :) вообще не вижу смысла обижаться, вы же мне помогаете, я наоборот благодарен вам (26) Перед отъездом запустил обработку еше раз, на данный момент за 40 минут она еще не завершилась |
|||
28
vova1122
03.01.18
✎
17:57
|
На всякий случай для ТС код для точного подсчета времени работы кода:
а2=_GetPerformanceCounter(); //,,,,,,,,,,,,,, а2=_GetPerformanceCounter(); а=а2-а1; секунд=а/1000; |
|||
29
BarokPro
03.01.18
✎
17:58
|
(15) с ТЗ не прокатит, мне нужно не просто найти элементы справочника, но и изменить их
|
|||
30
nordbox
03.01.18
✎
17:59
|
(27) В любом случае, у тебя что то не так
40 мин это слишком ну оооочень много, ТИИ сделай, переиндексируй и сожми таблицу |
|||
31
vova1122
03.01.18
✎
18:00
|
(29) Смысл ТЗ в том, что выборка реквизитов из ТЗ проходит немного быстрее чем из Справочника
|
|||
32
vova1122
03.01.18
✎
18:00
|
+(31) а потом при нахождении в ТЗ уже исправлять свою номенклатуру
|
|||
33
BarokPro
03.01.18
✎
18:01
|
(19) так пробовал, но затык получается, что не могу изменить элементы справочника, в цикле группировки пишет что элемент справочника не выбран, а если запрос пускать в цикле перебора справочника, то смысла нету
|
|||
34
nordbox
03.01.18
✎
18:01
|
(29) Ну дык быстренько нашел, по ссылке получил и записал
|
|||
35
nordbox
03.01.18
✎
18:03
|
>>не могу изменить элементы справочника, в цикле группировки пишет что элемент справочника не выбран,
Конечно выбрать надо,в ТЗ еще одно поле впихни Ссылка а потом меняй и пиши |
|||
36
BarokPro
03.01.18
✎
18:03
|
(32) а не подкажешь как через тз изменить несколько элементов спрпвочниеа? Я не могу связать эти 2 момента, навыков видимо не хватает
|
|||
37
vova1122
03.01.18
✎
18:06
|
(36) не за один проход.
ТЗ отсортируешь по артикулу. Находишь первый артикул, и потом пока артикул=нужный делаешь цикл. В итоге общее количество циклов будет намного меньше |
|||
38
nordbox
03.01.18
✎
18:06
|
Ты в ТЗ загоняешь справочник ОДИН раз,
дальше выборку из ТЗ делаешь по условию Только у тебя еще будет одно поле Ссылка в синтаксисе могу ошибиться, 77 под рукой нет ТекНом=ТЗ.Сылка ТекНом.Артикул=Артикул ТекНом.ШК=ШК ТекНом.Записать(); |
|||
39
abfm
03.01.18
✎
18:07
|
(35) правильно советует
СоздатьОбъект("Что то") НайтиЭлемент(<Элемент>) и пиши |
|||
40
nordbox
03.01.18
✎
18:16
|
В самом начале процедуры
ТЗ=СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("Артикул"); ТЗ.НоваяКолонка("Элемент"); Спр=СоздатьОбъект("Справочник.Номенклатура"); Спр.ВыбратьЭлементы(); Пока Спр.Выбран() = 1 Цикл ТЗ.Артикул=Спр.Атрикул; ТЗ.Элемент=Спр.ТекущийЭлемент(); КонецЦикла А потом выбирай уже из ТЗ точно так же как ты выборку делаешь из справочника Только намного быстрее будет |
|||
41
BarokPro
03.01.18
✎
18:20
|
(39) это понятно, но таким способом найдет только первый элемент, а мне надо несколько. Завтра буду пытаться реализовать вышеперечисленные подсказки
|
|||
42
vova1122
03.01.18
✎
18:20
|
Кстати После заполенения ТЗ из (40) напиши
Сообщить""всего номенклатуры- "+Тз.КоличествоСтрок()); |
|||
43
vova1122
03.01.18
✎
18:21
|
Сообщить("всего номенклатуры- "+Тз.КоличествоСтрок());
узнаешь сколько у тебя всего номенклатуры в базе |
|||
44
nordbox
03.01.18
✎
18:22
|
(41)>>но таким способом найдет только первый элемент,
Это кто тебе сказал??? ЕСли не будешь прерывать цикл он найдет все |
|||
45
nordbox
03.01.18
✎
18:25
|
+44 если отсортируешь как положено, так вообще будет летать
|
|||
46
vova1122
03.01.18
✎
18:27
|
Еще одна интересная функция. Но никогда ей не пользовался.
Можно проверить. Вместо ВыбратьЭлементы() использовать ВыбратьЭлементыПоРеквизиту(.....) |
|||
47
vova1122
03.01.18
✎
18:36
|
(0) и все, все, все.
Все мы тут придумываем от чего так долго крутится этот код. Еще раз внимательно пресмотрите код в (0) - он будет крутится до второго пришествия.... В коде невижу перебора справочника. Где во внутреннем цикле Спр.ПолучитьЭлемент() ? |
|||
48
nordbox
03.01.18
✎
18:45
|
(47) 7.7 уже тяжко вспоминать )
|
|||
49
vova1122
03.01.18
✎
18:47
|
(0) замени строку
Пока Спр.Выбран() = 1 Цикл на Пока Спр.ПолучитьЭлемент() = 1 Цикл |
|||
50
BarokPro
03.01.18
✎
19:52
|
(49) Вот это я лоханулся, не отрицаю))
|
|||
51
BarokPro
03.01.18
✎
20:18
|
(46) То что надо! Спс! Процедуру выполнил за 5 сек!)))
|
|||
52
BarokPro
03.01.18
✎
20:19
|
(46) Спр=СоздатьОбъект("Справочник.Номенклатура");
Для х=2 по КоличествоСтрок Цикл Сообщить("Обрабатываем строку: " + х); Артикул = СокрЛП(Строка(Excel.Cells(х, 1).Value)); Штрихкод = СокрЛП(Строка(Excel.Cells(х, 2).Value)); Спр.ВыбратьЭлементыПоРеквизиту("Артикул",Артикул,0,0); Пока Спр.ПолучитьЭлемент() = 1 Цикл Спр.Штрихкод = Штрихкод; Спр.Записать(); КонецЦикла; КонецЦикла; |
|||
53
nordbox
03.01.18
✎
20:23
|
(52) ))) ну наконец то ))
|
|||
54
BarokPro
03.01.18
✎
20:33
|
(43) всего номенклатуры- 13734
|
|||
55
nordbox
03.01.18
✎
20:38
|
(54) Это фигня, чайная ложка, не больше, честное слово, база можно сказать ни о чем, пустая
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |