Имя: Пароль:
1C
 
Зачем нужна процедура?
0 Zaid
 
07.05.10
11:47
Собственно сабж :)
1 VasiL-V
 
07.05.10
11:51
Процедура чего Вас интересует? :)
2 zelenii
 
07.05.10
11:52
Наверное он про процедуру в языке 1с спрашивает.
3 Ненавижу 1С
 
гуру
07.05.10
11:52
(0) в смысле можно всегда функциями обойтись? ответ: в принципе, да
4 Hazer79
 
07.05.10
11:53
(0) Чтобы была
5 VasiL-V
 
07.05.10
11:53
(3) а всегда процедурами обойтись нельзя? :)
6 Zaid
 
07.05.10
11:55
(3) В том-то и дело, функция может все, что может процедура и даже чуть больше: возвращает значение, может прерваться в любом месте. И собственно вопрос, для чего вообще писать в коде слов "процедура"? Зачем придумали этот обрезанный по функционалу оператор?
7 Hazer79
 
07.05.10
11:55
(5) Возвращать значения через опу тогда ?
8 Zaid
 
07.05.10
11:56
(5) это извращение
9 VasiL-V
 
07.05.10
11:58
(7) Через переменные, ну в общем-то можно это назвать и через опу ))
10 Jstunner
 
07.05.10
11:58
везде есть процедуры. Например в Си они называются функциями не возвращающими значение :)
11 Zaid
 
07.05.10
12:00
(10) в Си есть только функции. Они могут ничего не возвращать. В 1сv8 кстати тоже. Так что в Си глупой непонятной процедуры нет. А в 1с она зачем-то есть. Портит внешний вид модуля, вносит хаос и неразбериху :))
12 dk
 
07.05.10
12:01
еще один Сишник прирерся ))
13 Jstunner
 
07.05.10
12:02
(11) в Си есть только скобочки, там нет не функций не процедур ))
14 Jolly Roger
 
07.05.10
12:02
(11) а о том, что функция ничего не возвращает, ты пишешь в комментариях?
15 Лефмихалыч
 
07.05.10
12:02
(14) нет, указывает тип возвращаемого значения void
16 Jstunner
 
07.05.10
12:03
(15) что читается, как "функция не возвращающая значение", кратко - процедура )
17 Jolly Roger
 
07.05.10
12:04
(15) похоже на то...
18 Jstunner
 
07.05.10
12:06
Наличие/отсутствие ключевого слова "Процедура" вопрос вкуса и привычки, не более..
В том или ином виде, процедуры существуют почти во всех языках.
19 Zaid
 
07.05.10
12:08
(14) можно и так. А вообще не обязательно. Если ты используешь функцию (или процедуру), то предполагается, что ты знаешь, что она делает. При этом не важно, возвращает функция что-то или нет - ты можешь использовать ее как процедуру, не присваивая возвращаемое значение. Т.е. писать так:
//так правильно
МояФункция(параметр1);

//А можно так
Результат = МояФункция(параметр1);
20 PowerBoy
 
07.05.10
12:09
Умом 1с не понять - вот Select Case нет, а процедура есть.
:)
21 Jstunner
 
07.05.10
12:12
Еще как важно, что функция возвращает. Например такой код не взлетит. Так как void f() - самая что настоящая процедура, а не функция :)

void f();
smth = f();
22 Zaid
 
07.05.10
12:13
(21) я про функцию в 1с
23 Jstunner
 
07.05.10
12:16
(22) налицо четкое разделение, и ключевое слово тебе как бы намекает, стоит ждать результат от метода или нет.
24 kokamoonga
 
07.05.10
12:16
(0) а если тебе нужно например заполнить таб. поле в форме? функцией? а что возвращать будешь и куда? и главное зачем?
25 Wingless
 
07.05.10
12:18
(6) а по каким причинам процедура не "может прерваться в любом месте"?
26 Mitriy
 
07.05.10
12:22
(25) по регилиозным...
27 Mitriy
 
07.05.10
12:22
(26)* религиозным...
28 vetra
 
07.05.10
12:23
(24) можно вернуть результат выполнения
29 kokamoonga
 
07.05.10
12:24
(28)  а нафига козе баян?
30 Zaid
 
07.05.10
12:24
+(28) а можно и не вернуть :)

(25) затупил, прошу прощения.
31 Lama12
 
07.05.10
12:24
Могу предположить, что процедура придумана для упрощения работы компилятора.
Т.е. на функцию нужно выделять память для результата (а он у нас практически всегда типа Variant), а на процедуру не нужно ничего выделять для результата. В результате экономится время компиляции и время выполнения (выделение памяти для результата).
32 Jstunner
 
07.05.10
12:24
(28) справилсо/нет? Для таких целей гораздо удобней использовать исключения.
33 kokamoonga
 
07.05.10
12:25
(32) воистину
34 Zaid
 
07.05.10
12:26
(24) все можно сделать функцией. Возвращать результат при этом не обязательно. Т.е. слово "возврат" в функции можно и не писать.

(31) я тоже склоняюсь к этому, но хотелось бы знать точно.
35 kokamoonga
 
07.05.10
12:28
(34) ну так тебе в (18) уже дан ответ зачем называть по-разному. а в (31) вероятная причина разделения
36 Zaid
 
07.05.10
12:29
37 kokamoonga
 
07.05.10
12:29
то что ты не пишешь Возврат не означает что компилятор ничего от функции не ожидает
38 Jstunner
 
07.05.10
12:29
В первом случае, не понятно, вернет ли функция преобразованную таблицу, или переделает переданную. Во втором - все ясно, не залезая в код, или коменты

Функция Преобразовать(Таблица)
//
КонецФункции


Процедура Преобразовать(Таблица)
//
КонецПроцедуры
39 Megas
 
07.05.10
12:30
(0) Логическое разделение...
Удобно!
Видиш слово Функция и понимаеш что она что то возвращает!
Видиш процедура и знаеш что она отработает и всё!
40 Zaid
 
07.05.10
12:33
(38) Если тебе нужно использовать "преобразовать()" без присваивания результата - используй без:
Функция Преобразовать(Таблица)
//
Возврат Истина;
КонецФункции;

//Обработчик...
Преобразовать(Таблица);
//...
41 kokamoonga
 
07.05.10
12:34
(40) спор ни о чем. ты сам-то потом код прочитаешь который на одних функциях налабал?
42 la luna llena
 
07.05.10
12:34
По теории функция должна только возвращать значение, не меняя среды, а процедура не должна возвращать значения.
43 Zaid
 
07.05.10
12:34
(37) а он ожидает?
44 kokamoonga
 
07.05.10
12:35
(43) а ты можешь однозначно утверждать что нет?
45 Jstunner
 
07.05.10
12:35
(40) в (38) ключевая фраза - "не залезая в код"
46 Zaid
 
07.05.10
12:36
(44) не могу. Поэтому и спрашиваю. Хочу знать точно. То, о чем пишешь ты - предположение. Я в (34) писал, что тоже склоняюсь к этому выводу.
47 kokamoonga
 
07.05.10
12:37
(46) а на (41) не желаешь ответ дать?))
48 Jstunner
 
07.05.10
12:37
(36) ты фанатик скорости и минимализма, в ущерб читаемости и простоты?
49 zak555
 
07.05.10
12:39
(0) используй их только в предопределённых
50 Zaid
 
07.05.10
12:39
(45) когда ты используешь функцию, ты знаешь что она должна делать. Вопрос возвращает она что-то или нет - не существеннен, т.к. если тебе результат не нужен, ты можешь его не использовать.

(47) сорри, пропустил этот пост. Да, легко. Разницы никакой - я об этом и пишу. В том числе и в этом самом посте, отвечая на 45.

(48) читай внимательнее вики: "Также в сложных программах возникают большие «нагромождения» операторов try ... finally и try ... catch (try ... except)."
51 Zaid
 
07.05.10
12:40
(49) что значит "только в предопределенных"?
52 Сисой
 
07.05.10
12:40
(0) не барань.
Процедура исторически родилась как инкапсуляция повторяемого кода программы.
Например, вызовом процедуры можно считать команду GOSUB в классическом Бейсике.
Процедуры в том или ином виде есть во всех языках 4GL, созданных до появления ООП. Иногда это вырожденная функция, как в Си (void mysub(int *a)).
Более того, есть языки, где функций нет, а процедуры есть.
В реалиях 90-х стало модно оперировать термином "метод" и процедуры стали методами объекта. Но поскольку 1С не поддерживает ООП, то и "методы" его описываются на уровне конструкций классического Паскаля - PROCEDURE и FUNCTION.
53 Zaid
 
07.05.10
12:43
(52) ответ вида "дань традиции" и "у всех есть и у меня будет". Если это рудимент, почему от него не откажутся?
54 zak555
 
07.05.10
12:44
(51) есть же предопределённые процедуры в 1с - в итоге свои - используй, как функции !
55 Ненавижу 1С
 
гуру
07.05.10
12:44
вот пример:

Функция Пример()
   
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
   Сообщить(ТипЗнч(Пример()));
КонецПроцедуры
56 Живой Ископаемый
 
07.05.10
12:44
Опять на 1Сников напал зуд пофиксить мироздание.
57 Ненавижу 1С
 
гуру
07.05.10
12:45
в паскале они есть, в C-подобных тоже есть, считая, что если написано void Test() то это процедура
58 Zaid
 
07.05.10
12:46
(55) пример чего? не понял. На любое событие ты можешь назначить как процедуру, так и функцию:
Функция Пример()
   
КонецФункции

Функция КнопкаВыполнитьНажатие(Кнопка)
   Сообщить(ТипЗнч(Пример()));
КонецФункции

//Также как и
Функция ПриЗаписи()
//
КонецФункции
59 Jstunner
 
07.05.10
12:46
(53) так откажись, какие проблемы. Лишишь себя интуитивно понятной информации при повторном использовании кода.
60 Zaid
 
07.05.10
12:47
(59) смущает (31)
61 Сисой
 
07.05.10
12:47
(53) А зачем вот сейчас отказываться? Мне не мешает, коллег по работе спросил - не чешется. Может, мазь тебе какую купить, их много в аптеках бывает.
Блин, в платформе 8 дофига элементов кривизны, а он на процедуры напал...
Которые как раз никаким боком ни на скорость, ни на надежность, ни на читабельность не влияют.
62 Jstunner
 
07.05.10
12:48
(60) я и говорю, ты - ранний оптимизатор. У тебя есть средне-крупные законченные проекты?
63 Поручик
 
07.05.10
12:49
ЛЮДИИИИИИ!!!
Я всё понял,    Zaid === Г.... 1С, только он у него такие тупоглубокомысленные темы.
64 Jstunner
 
07.05.10
12:50
(62)+ если уж так тебя смущает, напиши простенький тест, да замерь
65 Ненавижу 1С
 
гуру
07.05.10
12:51
гораздо круче обсудить возвращаемые параметры по-умолчанию, и передаваемые в них константы, например

Процедура Тест(А=Неопределено)
 А=5; //как бы возвращается
КонецПроцедуры

Б=0;
Тест(Б);
Тест(7);
Тест();

в нормальных языках возвращаемые параметры описываются отдельно(var, ref, &), а не по-умолчанию, в 1С все наоборот (Знач)
66 Ненавижу 1С
 
гуру
07.05.10
12:52
тему про NULL, Неопределено и пустые ссылки стоит поднимать? ))
67 anddro
 
07.05.10
13:02
такое ощущение, что недавно эта тема уже обсуждалась.
у процедуры есть одна хорошая особенность: ее невозможно вызвать через табло.
68 Ненавижу 1С
 
гуру
07.05.10
13:03
(67) что в этом хорошего?
69 Zaid
 
07.05.10
13:03
(64)
ТестПроцедуры(кк);    1 000 000    45,511313    48,57
ТестФункции(кк);    1 000 000    45,440559    48,49

Тест ничего не показывает...
Однако ответ для себя я нашел ) Вероятно процедуру оставили как раз потому, что некоторым ее использование все-таки удобно.
70 anddro
 
07.05.10
13:06
(68) то, что даже зная исходный код программы, пользователь не сможет выполнить определённые действия в обход основной логики.
71 Ненавижу 1С
 
гуру
07.05.10
13:07
(70) суровые челябинские пользователи?
72 anddro
 
07.05.10
13:10
(71) именно, в данном случае пользователем может считаться и администратор в удаленном филиале, который должен иметь ограниченные полномочия в базе, но ему это очень не нравится.
73 hhhh
 
07.05.10
13:22
(69) нет, ты точно Г...1С
74 Abracadabra
 
07.05.10
13:35
А Вы еще не наткнулись на ошибку "Обращение к процедуре как к функции" или "Обращение к функции как к процедуре"? Неужели так тяжело догадаться, что предназначение процедуры - выполнение действий, а предназначение функции - получение значения?
75 Zixxx
 
07.05.10
13:37
(0) Процедура тоже возвращает значение

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   А = 0;
   НашаПроцедура(А);
   Сообщить(А);
   
КонецПроцедуры

Процедура НашаПроцедура(А)
   
   А = 1;
   
КонецПроцедуры
76 GedKo
 
07.05.10
13:40
(75) это не возврат значение, а изменение параметров среды выполнения.
77 fisher
 
07.05.10
13:42
(0) Затем же, зачем разделение на отчеты и обработки.
Для наглядности.
Разделение на функции и процедуры присутствует в большинстве высокоуровневых языков. 1С тут не оригинально.
78 Ненавижу 1С
 
гуру
07.05.10
13:43
(74) "Обращение к функции как к процедуре" не бывает, о том и речь
79 Abracadabra
 
07.05.10
13:48
(78) если функция возвращает значение, а это значение никуда не помещается, то будет выдано такое сообщение...
80 Ненавижу 1С
 
гуру
07.05.10
13:51
(79) ты бы попробовал прежде чем писать эту ерунду
кстати, большинство ЯП позволяют это делать