Имя: Пароль:
1C
1C 7.7
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) Это фигня, чайная ложка, не больше, честное слово, база можно сказать ни о чем, пустая
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший