|
v7: Зачем массивы. если есть тз? | ☑ | ||
---|---|---|---|---|
0
Zhuravlik
24.06.12
✎
17:38
|
Здравствуйте. Уже почти два года пишу на 7, ни разу не использовал массивы. Интересно зачем они, и в каких случаях массив использовать выгоднее, чем таблицу значений, или список.
|
|||
1
ДенисЧ
24.06.12
✎
17:39
|
В запрос передавать
|
|||
2
Zhuravlik
24.06.12
✎
17:40
|
(1) Это как например?
|
|||
3
Rie
24.06.12
✎
17:43
|
(0) Ну и не используй, если тебе не надо.
В 7-ке массивы - несколько кастрированные, и использовать их можно разве что в узкоспециальных целях. |
|||
4
Zhuravlik
24.06.12
✎
17:44
|
Использовать в условии? Это будет быстрее, чем
Пример запроса: тз = СоздатьОбъект("ТаблицаЗначений"); тз.НоваяКолонка("Материал"); тз.НоваяКолонка("Количество"); ТекстЗапроса = " | Материал = Справочник.Материалы; ..... |Условие (тз.НайтиЗначение(1, 0, Материал) = 1); "; ? |
|||
5
Zhuravlik
24.06.12
✎
17:47
|
(3) Так вот и интересно понять в каких))) До сих пор видел массив только в типовой зарплате, и тогда не стал рыться, зачем именно использовали массив, а не тз))) А сейчас 8 гоняю, как-раз про коллекции значений начал проходить, там массивы, я и подумал - зачем они вообще существуют в платформе)
|
|||
6
МихаилМ
24.06.12
✎
17:48
|
(4)
быстрее, чем что ? |
|||
7
Rie
24.06.12
✎
17:49
|
(5) В 8-ке, в отличие от 7-ки - полноценные динамические массивы. Их в большинстве случаев использовать гораздо удобнее, чем списки значений (если речь не идёт об общении с пользователем).
|
|||
8
Эмбеддер
24.06.12
✎
17:54
|
в 7-ке есть еще список значений, делать как в (4) это прикол такой?
|
|||
9
Rie
24.06.12
✎
17:55
|
(8) Зачем делать проще, если можно через ж? :-)
|
|||
10
Zhuravlik
24.06.12
✎
17:56
|
(6) Я попытался понять (1), он имеет в виду что массивы в условии запроса быстрее чем тз?
(7) Но в 8 ведь тоже есть тз? Вызов тз как диалога, это плюс к тз, и тогда еще непонятней, зачем разрабы в 7 делали массивы... (8) Это не прикол, если много значений в фильтре, и запрос большой - работает с тз быстрее, чем со списком. (9) Не ожидал от вас) |
|||
11
Эмбеддер
24.06.12
✎
17:59
|
(10) насчет быстрее списка значений как можно объяснить, в чем причина?
|
|||
12
andrewks
24.06.12
✎
18:00
|
(11) неэффективный штатный поиск при больших размерах списка
|
|||
13
Rie
24.06.12
✎
18:03
|
(10) Да. В 8-ке есть таблицы значений, есть списки значений, есть массивы, есть структуры, есть соответствия... Много чего есть. У каждой структуры данных - своё назначение.
В 7-ке массивы делали, видимо, в спешке, "заимствуя" из других языков программирования. Поэтому результат получился весьма неудачным. Есть примеры, когда использование массивов необходимо (в частности, в запросах - на форуме это обсуждалось). Но таких примеров - весьма и весьма немного. Сомнение в коде из (4) - вполне оправдано (в том примере кода, который приведен, IMHO, без дополнительных пояснений не видно причин использовать именно таблицу значений). |
|||
14
Zhuravlik
24.06.12
✎
18:06
|
(11) вероятно тз быстрее обрабатывается в запросе хз почему ("спасибо кэп)", я знаю). Просто был случай - вот здесь ((12) - вы советовали, я помню) )Запрос и список, я тогда мучился со списком, надо было отфильтровать данные и отобразить в диалоге на форме, лепил консольку для пользователя. С тз в запросе обновление было практически незаметно, а вот со списком притупливало.
Но вообще, если бы кто обьяснил про массивы... (13) ну так на то и пример... |
|||
15
andrewks
24.06.12
✎
18:07
|
(13) насчёт тормозов конструкции в запросе " в СЗ" - это, как бы, баян
|
|||
16
Rie
24.06.12
✎
18:07
|
(14) В 7-ке? Да просто не используй массивы, пока не припрёт. Неудачно они в 7-ке реализованы.
|
|||
17
МихаилМ
24.06.12
✎
18:08
|
(10)
для скл версии передача списка значнний ,для условия отбора,как массив - быстрее. Это связано с тем, что 1с77 для каждлго элемента создает хранимую процедуру исполняет её и затем удаляет. но есть ограничение на колво элементов проверки условия (точнее на размер текста запроса ), тк передача происходит тупо составление текста запроса вида УСЛОВИЕ( поле = Массив[i] ИЛИ поле = Массив[i+1]+ ... . Ваш пример - с точки зрения быстродействия - ужасен, тк для реализации подобного условия 1с77 сначала скачает выборку на клиент, а затем применит к ней условие |
|||
18
andrewks
24.06.12
✎
18:12
|
(17) для скл - возможно, не тестировал. способ был протестирован на файловой версии в терминальнике, ускорение по сравнению с СЗ - в разы
|
|||
19
EvgeniuXP
24.06.12
✎
18:13
|
СЗ - для интерактивной работы, а не в запрос его пихать :)
|
|||
20
Zhuravlik
24.06.12
✎
18:13
|
(17) База была как раз SQL. И причем на клиенте было подключение ЛОКАЛЬНОЕ т.е. даже не через терминалы. Я знал, что тормоза будут в любом случае, но тогда тз в запросе меня выручила, я уж не знаю что внутри платформы происходит, когда идет выборка, но тогда тз реально была быстрее чем список.
|
|||
21
Rie
24.06.12
✎
18:13
|
(18) SQL и файлы - две больших разницы, в том числе и по быстродействию.
(15), (18) И ещё один момент. Если список значений - _большой_, то во многих случаях имеет смысл призадуматься: а что в нём лежит. |
|||
22
andrewks
24.06.12
✎
18:14
|
(21) 2. глянь в штатную обормотку формирования прайса в ТиС 7.7, и поймешь :)
|
|||
23
andrewks
24.06.12
✎
18:15
|
(19) видимо, разработчикам типовых об этом сказать забыли
|
|||
24
vladko
24.06.12
✎
18:16
|
я массивы однажды использовал, когда какой-то хитрый отчёт писал в ПУБе. Больше ни разу.
|
|||
25
EvgeniuXP
24.06.12
✎
18:16
|
(23) тогда проблем не было с СЗ.
|
|||
26
Zhuravlik
24.06.12
✎
18:23
|
В общем, понятно. Массивы в 7 остались как ошибочный элемент платформы, которого по-идее быть не должно поскольку хз зачем он там вообще нужен) Всем спасибо))
|
|||
27
Сияющий Асинхраль
24.06.12
✎
18:28
|
(0) Массивы в 7-ке сделали - чтобы были. А в реальности их использование очень сильно от программистской школы зависит, как то видел зарплату написанную явно бывшими паскальщиками - в коде одни массивы, причем названия у них такие уютные :-) А, АА, Б, АБ и т.д. Пока разбирал код - чуть не повесился :-)
К тому же я, например, за десять лет в семерке ни разу меток не использовал, но не берусь утверждать, что они не нужны :-) , хотя есть здесь и такие граждане |
|||
28
Zhuravlik
24.06.12
✎
18:34
|
(27) вот, кстати - метки))) Еще один непонятный мне элемент платформы. Пару раз порывался их использовать в коде, но и тогдашний мой начальник, и форумчане говорили что лучше этого не делать. А "почему?" просто говорилось, что не надо, и все. Мол, читаемость кода, и вообще можно и без них. Можно-то можно, но были случаи, когда их использование казалось мне рациональным, но я этого не делал следуя советам опытных товарищей. А почему все-же?
|
|||
29
Rie
24.06.12
✎
18:45
|
(28) Теоретически - потому, что при использовании меток и переходов становится сложным сформулировать (и тем более понять) логику кода, что затрудняет написание и отладку программы (подробнее см. Э.Дейкстра, "Дисциплина программирования")
Метки в 1Сике нужны лишь постольку, поскольку нет выходов из глубоко вложенных структур. |
|||
30
Rie
24.06.12
✎
18:47
|
+(29) (Но если хочешь поговорить о метках - лучше создай отдельную тему. Удобнее по техническим причинам).
|
|||
31
andrewks
24.06.12
✎
18:48
|
(30) думаю, нет смысла - уже всё сто раз перетёрто
Теорема Бома — Якопини реалистична? или снова про goto |
|||
32
Rie
24.06.12
✎
18:49
|
(31) Отдельную тему - закрыть проще, без ущерба для прочего :-)
|
|||
33
Zhuravlik
24.06.12
✎
18:56
|
(31) обьемно, спасибо, почитаю)
|
|||
34
Rie
24.06.12
✎
19:06
|
(33) Недостаток преобразования по Бома-Якопини - необходимо бывает введение дополнительных переменных.
Кроме того, есть continuations - по сути те же goto, но математически корректные. Но в 1Сик их не втащишь... :-( |
|||
35
Эмбеддер
24.06.12
✎
19:09
|
(28) меток надо избегать любым способом чтобы не быть обвиненным в быдлокодерстве)))
причина в анекдоте про обезьян "здесь так принято" |
|||
36
Rie
24.06.12
✎
19:14
|
(35) Причина в другом. Думающий программист всегда знает, в каком состоянии должно быть вычисление после выполнения того или иного оператора - и может выразить это состояние неким разумным условием (см. оператор assert в некоторых более других языках программирования, а также пре- и постусловия процедур). Соответственно, и читателю программы понятно, что и зачем тут делается. Если есть метки и переходы, то эта возможность теряется.
|
|||
37
izekia
24.06.12
✎
19:43
|
(35) по сути весь функционал переходов реализуется с помощью Если ... Иначе
фактически под ними будут те же гоуту-джампы, так как в асме нет если-тогда безусловные переходы вообще отдельная тема, и я использовал их только когда писал на асме ... с другой стороны с точки зрения повышения быстродействия лучше использовать переходы вместо рекурсии собственно это же и касается массивов, не помню как с семеркой, но в восьмерке массивы использую часто, и это дает преимущество в производительности тз - это динамика, в массиве же можно изначально задать фиксированный размер |
|||
38
Rie
24.06.12
✎
19:50
|
(37) Насчёт "переходы вместо рекурсии" - тут поподробнее, пожалуйста. Хвостовая рекурсия ведь эквивалентна циклу.
|
|||
39
izekia
24.06.12
✎
20:09
|
(38) не всегда можно использовать хвостовую рекурсию, а во вторых компилятор должен ее корректно определять и преобразовывать в цикл
в этом случае явные переходы через несколько окончаний цикла, к примеру, будут более эффективны |
|||
40
Rie
24.06.12
✎
20:12
|
(39) Ну, 1Совский компилятор не сильно утруждает себя оптимизациями... :-)
Насчёт выходов из вложенных циклов - согласен. |
|||
41
Junior1s
24.06.12
✎
20:13
|
(36) без динамики разве не теряется универсальность ?
|
|||
42
izekia
24.06.12
✎
20:23
|
(41) все зависит от конкретного случая: к примеру если я точно буду знать размер массива в конечном итоге, то я могу использовать его без потери универсальности
далее, я могу задать предположительный размер массива, и при необходимости динамически увеличивать его размер, опять же универсальность на месте конечно если нужна сортировка значений и тп, то предпочтительнее использовать таблицу |
|||
43
Rie
24.06.12
✎
20:25
|
(41) Нет. Динамика сохраняется. Вопрос - в контроле, я бы даже сказал, в "вычислимости".
|
|||
44
Эмбеддер
24.06.12
✎
20:27
|
(39) если надо выходить из вложенного цикла сразу на нулевой уровень, достаточно оформить этот код в отдельную процедуру, тогда выход через "возврат"
|
|||
45
Rie
24.06.12
✎
20:31
|
(44) В общем случае - не всё так просто.
|
|||
46
izekia
24.06.12
✎
20:33
|
(44) выход может быть не на нулевой уровень
плюс мы теряем локальные переменные |
|||
47
Зеленый Кот
24.06.12
✎
20:53
|
массивы и ТЗ - отстой в вчерашний день!
деревья списков значений - вот настоящее! |
|||
48
Steel_Wheel
24.06.12
✎
20:53
|
(0) в 7.7 массив -- тз с одной строкой )
|
|||
49
izekia
24.06.12
✎
20:55
|
(48) с чего бы это?
|
|||
50
izekia
24.06.12
✎
20:55
|
(47) шутка?
|
|||
51
IamAlexy
24.06.12
✎
20:57
|
(47) правильные программисты сохраняют коллекции в текстовые файлы и читают их из файлов при необходимости
|
|||
52
IamAlexy
24.06.12
✎
20:57
|
+(51) это между прочим экономи оперативную память
правильный программист должен экономить оперативную память.. а то иш привыкли к гигабайтам озу... |
|||
53
Зеленый Кот
24.06.12
✎
21:01
|
(51)
в 7.7 нет коллекций ;) |
|||
54
Зеленый Кот
24.06.12
✎
21:01
|
а обращения к диску происходят медленнее чем к ОЗУ
|
|||
55
izekia
24.06.12
✎
21:04
|
(53) сз
|
|||
56
YV
24.06.12
✎
21:57
|
В 8-ке в параметр сеанса можно передать массив, причем только фиксированный. А параметры сеанса нужны для работы RLS.
|
|||
57
IamAlexy
24.06.12
✎
22:01
|
(53) ну то что было до коллекций.. всякие там массивы, списки, таблицы и тд и тп..
|
|||
58
izekia
24.06.12
✎
22:43
|
(57) жесть, а что такое коллекции?
|
|||
59
milan
24.06.12
✎
23:05
|
А массив и ТЗ не одинаково хранятся ?
|
|||
60
NS
24.06.12
✎
23:07
|
(27) Массивы в семерке в несколько раз быстрее ТЗ.
|
|||
61
Сияющий Асинхраль
24.06.12
✎
23:47
|
(44) а меня всегда бесило гуляние по куче разных процедур и функций из разных модулей, особенно, если их использование не обосновано логикой, как в этом случае, улучшения читаемости нет ни на грошь
|
|||
62
Эмбеддер
24.06.12
✎
23:49
|
(61) в 1С это сплошь и рядом. тоже не нравится. но по опыту если блоки с кучей вложенных циклов объединить в процедуру, будет только удобнее
|
|||
63
Steel_Wheel
24.06.12
✎
23:53
|
(60) А как ты к версии в (48) отнесешься?
Мне это старший товарищ сказал в бородатом 2006-ом, когда я еще на преддипломной практике был. У товарища было тиражное решение, успешно продававшееся. Думаю, он вряд ли мне нагло врал ) |
|||
64
Сияющий Асинхраль
25.06.12
✎
00:04
|
(62) а я легче воспринимаю сплошной текст, чем скачки туда-сюда :-( в поисках невнятных процедур. Только-только нарвался на такой вариант - маленькая функция с парой вложенных циклов, весь код бы уместился на экране монитора, если с меткой, нет народ метку не ставит, использует функцию из другого модуля
|
|||
65
Сияющий Асинхраль
25.06.12
✎
00:14
|
(60) да я не против массивов, сам при переходе с дельфей на 1с тяжко привыкал к тз, просто привык давать внятные, не требующие комментариев наименования переменным, а названия типа А, Б и т.д убивало понимание, да и массивы там использовались некорректно - в зависимости от номера элемента в массиве была разная обработка :-( этих элементов
|
|||
66
NS
25.06.12
✎
00:17
|
(63) Такой вариант по быстродействию я не сравнивал, но присвоение в ТЗ в любом случае дольше чем в массив, даже на одной ячейке. Так что это не совсем так.
|
|||
67
Сияющий Асинхраль
25.06.12
✎
00:24
|
(66) а кстати, не в курсе почему в семерке была очень существенная разница в быстродействии, если искать значение в списке значений, и просто проверять принадлежность списку? Принадлежит() тормозит просто жутко
|
|||
68
NS
25.06.12
✎
00:28
|
(67) Нет, не в курсе.
|
|||
69
viktor_vv
25.06.12
✎
00:30
|
(67) Не берусь утверждать, но можнт это связано с тем, что принадлежит() ищет с учетом иерархии.
"то проверка выполняется с учетом его возможного вхождения в группы справочников, которые являются значениями списка значений." |
|||
70
viktor_vv
25.06.12
✎
00:34
|
(69)+ Тогда каждый элемент списка, как минимум, надо проверять на тип значения и потом еще и на группа, не группа. Это если проверяется элемент справочника на принадлежит.
|
|||
71
izekia
25.06.12
✎
00:42
|
(69) в десятку
|
|||
72
Asirius
25.06.12
✎
01:14
|
(0) Ненужны массивы?? Мне как-то для реализации универсальных вертикальных группировок не хватило наличия двухмерных массивов.
примерно вот такой код пришлось городить... Перем ВертикальнаяГруппировка1[1000]; Перем ВертикальнаяГруппировка2[1000]; Перем ВертикальнаяГруппировка3[1000]; Перем ВертикальнаяГруппировка4[1000]; Перем ВертикальнаяГруппировка5[1000]; Перем ВертикальнаяГруппировка6[1000]; Перем ВертикальнаяГруппировка7[1000]; Перем ВертикальнаяГруппировка8[1000]; Перем ВертикальнаяГруппировка9[1000]; Перем КоличествоВертикальныхЭлементов; Процедура УстановитьФункцииЗапросаПоЗначениямСтолбцов(ТекстЗапроса) Перем ТекстУсловия[9]; Для К=1 По КоличествоВертикальныхЭлементов Цикл Для Усл = 1 По 5 Цикл Если Усл = 1 Тогда ЗначениеКолонки = ВертикальнаяГруппировка1[К]; ИначеЕсли Усл = 2 Тогда ЗначениеКолонки = ВертикальнаяГруппировка2[К]; ИначеЕсли Усл = 3 Тогда ЗначениеКолонки = ВертикальнаяГруппировка3[К]; ИначеЕсли Усл = 4 Тогда ЗначениеКолонки = ВертикальнаяГруппировка4[К]; ИначеЕсли Усл = 5 Тогда ЗначениеКолонки = ВертикальнаяГруппировка5[К]; ИначеЕсли Усл = 6 Тогда ЗначениеКолонки = ВертикальнаяГруппировка6[К]; ИначеЕсли Усл = 7 Тогда ЗначениеКолонки = ВертикальнаяГруппировка7[К]; ИначеЕсли Усл = 8 Тогда ЗначениеКолонки = ВертикальнаяГруппировка8[К]; ИначеЕсли Усл = 9 Тогда ЗначениеКолонки = ВертикальнаяГруппировка9[К]; КонецЕсли; Если ЗначениеКолонки="" Тогда ТекстУсловия[Усл] =""; Иначе НазваниеГруппировки = СписокГруппировокСтолбцы.ПолучитьЗначение(усл); Если ТипЗначенияСтр(ЗначениеКолонки)="Справочник" Тогда Если ЗначениеКолонки.ЭтоГруппа()=1 Тогда ТекстУсловия[Усл] = "("+НазваниеГруппировки+" в ВертикальнаяГруппировка"+усл+"["+к+"])"; Иначе ТекстУсловия[Усл] = "("+НазваниеГруппировки+"= ВертикальнаяГруппировка"+усл+"["+к+"])"; КонецЕсли; Иначе ТекстУсловия[Усл] = "("+НазваниеГруппировки+"= ВертикальнаяГруппировка"+усл+"["+к+"])"; КонецЕсли; КонецЕсли; КонецЦикла; ТекстЗапроса = ТекстЗапроса+" |Функция Функ"+к+" = Сумма(Приход-Расход) Когда ("+ТекстУсловия[1]+" Для Усл=2 По 9 Цикл Если ПустоеЗначение(ТекстУсловия[Усл])=0 Тогда ТекстЗапроса = ТекстЗапроса +" |И "+ТекстУсловия[Усл]; КонецЕсли; КонецЦикла; ТекстЗапроса = ТекстЗапроса+" |);"; КонецЦикла; КонецПроцедуры |
|||
73
NS
25.06.12
✎
02:31
|
(72) Какбы двухмерный массив от одномерного ничем не отличается.
|
|||
74
NS
25.06.12
✎
02:33
|
В твоем случае, вместо индексации [в,г]
Просто пишешь [в*1000+г], и массив объявляешь на 10000. |
|||
75
1dvd
25.06.12
✎
07:41
|
(0) ты ещё про СЗ спроси
|
|||
76
Песец
25.06.12
✎
07:57
|
(0) имхо, тяжкое наследие 7.0, в которой не было тз.
|
|||
77
Рэйв
25.06.12
✎
08:00
|
(76)тогда уж 7.5:-)
Последняя версия без тз. Может и была в природе 7.6, но я ее не видел |
|||
78
Песец
25.06.12
✎
08:10
|
(77) Когда переходил на снеговика, больше всего смутило обилие типов - когда какой использовать хез. И до сих пор не знаю - смотрю как аналогичная задача решена в типовых и делаю по образу и подобию. Анализировать когда что оптимальнее использовать даже не пытаюсь :(
|
|||
79
Рэйв
25.06.12
✎
08:22
|
(78)>>когда какой использовать хез
в СП же показано всегда всегда каике типы используются в методе и что возвращается. К обилию просто привыкнуть нужно, ничего особо страшного. Это еще спасибо скажи, что свои классы писать нельзя. А то бы ты в чужой конфе вообще утонул,если бы каждый писатель к существующим еще и свои типы ваял:-) |
|||
80
ЧеловекДуши
25.06.12
✎
08:23
|
(0)В 7.7 это просто баловство :)
|
|||
81
ЧеловекДуши
25.06.12
✎
08:24
|
(72)А не проще было бы через ТЗ все организовать?
|
|||
82
Chai Nic
25.06.12
✎
08:32
|
(81) Для реализации многомерных структур данных в семерке самое то использовать индексированную таблицу из 1с++. Стандартная таблица значений тормозная и неудобная в плане фильтрации
|
|||
83
1dvd
25.06.12
✎
08:38
|
(79) Зато в семерке как раз можно создавать классы :)
|
|||
84
Рэйв
25.06.12
✎
08:43
|
(83) Через 1с++? :-)
|
|||
85
Ёпрст
25.06.12
✎
09:09
|
(0) без массива не слепить условие в тексте оле-запроса.
|
|||
86
Ёпрст
25.06.12
✎
09:09
|
+85 по вхождению в список значений, например
|
|||
87
Фокусник
25.06.12
✎
09:15
|
(10) > зачем разрабы в 7 делали массивы...
Когда "разрабы делали 7", то ТЗ там не было (в 7.5 например), а появились они только в 7.7. И что, по-твоему, "разрабы" должны были при добавлении ТЗ в язык, УБРАТЬ массивы? Зачем? :) |
|||
88
Mikeware
25.06.12
✎
09:19
|
(73)(74) Для этого нужно иметь некоторое понимание, "что ж такое массив", и умение думать.
|
|||
89
VladZ
25.06.12
✎
09:21
|
(0) Для специализированных задач.
|
|||
90
Salimbek
25.06.12
✎
09:21
|
Как верно заметил NS скорости работы в 1С 7.7 с массивами и ТЗ (или ИТЗ из 1С++) несравнимые. Очень хорошо я это ощутил, когда писал для PlanetWars::1C
|
|||
91
VladZ
25.06.12
✎
09:23
|
Вот отличный пример, где можно использовать массив: http://www.kansoftware.ru/?tid=4273
|
|||
92
1dvd
25.06.12
✎
09:26
|
(88) не соглашусь. Для того, чтобы использовать одномерный массив как двумерный, понимать что такое массив совсем не обязательно :)
|
|||
93
Z1
25.06.12
✎
10:29
|
(0) ТЗ появились по моему с 7.7
Массивы были сразу начиная с 7.0 |
|||
94
Адинэснег
25.06.12
✎
10:35
|
(0) зачем семерка, если есть восьмерка?
|
|||
95
izekia
25.06.12
✎
10:42
|
(78) пример?
|
|||
96
izekia
25.06.12
✎
10:42
|
(94) зачем 1С если есть ВС
|
|||
97
1dvd
25.06.12
✎
10:45
|
Зачем компьютер, если есть наркотики?
|
|||
98
izekia
25.06.12
✎
10:49
|
(97) тонко подмечено)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |