Имя: Пароль:
1C
1C 7.7
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) тонко подмечено)
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой