Имя: Пароль:
1C
 
Поиск по наименованию только среди групп справочника
0 Beduin
 
03.09.09
13:03
Как найти группу по наименованию, не перебирая все элементы.
Выбирать нужно только среди групп, так как среди элементов возможны одинаковые наименования с группой.
1 miksa
 
03.09.09
13:05
ЭтоГруппа()
2 Sadovnikov
 
03.09.09
13:07
Select
 ID [Группа $Справочник.ИмяСправочника]
From
 $Справочник.ИмяСправочника спр
Where
 спр.DESCR = 'ЧегоИщем'
 And спр.IsFolder = 1
3 Beduin
 
03.09.09
13:07
(1) В справочнике может быть до 2000 элементов, если я каждый раз буду организовывать поиск и проверять каждый на группу, то долго получается. Нужно что то вроде НайтиПоНаименованию только по группам, а не по всем элементам.
4 Beduin
 
03.09.09
13:07
(2) А средствами встроенного языка похоже никак?
5 Sadovnikov
 
03.09.09
13:08
(4) а это и есть средства встроенного языка.
6 Beduin
 
03.09.09
13:09
(5) Вы уверены, что это для семерки работает?
7 miksa
 
03.09.09
13:10
(6) Ну с компонентой 1С++ заработает..
8 Sadovnikov
 
03.09.09
13:11
(6) Абсолютно уверен.
Помним только, что в 1С есть механизм внешних компонент, который расширяет встроенный язык. В данном случае этим занимается внешняя компонента 1С++.
9 Дядя Васька
 
03.09.09
13:11
(5) На селезневке признали 1С++ штатными возможностями? :)
10 Гефест
 
03.09.09
13:12
(9) кто их спрашивает? нам тут виднее
11 Beduin
 
03.09.09
13:12
(8) Это уже не средства встроенного языка.
Просто база удаленно находится, если им я еще и компоненту тута буду бросать. Неохота просто.
12 Sadovnikov
 
03.09.09
13:12
(9) Я не знаю, что там знают или не знают на Селезневке. Но точно уверен, что внешние компоненты - абсолютно щтатное средство 1С. Даже книжечка такая есть. При чем, книжечка выпущена 1С-ом.
13 Дядя Васька
 
03.09.09
13:12
(0) Пройдись один раз по всему справочнику, свали группы в ТЗ, да там и ищи, делов-то...
14 Beduin
 
03.09.09
13:13
(13) У меня справочник каждый раз разный. Это обмен.
15 Beduin
 
03.09.09
13:13
(12) Бред.
16 Дядя Васька
 
03.09.09
13:14
(14) Ну и что? Один раз в начале обмена, доли секунды займет.
17 Sadovnikov
 
03.09.09
13:14
(11) "Это уже не средства встроенного языка" - это с чего вдруг? Именно средства. Именно встроееного языка. Расширенного при помощи ВК.
И вообще - Вам шашечки или ехать? Хотим скорости ли "использовать только те методы языка, которые описаны на страницах с 73 по 146 описания встроенного языка"?
18 Дядя Васька
 
03.09.09
13:14
+(16) Однократный перебор это не долго, даже если там 20000 элементов, а не 2000
19 Sadovnikov
 
03.09.09
13:14
(15) Где именно бред? Можно по подробнее?
20 Beduin
 
03.09.09
13:15
(17) Я завтра еще пару компонент напишу, и буду ими пользоваться. А потом у них база рухнет. И кто за это будет отвечать. Разработчик компонент. Средства платформы хотя бы проверены уже целым поколением программеров.
21 Beduin
 
03.09.09
13:16
(19) Бред про то что 1С официально утвердила 1С++.
22 Дядя Васька
 
03.09.09
13:16
(17) Штатна сама возможность подключения ВК, а все что делается с ее помощью уже за пределами типовых возможностей.
23 Sadovnikov
 
03.09.09
13:16
(20) Ты считаешь, что 1С++ не "проверены уже целым поколением программеров"? Ошибаешься...
"А потом у них база рухнет" - пиши ВК так, чтобы база не рушилась.
24 Sadovnikov
 
03.09.09
13:17
(21) А где я такой бред написал?
(22) Почему это? Или подключение ВК ради подключения?
25 Mikeware
 
03.09.09
13:17
(22) "За пределами типовых возможностей" - совсем не значит, что "не штатными" :-)
(21) 1986?
26 Дядя Васька
 
03.09.09
13:18
(23) На самом деле не стоит овчинка выделки, если это разовый заказ, а не на фикси.
(24) Подключение ВК в рамках языка 1С. Все что она делает за рамками.
27 Sadovnikov
 
03.09.09
13:20
(26)
1. Так автор скорости хотел.
2. Не соглашусь... ВК расширяют язык 1С. Но, раз это все равно язык 1С, то все оно находится в рамках этого языка. Во я сказал...
28 Beduin
 
03.09.09
13:21
Просто еще раз убедился что платформу семерки разрабатывали странные люди.(
29 Mikeware
 
03.09.09
13:21
(26) Работа с торговым оборудованием, фискальными регистраторами, сканерами ШК - вне закона?
30 Sadovnikov
 
03.09.09
13:22
(28) Э нет... Странные люди пытаются программировать в семерке. Что мы и видим в данной ветке. Извини, но на твоем примере...
А те, кто разрабатывал, они не странные. Они сделали, что смогли... Жаль только, что смогли не очень много...
31 Beduin
 
03.09.09
13:24
(30) Что там мочь, добавить в метод НайтиПоНаименованию параметр поиска среди групп. Просто отбор дополнительный по еще одному полю. И все. Делается за 30 секунд.
32 Sadovnikov
 
03.09.09
13:25
(31) Давай шире смотреть на вещи? Что им мешало изначально дать доступ к базе, используя прямые запросы? Сколько бы это проблем решило...
33 Дядя Васька
 
03.09.09
13:26
(29) А я сказал что 1С++ вне закона? Работа с торговым оборудованием, фискальными регистраторами, сканерами ШК реализована за рамками 1С, на совершенно других языках, в самой эске только пара управляющих методов появляется.
Просто любая ВК теоретически понижает стабильность системы. И цеплять ВК чтобы найти группы в справочнике, это жесть товарищи :)
34 Sadovnikov
 
03.09.09
13:27
(33) Так и сама 1С написана "на совершенно другом язеке". Не будем ее запускать?
"И цеплять ВК чтобы найти группы в справочнике, это жесть товарищи " - это не жэсть, это желание, что бы все быстро работало. С минимальными затратами со стороны программиста.
35 Mikeware
 
03.09.09
13:30
(33) "пара методов" - допустимо, а "десяток методов" - уже нет? :-)
"Просто любая ВК теоретически понижает стабильность системы." - GUI тоже понижает стабильность системы. И прочая, прочая, прочая...
36 Дядя Васька
 
03.09.09
13:30
(34) По сравнению с поиском по ТЗ ощутимой на глаз разницы не будет.
37 Beduin
 
03.09.09
13:31
(34) Есть восьмерка, нормальная платформа. Непонимаю людей которые цепляются за семерку(смесь шлака и внешних компонент.
38 Дядя Васька
 
03.09.09
13:32
Я всего лишь о том что ВК надо пользовать там, где они реально нужны. Если по каждой мелочи новую dll'ку цеплять, результат понятно какой будет. Рано или поздно одна из них начнет валить эску, причем так, что концов не найдешь, потому как зоопарк...
39 Mikeware
 
03.09.09
13:32
(37) Нечо на платформу кивать, если руки кривые...
40 miksa
 
03.09.09
13:33
компонентоСрач устроили? ))

(37) Не устраивает семерка - не программь на ней, не берись за проекты, связанные с 7.7, у тебя есть право выбора..

А вообще сколько у тебя времени уходит на перебор справочника всего с 2000 элементами? Из-за чего весь сыр-бор?
41 Beduin
 
03.09.09
13:33
(38) Она без внешних компонент еле дышит.
42 Дядя Васька
 
03.09.09
13:34
(41) Может все-таки руки? )
43 Mikeware
 
03.09.09
13:34
(38) для одной функции цеплять библиотеку, конечно, излишество. Хотя - у того же софтпойнта есть компонента только с одним методом. И причем этот метод исправляет ошибку даже не 1С, а сиквельника. Ичо?
44 Beduin
 
03.09.09
13:34
(40) Немного, но это сути не меняет. Справочник, просто объект по сути, зачем эти кривые методы там насоздовали, вот что не пойму.
45 Волесвет
 
03.09.09
13:36
ну вы млин даете найти по наименованию потом проверяем группа или нет если нет продолжаем поиск....
44 поста + вольные размышления на тему 7 и 8 ... мдя
46 Дядя Васька
 
03.09.09
13:37
(43) Если ошибка критичная, почему бы и нет. А по сабжу вполне штатное и быстрое решение на поверхности. Просто пример из жизни, напоролся как-то на то, как прямой запрос вешал эску, причем всех пользователей, причем при определенном наборе условий, полдня убил пока нашел почему висим. И оказалось, что этот запрос использован всего лишь для того чтобы выбрать подчиненные документы. Убрал, добавил штатные три строчки, висеть не стало, и на скорость не повлияло.
47 miksa
 
03.09.09
13:38
(45) Дык в первом посту и был ответ. Автору важно другое узнать, почему так криво написана семерка :)
48 Дядя Васька
 
03.09.09
13:38
(45) Интересно как ты его продолжишь...
49 Mikeware
 
03.09.09
13:39
(46) Это лишь вопрос о соотношении радиуса кривизны рук с радиусом кривизны извилин конкретного разработчика..
50 trad
 
03.09.09
13:41
(12) Справедливости ради нужно отметить, что книжка "Технология создания ВК" от 1С существует, но та методика расширения языка, которая применена в 1с++ не описана в этой книжке.
Если что, то технология в 1с++ на мой взгляд лучше.
51 Дядя Васька
 
03.09.09
13:41
(49) Да не, там реально для того чтобы написать некривой прямой (эк завернул-то:) надо было всерьез разбираться со скульными блокировками. Вероятность накосячить велика. Штатно же банально ВыбратьПодчиненныеДокументы(), и шансы влепить косяк равны нулю.
52 Beduin
 
03.09.09
13:42
Нарушена синхронизация между 1С:Предприятием и Отладчиком
Теперь это выдает)
53 Волесвет
 
03.09.09
13:44
(48) ???
в цикле все дело мутиться пока там что то равно о мы и крутим а как только нашли группу 1
54 Волесвет
 
03.09.09
13:45
мля счас спросят а если ее нет что делать))))))))))))
55 miksa
 
03.09.09
13:46
(53) Ну дак это и есть перебор всего справочника по всем 2000 элементам, чего автору не хотелось делать..
56 Волесвет
 
03.09.09
13:46
(55)?? поиск по наименованию перебор всего справочника???
57 Дядя Васька
 
03.09.09
13:47
(53) Ну накидай примерчик-то :) НайтиПоНаименованию() только первый ищет. Или ты многократный перебор предлагаешь?
58 antoneus
 
03.09.09
13:48
а чо, изменить наименование + незафиксированная транзакция...
59 Волесвет
 
03.09.09
13:48
(57) а нафига?? тут кто то про 7 нелестно говорил ... после такого помогать западло))
60 Дядя Васька
 
03.09.09
13:48
(58) А не изврат?
61 antoneus
 
03.09.09
13:49
(60) изврат, конечно. но в принципе-то возможно, хехе
62 Дядя Васька
 
03.09.09
13:49
(61) теоретически можно и штаны через голову надеть, только неудобно :)
63 Beduin
 
03.09.09
13:55
(52) Друзья если у вас будет такая ошибка, перезагрузитесь и она на время исчезает.
64 Ёпрст
 
гуру
03.09.09
14:05
(0) НайтиПоНаименованию + ЭтоГруппа() найдёт все группы...
65 VladZ
 
01.10.09
11:51
(0) А че, запросом нельзя?
66 Beduin
 
01.10.09
11:53
(65) Пример запроса в студию.
67 Ёпрст
 
гуру
01.10.09
11:55
(65) прямым - можно, обычным - нет.
68 NS
 
01.10.09
11:58
Обмельчал народ, уже не знает как штатными средствами перебрать только группы...
Всё очень просто, если "группы сверху"
69 Ёпрст
 
гуру
01.10.09
12:00
(68) Ну, не все же знают про параметры метода ВыбратьЭлементы()
70 Ёпрст
 
гуру
01.10.09
12:01
Хотя, (64) тоже найдет всё и быстро.
71 NS
 
01.10.09
12:05
Ну, отмененная транзакция это не очень хорошо.
72 NS
 
01.10.09
12:05
А вообще самое правильное - реквизит с отбором, только для групп.
73 dk
 
01.10.09
12:05
(67) а подумать? )))
74 Ёпрст
 
гуру
01.10.09
12:06
(71) это точно, тем более, если у кого-то открыта форма элемента, который "удалить" пытаемся в поиске..
:)
75 NS
 
01.10.09
12:06
(73) Запрос изначально перебирает только ЭЛЕМЕНТЫ справочника. Поэтому группа в которой нет элементов ни в один запрос попасть не может.
76 Ёпрст
 
гуру
01.10.09
12:07
(73) Ты не умничай, а напиши обычный запрос, который отберёт ВСЕ группы.
77 dk
 
01.10.09
12:07

ТекРод = Справочник.Траляля.Родитель;
ТекРодНаим = Справочник.Траляля.Родитель.Наименование;
Условие (ТекРодНаим=НаимЧтоТоТут);

хотя пустые группы (без элементов) не найдет (((
78 Ёпрст
 
гуру
01.10.09
12:08
(77) мда..
79 dk
 
01.10.09
12:08
(76) все не обещаю ))
80 Фокусник
 
01.10.09
12:13
(57) удалять, продолжать поиск, а потом отменять транзакцию ;)
81 Beduin
 
01.10.09
12:17
(69) И чем мне поможет параметр в методе ВыбратьЭлементы()
Вы хотя бы думайте что пишите.
82 Ёпрст
 
гуру
01.10.09
12:18
(81) Это ответ на (68) ..
А вам ответ - (64).
83 Beduin
 
01.10.09
12:19
(82) Он остановится на первом элементе в этом методе.
Ладно просто укажите код который ищет.
Просто интересно очень.
84 Ёпрст
 
гуру
01.10.09
12:23
(83) Наслаждайся:


НачатьТранзакцию();
Пока Спр.НайтиПоНаименованию(<тут сам>)=1 Цикл
  Если Спр.ЭтоГруппа()=1 Тогда
        //помещаем найденный в СЗ
  КонецЕсли;
  Спр.Удалить();
КонецЦикла;
ОтменитьТранзакцию()
85 NS
 
01.10.09
12:26
Процедура Сформировать()              
   т=_GetPerformanceCounter();
   спр=создатьобъект("справочник.Номенклатура");
   ТЗ=создатьобъект("ТаблицаЗначений");
   Тз.Новаяколонка("Гр","справочник.Номенклатура");
   ТЗ.новаястрока();
   ТЗ.Гр=получитьпустоезначение("Справочник.Номенклатура");
   счэл=1;
   текэл=1;
   пока текэл<=счэл цикл
       спр.использоватьродителя(ТЗ.Получитьзначение(текэл,"Гр"));
       спр.выбратьэлементы(1);
       пока спр.Получитьэлемент(0)=1 цикл
           Если спр.этогруппа()=0 тогда
               прервать;
           Конецесли;
           счэл=счэл+1;
           ТЗ.Новаястрока();
           ТЗ.гр=спр.текущийэлемент();
       Конеццикла;
       текэл=текэл+1;
   конеццикла;        
   // на этом получение групп завершено
   // Далее сверим скорость
   
   сообщить(""+(_GetPerformanceCounter()-т)+"мс.");
   сообщить(ТЗ.Количествострок());              
   
   т=_GetPerformanceCounter();
   счгрупп=1; //(пустая)
   спр=создатьобъект("справочник.Номенклатура");
   спр.выбратьэлементы();
   пока спр.получитьэлемент()=1 цикл
       Если спр.этогруппа()=1 тогда
           счгрупп=счгрупп+1;
       конецесли;    
   конеццикла;          
   сообщить(""+(_GetPerformanceCounter()-т)+"мс.");
   сообщить(счгрупп);
   ТЗ.Выбратьстроку();
КонецПроцедуры
86 NS
 
01.10.09
12:36
(85) --> (81)
87 Beduin
 
01.10.09
12:37
(84) Тебе любой нормальный спец за этот код голову оторвет.
88 Ёпрст
 
гуру
01.10.09
12:43
(87) Вот только не надо тут хню полную нести, ладно?
89 Beduin
 
01.10.09
12:48
90 1Сергей
 
01.10.09
12:53
(89) Выложи свою фотку, плиз. Чисто в глаза твои посмотреть
91 Ёпрст
 
гуру
01.10.09
13:21
(89) Зашел, дальше что?
92 aka MIK
 
01.10.09
14:54
(84) Классный код, без шуток
93 Ёпрст
 
гуру
01.10.09
14:56
(92) ну вот видишь ли, тебе теперь "любой нормальный спец за этот код голову оторвет"

:))
94 Valery
 
01.10.09
15:11
(84) собственно без вариантов. при поиске , в случае одинакового наименования элементов, всегда на группе будет позиционироваться.
95 Ёпрст
 
гуру
01.10.09
15:12
(94) чего?..
96 ДенисЧ
 
01.10.09
15:13
(94) Урожай?
97 Ёпрст
 
гуру
01.10.09
15:13
+95 вообще-то код в (84) найдет все элементы (и группы) с одним наименованием...
если что.
98 Valery
 
01.10.09
15:20
(97) про то и толкую, что первой будет группа с одинаковым наименованием.
99 Beduin
 
01.10.09
15:23
(98) Как можно этот код еще и обсуждать. Пипец.
100 ДенисЧ
 
01.10.09
15:24
(98) Отсыпь, а?
101 Ёпрст
 
гуру
01.10.09
15:33
(99) Пипец в чем ?
Аргументы есть, или так, сказать больше нечего?..
102 m g r
 
01.10.09
15:36
(99) ты сам бы что-нибудь посоветовал дельное, потом бы других обсуждал .
а что такого , за что можно руки отрывать-то ?
103 m g r
 
01.10.09
15:37
+ к (102) в коде в (84)
104 Beduin
 
01.10.09
15:38
(102) Он же в этом поиске удаляет элементы. Да в транзакции, но это все равно жесть. А если это сделают сразу несколько пользователей?!
Все. Закройте ветку. Смысла уже нет писать.
105 Ёпрст
 
гуру
01.10.09
15:39
(104)Аргументов нет. Слив засчитан.
106 Asirius
 
01.10.09
15:40
(101) (102) Пипец в том, что подумайте что происходит с таблицами на физическом уровне и как это отражается на производительности... А если это в цикле? Полный перебор элементов может даже выигрышней смотреться
107 Ёпрст
 
гуру
01.10.09
15:41
(106) Еще один ?
Ответ - ничего не происходит.
108 Ёпрст
 
гуру
01.10.09
15:41
+107 и на производительности это никак не отражается вообще.
109 ДенисЧ
 
01.10.09
15:42
(104) Отсутствие знаний зафиксировано документально...
110 Asirius
 
01.10.09
15:42
(107) А как по твоему реализуется механизм транзакций?
111 Valery
 
01.10.09
15:47
Я так понял в (0) сущестуют группы и элемены с одинаковым наименванием. И надо отделить группы от элементов? Н-р 10 элементов "Вася" и среди них 1 Группа.
НайтиПоНаименованию("Вася") найдет группу "Вася", если "Вася" будет не группой, то группы "Вася" нет в справочнике вообще.
112 Beduin
 
01.10.09
15:47
(109)ЧИТАЙ!
Транзакция, выполняемая одним пользователем может мешать выполнению транзакций другими пользователями. Таким образом, важно соизмерять полу­чающееся ускорение от применения транзакций с возможными побочными эффектами. Другими словами, возможно, что ускорение таково, что операция начинает выполняться столь быстро, что можно пренебречь влиянием на дру­гих пользователей (например, ожидание секунду – другую), а может это будет приводить к конфликтам — все зависит от конкретного алгоритма конфигура­ции.
113 Beduin
 
01.10.09
15:49
(111) Проблема в том что данный метод позиционируется на первый найденный элемент, неважно группа это или наименование.
114 Valery
 
01.10.09
15:50
(113) всегда будет группа если она есть
115 NS
 
01.10.09
15:50
(112) Ты не в курсе что транзакция запускается и при каждом проведении?
А вышеприведеная транзакция отработает за миллисекунды, и есно никому повредить не сможет. Если другой пользователь захочет сделать тоже самое - то по методу начатьтранзакцию() система будет ждать завершение транзакций начатой другим пользователем.
116 ДенисЧ
 
01.10.09
15:51
(112) головой думай, а не книги цитировай.
(114) Врёшь.
117 Valery
 
01.10.09
15:52
(116) а ты проверь
118 ДенисЧ
 
01.10.09
15:53
(117) Враньё проверять не буду
119 Asirius
 
01.10.09
15:55
(117) Я проверял для схожей задачи обмена, на SQL мне упорно находился элемент при существовании такой же группы
120 Beduin
 
01.10.09
15:55
Тут вменяемые люди есть. Уже не знаю как объяснять.
Цитирую из ЖКК
Возможность использования транзакций в языке должна применяться только в тех программных модулях, которые выполняют запись изменений в информационной базе (в справочниках, константах, документах). Их не следует использовать в алгоритмах формирования движений документов. Транзакции также не стоит использовать при одиночных записях. Типичный пример когда следует использовать транзакции — это процедура, которая будет во всех эле­ментах справочника менять некоторый параметр
Если идет "ЗАПИСЬ ИЗМЕНЕНИЙ"
Дети надоели уже.
121 Beduin
 
01.10.09
15:57
Вы же блокируете к чертям всю базу. Волшебник спаси меня!
122 Ёпрст
 
гуру
01.10.09
16:01
(120) Читай (115) много думай..
123 Asirius
 
01.10.09
16:02
+(121) Даже если на блокировку закрыть глаза, чтение и запись - совершенно разные задачи по производительности, ибо индексы. И использовать операции записи на задаче поиска, которая решается только чтением - явный ушерб производительности. Даже если в справочнике 1000000 элементов, прочитать и проиндексировать его один раз будет много быстрее, чем пытаться туда в цикле что-то писать
124 Ёпрст
 
гуру
01.10.09
16:04
(123) Болеем? там нет записи вообще. там в коде только чтение.
125 Asirius
 
01.10.09
16:06
(124) Там есть попытка туда что-то записать
Ты только представь - это надо во всех отборах и индексах сообразить, что теперь такого элемента нет и записать эту инфу во временной таблице, если это транзакция
126 Ёпрст
 
гуру
01.10.09
16:10
(125) Ау... пока транзакция не зафиксирована - нет никакой записи. А транзакцию мы вообще отменяем.
НайтиПоНаименованию - самый быстрый метод в клюшках, не считая прямого запроса.
Одинаковых наименований у вас там сколько ? Миллион ?
Код в (84)  - самый быстрый штатный метод.
Единственный минус метода - открытая форма элемента справочника на редактирование в этот момент.
Всё.
127 1Сергей
 
01.10.09
16:11
(125) Я про sql знаю очень мало. Но даже я понимаю, что пока транзакция не зафиксирована ничего с БД не происходит
128 trdm
 
01.10.09
16:13
(6) у меня работает....
129 trdm
 
01.10.09
16:18
блин, опять гиково-падаванский холисрач.
не надоело?
130 Asirius
 
01.10.09
16:23
(126)(127) с БД конечно ничего не происходит, но просчитывается инфа, что и куда нужно будет записать при фиксации транзакции. Вы хоть представте на уровне платформы, сколько это надо действий сделать (поддержать все индексы), по сравнению с обычным чтением.
131 NS
 
01.10.09
16:25
(130) Не придумывай сказки - просто замерь производительность.
Что рассказывать, если любой замер показывает что время выполнения миллисекунда?
132 NS
 
01.10.09
16:26
или ты считаешь что платформа за эту миллисекунду получит такую усталость что дальше работать не сможет?
133 Ochkarito
 
01.10.09
16:28
(130) Проведение документа, гораздо больше времени займет чем (84)
Не стоит загоняться:)
134 Asirius
 
01.10.09
16:51
(131) Написал тупой тест:

Функция ТранзакцияВЦикле()
   Спр = СоздатьОбъект("Справочник.Номенклатура");
   
   Для К = 1 По 1000 Цикл
       НачатьТранзакцию();
       Спр.НайтиПоНаименованию("Капуста квашеная",0,1);
         Спр.Удалить(1);
       ОтменитьТранзакцию()
   КонецЦикла;
КонецФункции

Функция ЧтениеВЦикле()
   Спр = СоздатьОбъект("Справочник.Номенклатура");
   
   Для К =1 По 1000 Цикл
       Спр.ВыбратьЭлементы();
       Пока Спр.ПолучитьЭлемент() = 1 Цикл
           Если Спр.Наименование = "Капуста квашеная" Тогда
               Прервать;
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
   
КонецФункции

//*******************************************
Процедура Сформировать()
   ТранзакцияВЦикле();
   ЧтениеВЦикле();
КонецПроцедуры

Результаты замера производительности


D:\1.ERT    28    ЧтениеВЦикле();    1    2.569409    77.75
D:\1.ERT    16    Пока Спр.ПолучитьЭлемент() = 1 Цикл    51000    2.186884    66.17
D:\1.ERT    27    ТранзакцияВЦикле();    1    0.735521    22.26
D:\1.ERT    6    Спр.Удалить(1);    1000    0.596650    18.05
D:\1.ERT    17    Если Спр.Наименование = "Капуста квашеная" Тогда    51000    0.242766    7.35
D:\1.ERT    7    ОтменитьТранзакцию()    1000    0.074828    2.27
D:\1.ERT    5    Спр.НайтиПоНаименованию("Капуста квашеная",0,1);    1000    0.056778    1.72
D:\1.ERT    20    КонецЦикла;    50000    0.051376    1.56
D:\1.ERT    19    КонецЕсли;    50000    0.050969    1.54
D:\1.ERT    15    Спр.ВыбратьЭлементы();    1000    0.031440    0.95
D:\1.ERT    8    КонецЦикла;    1000    0.003058    0.09
D:\1.ERT    21    КонецЦикла;    1000    0.002790    0.09
D:\1.ERT    3    Для К = 1 По 1000 Цикл    1001    0.002012    0.06
D:\1.ERT    4    НачатьТранзакцию();    1000    0.002003    0.06
D:\1.ERT    14    Для К =1 По 1000 Цикл    1001    0.002000    0.06
D:\1.ERT    18    Прервать;    1000    0.001017    0.03
D:\1.ERT    1    Спр = СоздатьОбъект("Справочник.Номенклатура");    1    0.000173    0.01
D:\1.ERT    12    Спр = СоздатьОбъект("Справочник.Номенклатура");    1    0.000136    0.01
D:\1.ERT    9    КонецФункции    1    0.000003    0.00
D:\1.ERT    23    КонецФункции    1    0.000002    0.00
D:\1.ERT    29    КонецПроцедуры    1    0.000002    0.00


Видим что тупой перебор проигрывает в 3 раза
Боюсь даже представить, во сколько раз уделает чтение в ТЗ один раз только групп, с последующим "неиндексированным" поиском по колонке...
135 Ёпрст
 
гуру
01.10.09
17:07
(134) Какую то ты хню написал..
Нужно найти ВСЕ элементы с однинаковым наименованием..
запускай и рыдай:

   Спр  = СоздатьОбъект("Справочник.Номенклатура");
   Начало=_GetPerformanceCounter();
   НачатьТранзакцию();
   Пока Спр.НайтиПоНаименованию(Наим,0,1)=1 Цикл
       Сообщить(Спр.Код);
       Спр.Удалить();
   КонецЦикла;
   ОтменитьТранзакцию();
   Сообщить((_GetPerformanceCounter()-Начало),"i");
   Начало=_GetPerformanceCounter();
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент()=1 Цикл
       Если СокрЛП(Спр.Наименование) = СокрЛП(Наим) Тогда
           Сообщить(Спр.Код);
       КонецЕсли;
   КонецЦикла;
   Сообщить((_GetPerformanceCounter()-Начало),"i");
136 NS
 
01.10.09
17:17
(134) Зависит от Базы, под ДБФ скорей всего уделает.
во всяком случае для больших обработок и загрузок я всегда собирал группы в ТЗ кодом аналогичным (85)
Но тест явно некорректный, у тебя до нахождения перебором проверяет всего 51 элемент справочника, а на практике на нормальных базах это будет в 1000 раз больше, и проиграет поиск не в три раза, а в три тысячи раз.
137 Asirius
 
01.10.09
21:05
(136)
Тест наглядно показал, что последовательное применение
НачатьТранзакцию()
Удалить()
ОтменитьТранзакцию()
на маленьком справочнике в десятки раз медленее простой операции чтения (даже без запроса).

Во сколько раз медленнее операция записи будет операции чтения на справочнике с большим количеством элементов, у которого куча отборов, и у которого есть еще и периодические реквизиты?
138 NS
 
01.10.09
22:03
(137) Я не спорю что предложенный мной (на самом деле не мной) способ лучше удаления в транзакции. :) Но транзакция тоже имеет право на жизнь. Тем более если скорость будет получаться такая-же как и на твоем тесте (0.7 мс на удаление)
139 orefkov
 
02.10.09
00:03
Сколько страстей разгорелось из-за того факта, что в 1С почему-то сделали ВыбратьЭлементыПоРеквизиту, но для Наименования сделали только Найти.
А ведь самый лучший, оптимальный, быстрый, годный ответ был еще в (2).
Идеально попадает в нужный индекс, никаких транзакций.
Но нет же, объявили ересью, ибо в желто-красном евангелии от 1С нету подходящих заповедей!
А я считаю, что "Мы не можем ждать милостей от природы. Взять их у нее - вот наша задача". Кодер ли я дрожащий или право имею? Тюк топориком - и взял что нужно.
140 Redka
 
02.10.09
08:50
(99) Запомни этот ник "Ёпрст3" и никогда с ним не спорь. Тебе, видимо, он не по зубам.
141 Sadovnikov
 
02.10.09
08:56
Что-то дятлы по форуму расшумелись... Осеннее обострение?
142 Guk
 
02.10.09
09:04
ВыборГруппы, уже обсуждали?...
143 Sadovnikov
 
02.10.09
09:05
(142) Блиииннн... Что ж ты раньше-то не напомнил про этот универсальный метод???
144 Ёпрст
 
гуру
02.10.09
09:10
(139) Там много чего нет, однако во всех типовых конфах используется перебор объектов через метаданные, который "нигде" не описан.. Окромя пособия Пита.
:)
145 Beduin
 
02.10.09
09:35
(144) Одно дело нетиповые методы, и совсеме другое во время поиска открывать транзакцию и удалять элементы. Имхо БРЕД!
146 Sadovnikov
 
02.10.09
09:35
(145) Обосновать можешь?
147 Ёпрст
 
гуру
02.10.09
09:35
(145) Товарищь, бред в чем ?
Аргументы есть, или так, поп-ить больше не о чем?
148 Beduin
 
02.10.09
09:43
(146) Ладно Епрст еще мальчишка видимо. Но ты то, уже взрослый дядька должен понимать что происходит при удалении на физическом уровне табличек.
В момент удаления очищаются ссылки на элемент во всех таблицах, а это очень долгий процесс. К тому же транзакция блокирует действия основных пользователей. Тоесть удаления элемента мало того что небезопасно, так еще и затратно по времени.
149 ДенисЧ
 
02.10.09
09:45
(148) "В момент удаления очищаются ссылки на элемент во всех таблицах" - не вэтой жизни, то есть не про 1с это.
150 Sadovnikov
 
02.10.09
09:46
(148) "Ладно Епрст еще мальчишка видимо" - во насмешил... Ёпрст - это гуру, до уровня которого еще учиться и учиться...
"В момент удаления очищаются  ссылки на элемент во всех таблицах" - сходи плюнь в морду тому, кто тебе это сказал. И не верь больше таким словам.
151 Ёпрст
 
гуру
02.10.09
09:47
(148) Деденька, зачем хню то постишь, не позорился бы..
152 Beduin
 
02.10.09
09:48
(150) (151) Ссылки действительно удаляются. С нарушением ссылочной целостности таблиц. Вот и все.
Думаете это не так?
153 ДенисЧ
 
02.10.09
09:48
(152) Мы не думаем. Мы знаем.
154 Beduin
 
02.10.09
09:50
(150) Да, и если Епрст с кодом
НачатьТранзакцию();
Пока Спр.НайтиПоНаименованию(<тут сам>)=1 Цикл
  Если Спр.ЭтоГруппа()=1 Тогда
        //помещаем найденный в СЗ
  КонецЕсли;
  Спр.Удалить();
КонецЦикла;
ОтменитьТранзакцию()

ЭТО ГУРУ
То мне от этого даже немного грустно.
155 Sadovnikov
 
02.10.09
09:51
(154) Вполне нормальный код для нечастого (разового) использования.
156 Sadovnikov
 
02.10.09
09:51
(154) А вот твои, извиняюсь, знания несколько удручают...
А вот от этого:
"Ссылки действительно удаляются. С нарушением ссылочной целостности таблиц"
у меня вообще мозг сломался.
157 Guk
 
02.10.09
09:58
(156) ну чо ты пристал? ну не знает человек ни как транзакция работает, ни как удаление в 1С происходит. ну с кем не бывает...
158 Beduin
 
02.10.09
10:03
(157) Какая разница где удалять. В транзакции или нет. Все равно на это требуется время. Но если на каждый поиск врубать транзакцию, то извините я бы таких прогеров гнал в три шеи.
Я не понимаю, вы вообще голову потеряли. Человек чтобы найти элемент удаляет похожие на него. Действительно одинесники это пипец, совсем мозг себе проели.
159 chelentano
 
02.10.09
10:08
(158) то есть, ты себя к "одинесникам" не относишь?
160 Guk
 
02.10.09
10:10
(158) время разумеется тратится на все. даже на изучение языка 1С и его особенностей. жаль что ты им пренебрег...
161 Beduin
 
02.10.09
10:18
(159) (160) Вы мне ответьте просто на мой вопрос и все.
Во время поиска удалять похожие элементы? Это нормально?!!
162 Guk
 
02.10.09
10:20
(161) Да. В тарнзакции, абсолютно нормально. Потому что пока транзакция не зафиксирована, они никуда не удалюятся, ни физически, ни формально. Не говоря уже о том, что физически они не удаляются и после фиксации...
163 NS
 
02.10.09
10:31
(158) Если удосужишься почитать ветку, и найдешь замер производительности, то увидишь что на 1000 удалений (поисков групп) тратится 0.7 секунд, по 0.7 мс. на один поиск. О каком времени идет речь?

"Какая разница где удалять. В транзакции или нет. Все равно на это требуется время. Но если на каждый поиск врубать транзакцию, то извините я бы таких прогеров гнал в три шеи."

Ты просто невминяем. Читай пост (134)
164 Эльниньо
 
02.10.09
10:54
Тут по телеку комика показали. Бывший программист. Некоторые точно не тем делом заняты.

Ёпрсту респект!
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой