Имя: Пароль:
1C
1C 7.7
v7: Как ускорить выполнение простой обработки?
,
0 sysadminlk
 
01.09.12
14:29
Таб = СоздатьОбъект("ТаблицаЗначений");
   Таб.НоваяКолонка("Контр","Справочник.Контрагенты");
   Таб.НоваяКолонка("Дата","Дата");
   
   //формирую список дат на данного контрагента
   ТабДокум.ВыбратьСтроки();
   Пока ТабДокум.ПолучитьСтроку() = 1 Цикл
       Если ТабДокум.Контр <> Контр Тогда
           Продолжить;
       КонецЕсли;
       Таб.НоваяСтрока();
       Таб.Контр = ТабДокум.Контр;
       Таб.Дата = ТабДокум.Дата;
   КонецЦикла;
   
   Возврат Таб;

ТабДокум около 60000 строк
Функция вызывается 20000 раз

Обработка по времени выполняется примерно 20000 секунд - это долго!


Вопрос: как быстро выгрузить строки с именем контрагента из "ТабДокум" в таблицу "Таб"?
1 milan
 
01.09.12
14:33
ТабДокум отсортируй по контрагенту, вроде и поиск есть по колонке, можно найти первую строку с этим контром
2 Skylark
 
01.09.12
14:38
Запрос.
Прямой запрос.
3 milan
 
01.09.12
14:40
(2) для начала можно работу с тз освоить, а в этом случае не прямой запрос, а индексирванная таблица рулите
4 Скользящий
 
01.09.12
14:45
Запросом.
5 sysadminlk
 
01.09.12
14:45
(1) первую найду, а последнюю как вычислить?
6 Wobland
 
01.09.12
14:46
одно сравнение, два присваивания и НоваяСтрока() работают целую секунду? унылая семёрка!
7 ЧеловекДуши
 
01.09.12
14:46
Команда "ТабДокум.ВыбратьСтроки();" с большими объемами информации работает медленно :)
8 ЧеловекДуши
 
01.09.12
14:47
+ Давай лучше покажи полный код, а то по первым пяти буквам нам сложно дать рекомендации :)
9 ЧеловекДуши
 
01.09.12
14:47
(6)ТС - лукавит
10 ЧеловекДуши
 
01.09.12
14:48
(5)Сортировкой

ТЗ.Сортировать("Твой реквизит, Еще один, и т.д.");
11 Wobland
 
01.09.12
14:49
>Функция вызывается 20000 раз
20 тысяч возвращённых ТЗ? что-то автор не то делает или говорит
12 Skylark
 
01.09.12
14:49
(5) с первой строки выполняй свой цикл и условие, а как условие не сработает, то "Прервать"
13 ЧеловекДуши
 
01.09.12
14:51
+ если быть конкретней, то:

шш1 = 0;
Если Тз.НайтиЗначение(ИскомоеЗначение,шш1,"Колонка где ищем")=1Тогда
 Пока шш1 <= Тз. КоличествоСтрок() Цикл
    //Тут проверяешь, на соответствие следующей строки

    //Тут выполняешь манипуляцию

    шш1 = шш1 +1;
 КонецЦикла;
КонецЕсли;
14 andrewalexk
 
01.09.12
14:54
:) как ТабДокум-то получил?
15 Mikeware
 
01.09.12
15:09
И откудова такие берутся?
16 Mikeware
 
01.09.12
15:10
пардон, увидел... и место проживания, и год рождения...
17 sysadminlk
 
01.09.12
15:21
(12) спасибо, вроде быстрее обрабатывает
18 sysadminlk
 
01.09.12
15:23
(11)
60000 документов
20000 контрагентов
узнаю сколько документов на контрагента
19 Chai Nic
 
01.09.12
15:23
Всё-таки 1с++ не зря придуман.. прямые запросы и индексированные таблицы - это ПРОСТО и ЭФФЕКТИВНО!
20 Mikeware
 
01.09.12
15:29
(19) Тут достаточно СП читать, даже без прямых запросов и ИТ
21 Wobland
 
01.09.12
15:32
(18) такие анальные боли ради того, чтобы узнать _количество_ документов по контрагенту?
22 sysadminlk
 
01.09.12
15:37
(21) как-то нужно найти постоянных клиентов компании
23 Wobland
 
01.09.12
15:39
(22) тут либо напильник гладкий, как зеркало, либо руки мастера, кривые как сабля. так и не сказал, что ты делаешь с 20 тысячами ТЗ
24 sysadminlk
 
01.09.12
15:40
//формирую список расходных на данного контрагента
   ТабДокум.Сортировать("-Контр");
   НомСтр = "";
   НомКол = "";
   Если ТабДокум.НайтиЗначение(Контр,НомСтр,НомКол) = 1 Тогда
       Для Сч=НомСтр По ТабДокум.КоличествоСтрок() Цикл
           ТабДокум.ПолучитьСтрокуПоНомеру(Сч);
           Если ТабДокум.Контр <> Контр Тогда
               Прервать;
           КонецЕсли;            
           Таб.НоваяСтрока();
           Таб.Контр = ТабДокум.Контр;
           Таб.Дата = ТабДокум.Дата;
       КонецЦикла;
   КонецЕсли;

Вроде-бы быстрее стало, но не много.
25 ЧеловекДуши
 
01.09.12
15:40
(24)Ха Ха... А вроде не пятница :)
26 ЧеловекДуши
 
01.09.12
15:42
+(24)Ты вроде нечего не понял... ДНК, неизлечим.
Обрати внимание на код в (13), он будет продуктивней...

Но на самом деле тебе нужен банальный запрос по документам отгрузки с счетчиком :)

+ Наймите наконец программиста, не гоже сис-админу программировать :)
27 Wobland
 
01.09.12
15:44
всё таки дело в кислоте, да? но всё равно семёрка - фекалия
28 ЧеловекДуши
 
01.09.12
15:44
+(24)Сори... код ты осознал... Но он тебе не нужен :)
29 sysadminlk
 
01.09.12
15:44
(23) в "ТабДокум" собрал даты нужных документов, получилась табличка 60327 строк с полями "дата", "контр"

есть справочник контрагентов там около 20000 контрагентов
выбираю элементы из справочника и проверяю сколько записей на данный элемент в таблице "ТабДокум"
30 Chai Nic
 
01.09.12
15:45
(24) Хочешь чтобы было намного быстрее - используй 1с++. Штатные методы последовательной выборки данных не быстрые.
(25) Думаю, замена цикла "Для" на цикл "Пока" особо не ускорит выполнение.
(27) Семерку не ругайте - если в восьмерке выбирать данные аналогичными методами, будет еще медленнее! )
31 ЧеловекДуши
 
01.09.12
15:45
(29)Нафига тебе все в ТЗ?
Тебе нудно только знать, сколько раз тот или иной клиент грузился за определенный период :)
32 ЧеловекДуши
 
01.09.12
15:46
(30)Дело не в цикле, дело в том, что бы сразу найти нужный элемент и идти по циклу дальше.
33 sysadminlk
 
01.09.12
15:47
(31) не только покупал, там еще есть условия, бух итоги не подойдут
34 sysadminlk
 
01.09.12
15:47
Поэтому список в ТЗ выгрузил
35 Wobland
 
01.09.12
15:49
(30) нет нужды делать аналогичные методы при наличии нормальных. я тут на семёрку пересаживаюсь.. непроходящее ощущение чего-то противоестественного
36 ЧеловекДуши
 
01.09.12
15:49
(33)Какие бух итоги?
Ты вообще про какую БД ведешь речь?
Бухгалтерия, Торговля и склад, или еще что?
37 Chai Nic
 
01.09.12
15:50
(35) Для семерки есть 1с++ уже много лет. Там нормальные методы.
38 ЧеловекДуши
 
01.09.12
15:50
(35)Помнится самые странные ощущения были пересесть с прямых SQL запросов на запросы от 1С :)
39 Mikeware
 
01.09.12
15:50
(35) да, собственно, и при переходе на снеговика такое же ощущение. Дело привычки...
а (0) просто решает задачу ректальным образом...
40 Chai Nic
 
01.09.12
15:51
(35) На семерочные "черные запросы" пересаживаться не надо.. их надо не замечать, как будто не существует. Спокойнее жить будет.)
41 ЧеловекДуши
 
01.09.12
15:51
(37)1С++ по сути интерфейсная часть для взаимодействия SQL и 1С на понятном языке для программиста.
Плюс туда напихали доп. функционала и неплохого :)
42 Wobland
 
01.09.12
15:52
кстати, раз уж тут все собрались, простой вопрос. есть справочник с реквизитом типа Документ. задача: вывести номера документов в ТабДок. делал запрос (ну тот который ненормальный), он мне так и не показал. ТекущийДокумент есть, а НомерДок нет. что не так?
43 Wobland
 
01.09.12
15:53
(42) НомерДок тоже есть, но "       1631". и ДатаДок пустая
44 Mikeware
 
01.09.12
15:54
(40) именно так.
45 ЧеловекДуши
 
01.09.12
15:54
(43)Номер документа это строка, что ты хочешь от неё?
Даже если в конфигураторе стоит "Номер типа Число", он все ровно будет типа строка :)
46 Mikeware
 
01.09.12
15:54
(42) ненормальных запросов я не знаю :-)
47 Chai Nic
 
01.09.12
15:54
(41) И этот допфункционал удачно дополняет убогие штатные объекты.. причем хорошо с ними взаимодействуя - та же индексированная таблица может обмениваться данными с обычной. Плюс нормальный человеческий язык запросов вместо одинесовского недоразумения..
48 ЧеловекДуши
 
01.09.12
15:55
+(43)Для визуализации документа лучше использовать функцию "глПредставлениеДокумента()", оно не даром почти в каждой конфе :)
49 ЧеловекДуши
 
01.09.12
15:56
(47)Это точно :)
50 Wobland
 
01.09.12
15:57
(45) беру ТекущийДокумент, вывожу в ТабДок - "Реализация БР00000001 от какой-то даты". а результат запроса - хрень какая-то. открываю по расшифровке документ - вижу тот же БР0001й номер
51 Wobland
 
01.09.12
15:57
(46) в документации какие описаны? с функциями и переменными
52 GreyK
 
01.09.12
15:59
(0) У тебя ошибка здесь:
//формирую список дат на данного контрагента

Ей, ей не вру :)
53 ЧеловекДуши
 
01.09.12
15:59
(50)Нормально. НЕ понял, что куда, но так оно и есть :)
54 Mikeware
 
01.09.12
16:00
(51) идиотские. которые калечат психику
55 Wobland
 
01.09.12
16:01
(53) плин, пальцы мои косноязычны. можешь привести пример запроса, вынимающего номера документов из реквизитов элементов справочника типа Документ?
(54) отлично сказано! ;)
56 Mikeware
 
01.09.12
16:02
(55) сделай прямым и не мучайся...
57 Wobland
 
01.09.12
16:04
(56) если б ещё уметь.. задача закрыта (в цикле выборки проверку воткнул), возвращаться к ней практического смысла нет, вопрос носит чисто познавательный характер
58 ЧеловекДуши
 
01.09.12
16:04
(55) Ты надеюсь это делал не на запросе от 1С? :)
59 Wobland
 
01.09.12
16:05
(58) именно в тот самом идиотском запросе
60 Wobland
 
01.09.12
16:05
+(59) даже конструктором
61 ЧеловекДуши
 
01.09.12
16:06
(59)А чем тебя не устроил простая ссылка из реквизита (типа документ)?
Зачем было разворачивать еще и до номеров документов?
62 Wobland
 
01.09.12
16:07
(61) чтоб условие на номер сделать
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший