Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Переделать код в запрос с условием.

Я
   BarokPro
 
03.01.18 - 15:53
Здравствуйте. Подскажите каким образом можно организовать запрос из кода:
[code]
Спр=СоздатьОбъект("Справочник.Номенклатура");
      Для х=2 по КоличествоСтрок Цикл  
          Сообщить("Обрабатываем строку: " + х);
          Артикул = СокрЛП(Строка(Excel.Cells(х, 1).Value));
          Штрихкод = СокрЛП(Строка(Excel.Cells(х, 2).Value));   
          Спр.ВыбратьЭлементы();
          Итератор = 0;
          Пока Спр.Выбран() = 1 Цикл  
            Попытка 
                  НачатьТранзакцию();  
                      Итератор = Итератор +1;
                      Если СокрЛП(Спр.Артикул) = Артикул Тогда
                          Спр.Штрихкод = Штрихкод;
                          Спр.Записать(); 
                      КонецЕсли; 
                      Если Итератор = 500 Тогда
                          ЗафиксироватьТранзакцию();
                          НачатьТранзакцию();
                          Итератор = 0;
                      КонецЕсли; 
              Исключение 
                      Сообщить("ошибка транзакции");
              КонецПопытки;  
        КонецЦикла;
          ЗафиксироватьТранзакцию();
      КонецЦикла;
[/code]
 
 
   nordbox
 
1 - 03.01.18 - 15:58
а если будет 2 номенклатуры с одинаковым арт. не редкость ?
   BarokPro
 
2 - 03.01.18 - 16:02
(1) В том то и дело что у меня в Номенклатуре могут быть позиции с одинаковым артикулом, поэтому надо для быстроты запросом перебрать все еэлементы справочника и подставить штрихкод при совпадении артикула.

Вот немного подправил код для лучшей наглядности, убрал транзакции:
      Спр=СоздатьОбъект("Справочник.Номенклатура");
      Для х=2 по КоличествоСтрок Цикл  
          Сообщить("Обрабатываем строку: " + х);
          Артикул = СокрЛП(Строка(Excel.Cells(х, 1).Value));
          Штрихкод = СокрЛП(Строка(Excel.Cells(х, 2).Value));   
          Спр.ВыбратьЭлементы();
          Пока Спр.Выбран() = 1 Цикл  
                      Если СокрЛП(Спр.Артикул) = Артикул Тогда
                          Спр.Штрихкод = Штрихкод;
                          Спр.Записать(); 
                      КонецЕсли;   
        КонецЦикла;
      КонецЦикла;
   nordbox
 
3 - 03.01.18 - 16:32
(2) Ну вот как ты себе представляешь?
Ну можешь загнать Запрос в цикл как и параметр передавай в запрос Артикул))
Ты веселишься что ли? Это из серии "Научи меня плохому" ))
   BarokPro
 
4 - 03.01.18 - 16:36
(3) Я просто хочу ускорить обработку, перебором очень долго получается. Подумал, что запросом это будет гораздо быстрее, просто опыта работы с запросами нету, целый день пытаюсь что-то сделать, но не выходит. Либо может есть еще какие варианты ускорить данный процесс.
   nordbox
 
5 - 03.01.18 - 16:59
(4) Ну можешь порнографическим способом ускорить, загнать справочник в память, если хватит памяти и в памяти ищи.
Какой размер справочника?
Можешь написать Функцию в которой будет запрос и параметр Артикул, Функция будет возвращать номенклатуру, присваивай ШК и записывай
Извращений много https://helpf.pro/faq7/view/300.html
   BarokPro
 
6 - 03.01.18 - 17:01
Если простыми словами, то как мне быстро найти все элементы справочника с заранее известным одинаковым артикулом кроме как простым перебором? Должны же быть варианты побыстрее :)
   nordbox
 
7 - 03.01.18 - 17:02
Блин, я тебе только что сказал как
   vova1122
 
8 - 03.01.18 - 17:04
Для начала Сколько строк в екселе. и сколько номенклатуры в базе? чтобы оценить стоит ли игра свеч...
   BarokPro
 
9 - 03.01.18 - 17:06
(8) В экселе примерно 500 строк, в Справочнике около 5000
   nordbox
 
10 - 03.01.18 - 17:06
(8) я у него спрашивал в (5), молчит как партизан
 
  Рекламное место пустует
   nordbox
 
11 - 03.01.18 - 17:08
(9) И ты из-за каких то ванючих 500 строк собираешься супер стратегию развивать?
я думал 50000 или 150000 ещё можно было бы возиться
   BarokPro
 
12 - 03.01.18 - 17:08
(7) А что ты сказал, ты мне сказал что надо в функции написать запрос, но у меня и так изначально стоял вопрос, как написать этот запрос? То что по ссылке это поиск одного элемента, мне же надо найти не один элемент справочника, а все подходящие под условие (с нужным артикулом)
   BarokPro
 
13 - 03.01.18 - 17:09
(11) Простым перебором у меня оно и за полчаса не отработало
   nordbox
 
14 - 03.01.18 - 17:10
(13) ты на 286-м проце что ли сидишь?
неверю
   nordbox
 
15 - 03.01.18 - 17:10
Запихни в ТЗ справочник
https://helpf.pro/faq7/view/516.html
   BarokPro
 
16 - 03.01.18 - 17:11
(14) Возможно элементов справочника больше чем 5000, я не знаю как посмотреть
   vova1122
 
17 - 03.01.18 - 17:11
(11) значит крутится еще гдето в другом месте. прогнать простой цикл 3 ляма раз займет примерно 3-5 хв максимум
   nordbox
 
18 - 03.01.18 - 17:14
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(Сформировать)

|Номенклатура = Справочник.Номенклатура;
   nordbox
 
19 - 03.01.18 - 17:17
+18
|Атрикул = Справочник.Номенклатура.Артикул;
|Условие(Артикул = ВыбАртикул);
|"//}}ЗАПРОС;

// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;

Давно в 7.7 не заглядывал
   nordbox
 
20 - 03.01.18 - 17:17
Перед условием добавь строку
|Группировка Номенклатура;
   nordbox
 
21 - 03.01.18 - 17:18
Пока Запрос.Группировка(1) = 1 Цикл
// Заполнение полей Номенклатура


КонецЦикла;
   vova1122
 
22 - 03.01.18 - 17:23
Только запрос нужно будет прокрутить 500 раз. Думаю будет не намного быстрее. Затык нужно искать еще где-то. Так как код из (0) не может крутится пол часа при таком объеме данных.
   nordbox
 
23 - 03.01.18 - 17:27
(22) я про это тоже ему говорил в (3) )))
   abfm
 
24 - 03.01.18 - 17:30
Хоть бы конфигурацию назвал.
НайтиПоРеквизиту(<?>,,);
В ТИС артикул сортировка стоит галка.
Штрих код один на товар вообще песня. Если не весовой.
   nordbox
 
25 - 03.01.18 - 17:40
ТС, обиделся походу и сбежал
   vova1122
 
26 - 03.01.18 - 17:41
(25) нет. Крутит запрос. Ееще на пол часа в ауте
   BarokPro
 
27 - 03.01.18 - 17:56
(22) с объемом справочника я скорее всего соврал, там не 5000, а наверн 50000, завтра напишу простеньеую обработку, смогу сказать точное чмсло
(25) не обиделся, просто закончился рабочий день :) вообще не вижу смысла обижаться, вы же мне помогаете, я наоборот благодарен вам
(26) Перед отъездом запустил обработку еше раз, на данный момент за 40 минут она еще не завершилась
   vova1122
 
28 - 03.01.18 - 17:57
На всякий случай для ТС код для точного подсчета времени работы кода:
    а2=_GetPerformanceCounter();
        //,,,,,,,,,,,,,,

    а2=_GetPerformanceCounter(); 
    а=а21;
    секунд=а/1000;
   BarokPro
 
29 - 03.01.18 - 17:58
(15) с ТЗ не прокатит, мне нужно не просто найти элементы справочника, но и изменить их
   nordbox
 
30 - 03.01.18 - 17:59
(27) В любом случае, у тебя что то не так
40 мин это слишком ну оооочень много, ТИИ сделай, переиндексируй и сожми таблицу
   vova1122
 
31 - 03.01.18 - 18:00
(29) Смысл ТЗ в том, что выборка реквизитов из ТЗ проходит немного быстрее чем из Справочника
   vova1122
 
32 - 03.01.18 - 18:00
+(31) а потом при нахождении в ТЗ уже исправлять свою номенклатуру
   BarokPro
 
33 - 03.01.18 - 18:01
(19) так пробовал, но затык получается, что не могу изменить элементы справочника, в цикле группировки пишет что элемент справочника не выбран, а если запрос пускать в цикле перебора справочника, то смысла нету
 
  Рекламное место пустует
   nordbox
 
34 - 03.01.18 - 18:01
(29) Ну дык быстренько нашел, по ссылке получил и записал
   nordbox
 
35 - 03.01.18 - 18:03
>>не могу изменить элементы справочника, в цикле группировки пишет что элемент справочника не выбран,
Конечно выбрать надо,в ТЗ еще одно поле впихни Ссылка
а потом меняй и пиши
   BarokPro
 
36 - 03.01.18 - 18:03
(32) а не подкажешь как через тз изменить несколько элементов спрпвочниеа? Я не могу  связать эти 2 момента, навыков видимо не хватает
   vova1122
 
37 - 03.01.18 - 18:06
(36) не за один проход.
ТЗ отсортируешь по артикулу. Находишь первый артикул, и потом пока артикул=нужный делаешь цикл.
В итоге общее количество циклов будет намного меньше
   nordbox
 
38 - 03.01.18 - 18:06
Ты в ТЗ загоняешь справочник ОДИН раз,
дальше выборку из ТЗ делаешь по условию
Только у тебя еще будет одно поле Ссылка
в синтаксисе могу ошибиться, 77 под рукой нет
ТекНом=ТЗ.Сылка
ТекНом.Артикул=Артикул
ТекНом.ШК=ШК
ТекНом.Записать();
   abfm
 
39 - 03.01.18 - 18:07
(35) правильно советует
СоздатьОбъект("Что то") 
НайтиЭлемент(<Элемент>)
и пиши
   nordbox
 
40 - 03.01.18 - 18:16
В самом начале процедуры
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Артикул");
ТЗ.НоваяКолонка("Элемент");

Спр=СоздатьОбъект("Справочник.Номенклатура");
Спр.ВыбратьЭлементы();
   Пока Спр.Выбран() = 1 Цикл  

   ТЗ.Артикул=Спр.Атрикул;
   ТЗ.Элемент=Спр.ТекущийЭлемент();

   КонецЦикла

А потом выбирай уже из ТЗ точно так же как ты выборку делаешь из справочника
Только намного быстрее будет
   BarokPro
 
41 - 03.01.18 - 18:20
(39) это понятно, но таким способом найдет только первый элемент, а мне надо несколько. Завтра буду пытаться реализовать вышеперечисленные подсказки
   vova1122
 
42 - 03.01.18 - 18:20
Кстати После заполенения ТЗ из (40) напиши
Сообщить""всего номенклатуры- "+Тз.КоличествоСтрок());
   vova1122
 
43 - 03.01.18 - 18:21
Сообщить("всего номенклатуры- "+Тз.КоличествоСтрок());
узнаешь сколько у тебя всего номенклатуры в базе
   nordbox
 
44 - 03.01.18 - 18:22
(41)>>но таким способом найдет только первый элемент,
Это кто тебе сказал???
ЕСли не будешь прерывать цикл он найдет все
   nordbox
 
45 - 03.01.18 - 18:25
+44 если отсортируешь как положено, так вообще будет летать
   vova1122
 
46 - 03.01.18 - 18:27
Еще одна интересная функция. Но никогда ей не пользовался.
Можно проверить.
Вместо
ВыбратьЭлементы()
использовать
ВыбратьЭлементыПоРеквизиту(.....)
   vova1122
 
47 - 03.01.18 - 18:36
(0) и все, все, все.
Все мы тут придумываем от чего так долго крутится этот код.
Еще раз внимательно пресмотрите код в (0) - он будет крутится до второго пришествия....
В коде невижу перебора справочника.
Где во внутреннем цикле Спр.ПолучитьЭлемент() ?
   nordbox
 
48 - 03.01.18 - 18:45
(47) 7.7 уже тяжко вспоминать )
   vova1122
 
49 - 03.01.18 - 18:47
(0) замени строку
Пока Спр.Выбран() = 1 Цикл  
на
Пока Спр.ПолучитьЭлемент() = 1 Цикл
 
  Рекламное место пустует
   BarokPro
 
50 - 03.01.18 - 19:52
(49) Вот это я лоханулся, не отрицаю))
   BarokPro
 
51 - 03.01.18 - 20:18
(46) То что надо! Спс! Процедуру выполнил за 5 сек!)))
   BarokPro
 
52 - 03.01.18 - 20:19
(46) Спр=СоздатьОбъект("Справочник.Номенклатура");
      Для х=2 по КоличествоСтрок Цикл  
          Сообщить("Обрабатываем строку: " + х);
          Артикул = СокрЛП(Строка(Excel.Cells(х, 1).Value));
          Штрихкод = СокрЛП(Строка(Excel.Cells(х, 2).Value));   
          Спр.ВыбратьЭлементыПоРеквизиту("Артикул",Артикул,0,0);
          Пока Спр.ПолучитьЭлемент() = 1 Цикл  
              Спр.Штрихкод = Штрихкод;
              Спр.Записать();    
        КонецЦикла;
      КонецЦикла;
   nordbox
 
53 - 03.01.18 - 20:23
(52) ))) ну наконец то ))
   BarokPro
 
54 - 03.01.18 - 20:33
(43) всего номенклатуры- 13734
   nordbox
 
55 - 03.01.18 - 20:38
(54) Это фигня, чайная ложка, не больше, честное слово, база можно сказать ни о чем, пустая



Список тем форума
Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует