Имя: Пароль:
1C
 
Как выбрать что использовать: процедуру или функцию?
🠗 (Волшебник 18.03.2025 11:24)
0 program345
 
18.03.25
11:13
Как я понимаю разница между функцией и процедурой в том, что функция возращает значение, а процедура нет.
Как вы выбираете что использовать? Где кода будет мешьше, то и берем?


фукция:
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
	
	Элементы.Товары.ТекущиеДанные.Скидка = ПолучитьСкидкуНоменклатуры(Элементы.Товары.ТекущиеДанные.Номенклатура);			
	
КонецПроцедуры 

&НаСервере
Функция ПолучитьСкидкуНоменклатуры(Номенклатура)

	Возврат Номенклатура.ОсновнаяСкидка;		

КонецФункции 



проц:
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
	
	Номенклатура = Элементы.Товары.ТекущиеДанные.Номенклатура; 
	ПолучитьСкидкуНоменклатуры(Номенклатура);
	Элементы.Товары.ТекущиеДанные.Скидка = Номенклатура;
	
КонецПроцедуры 

&НаСервере
Процедура ПолучитьСкидкуНоменклатуры(Номенклатура)

	Номенклатура = Номенклатура.ОсновнаяСкидка; 

КонецПроцедуры 
1 Мультук
 
гуру
18.03.25
11:18
(0)

1)

За второй вариант, когда номенклатура была "номенклатура",
а стала "Число" я бы {здесь очень нехорошее слово}

2) Выучите уже разницу между

&НаСервере
и

&НаСервереБезКонтекста
2 Мультук
 
гуру
18.03.25
11:24
(0)


P.S.
Пару вопросов (можете не отвечать, но мне любопытно):

1) Сколько вам годиков ?
2) На каком языке вы учились программировать и в каком году ?


P.S.
Чтобы было честно

Мне 50 лет
Начал в 1983 -- с Basic (для БК-0010)
Потом было много чего Си, pascal, Delphi
Писал на asm для AVR-Atmega
И всякое "по мелочи"
3 Волшебник
 
18.03.25
11:24
О, на форуме завёлся новый тролль
4 Волшебник
 
18.03.25
11:52
(2) О, давайте померяемся!

Мне 44 года. Программировать начал в 1989 году.
БК-0010, Spectrum (Basic),
потом ассемблер, С, С++, Pascal, Delphi,
1С v7 с 1997 года,
1С v8 с 2002 года,
PHP с 2003 года, JavaScript + jQuery
5 H A D G E H O G s
 
18.03.25
11:58
Любая процедура сложнее 3-х строк должна быть функцией, возвращающей объект Структуры с полями

СтруктураРезультата=Новый Структура("Результат,ОписаниеОшибки,КодОшибки,Данные",Истина,"",0,Неопределено);
6 H A D G E H O G s
 
18.03.25
12:00
КодОшибки - опционален, для внешних обработок сложных ситуаций (так как нет своих объектов к ВызватьИсключение, а ориентироваться на строку - ну такое, да и вызывание исключений должно быть только на этапе внедрения при отладке сложных случаев, а не в промэксплуатации), либо для проброса кодов ошибок ОС.
7 Климов Сергей
 
18.03.25
12:12
В юности читал книжку про язык С. Страуструпа, кажется. Запомнились оттуда два пассажа:
1. Нет никаких разумных причин не инициализировать переменные;
2. Нет никаких разумных причин, чтобы ваша процедура не возвращала результат своей работы.
Не цитата, но смысл такой.
8 Галахад
 
гуру
18.03.25
12:12
Хм. В второй код не должен очистить "Номенклатуру" в строке?
9 Kigo_Kigo
 
18.03.25
12:29
Второй вариант не лицеприятен, нужно передать и номенклатуру и ожидаемую переменную скидка, не мешать мух с котлетами, на выходе из процедуры придется обращаться к номенклатуре через всю портянку, Номенклатура = Элементы.Товары.ТекущиеДанные.Номенклатура, а это как говорится - насрать в код, код становится не читаем, по этому предпочтительней первый
10 Kigo_Kigo
 
18.03.25
12:28
(8) Там же не строка передается, а ссылка справочника номенклатура
11 Fedor-1971
 
18.03.25
12:38
(4) Ну, раз уже взялись меряться
Мне 53 года, начало программирования 1987
ЕС 1022, 1032 (PL/1L)
PDP-11 (Basic)
Изот, Нейрон, ДВК-1 (Basic, Pascal)
ЕС 1841 (дальше IBM 286 и по порядку) - Basic, C, C++
1С v 6, 7.5, 7.7, 8.х с 1997 и по мере выхода
WSH скрипты и прочее системное (bat,cmd)
12 Irbis
 
18.03.25
12:43
(4), (11) Вы ещё про микрокалькуляторы программируемые детям расскажите.
13 Fedor-1971
 
18.03.25
12:52
(12) очень удобная штука МК-61
лабы делать и так, по мелочи, замечтательно (ностальгия, блин)
14 Волшебник
 
18.03.25
12:56
(12) У меня был МК-61, а на нём написал "Морской бой"
15 Irbis
 
18.03.25
13:17
Мне достался МК-52, я на него что-то из программок для Б3-34 и МК-54 адаптировал, не все команды совпадали. Ну, а про тривиальные численные методы (решение уравнений, интегрирование) и писать стыдно, целая книжка на полке стояла, ЕМНИП Чернов автором был. но там тоже было всё для МК61.
Потом уже в школу привезли два компьтера Башкирия-2м, там был бейсик и калькулятор стал не актуален. В то время на заводе в штабе были Роботроны-1715, тоже с бейсиком но уже с 5.25" дисководом и дальше всё понеслось с какой-то дикой скоростью
16 Волшебник
 
18.03.25
13:26
Расскажите, когда лучше использовать функции, а когда лямбда-выражения?
17 Eiffil123
 
18.03.25
13:30
Почему в языках программирования так принято, что функция возвращает только один результат?
Пора уже отходить от этих традиций.
18 skafandr
 
18.03.25
13:34
(4) Эх молодо-зелено
Мне 64 года, начало программирования 1977
Минск-22,32 (машинный код, ассемблер, Фортран)
ЕС 1022, 1032 (ассемблер,PL/1L)
ZX Spectrum (Basic) ;-)
ДВК-1 (Basic)
Эльбрус 2 (Эль-76)
286 и далее ) - Basic, C
1С v7.7, 8.х с 2004
19 novichok79
 
18.03.25
13:36
мне 37.
начал программировать где-то в 9 лет.
переписывал на спектрумовский бейсик программы, которые брат приносил со школы, где они на каком-то БК программировали.
потом Pascal, Delphi, 1С.
далее Java, Golang.
а, ну sh скрипты и все такое прочее не считаю даже.
powershell - это вообще отрыжка какого-то злого гения.
20 novichok79
 
18.03.25
13:37
(0) по теме.
лучше явное чем неявное - так что функция выглядит лучше, она не обновляет скрытно внутри себя значение.
процедура - это если что-то сложное, куда придется занырнуть. да и то, под вопросом.
21 Волшебник
 
18.03.25
13:38
(17) в Python можно вернуть кортеж, например

def f():
    return (1, 2)

(a, b) = f()
print (a,b)
22 Irbis
 
18.03.25
13:40
(17) Тут главнее что процедура не повинна вообще что-то возвращать, а функция такого права лишена. Хоть херню, но вернуть взад что-то надо.
23 Волшебник
 
18.03.25
13:43
(22) В языке С/С++ вообще нет процедур, только функции, которые могут возвращать void (пустота)
24 Garykom
 
гуру
18.03.25
13:52
Осторожней с разделением на Процедуры/Функции
А то так доберетесь что искусственное разделение на Структура/Соответствие/Массив/СписокЗначений/ТаблицаЗначений не обязательны...
Можно всего одним универсальным объектом обойтись, реализующим весь функционал перечисленных
25 Garykom
 
гуру
18.03.25
13:58
(24)+ Начать можно с того что СписокЗначений это фактически урезанная ТаблицаЗначений с фиксированными колонками

А уж разделение на Структура и Соответствие - ну нахрена???
Чем так важно обращение через точку: Структура.ИмяСвойства
Что нельзя было обойтись квадратными скобками: Структура["Имя Свойства"] ?
Или если уж очень хотите через точку то: Структура."Имя Свойства"
26 vbus
 
18.03.25
14:01
(22) А если так?
&НаКлиенте
Процедура МояПроцедура()
	Перем   Выход1,Выход2, Выход3; 
	
	МояПроцедураНаСервере(Выход1,Выход2, Выход3);
	Сообщить(""+Выход1+Выход2+ Выход3);
			
КонецПроцедуры 

&НаСервере
Процедура МояПроцедураНаСервере(Выход1,Выход2, Выход3)  
	
	Выход1 = 10;  
	Выход2 = 10;
	Выход3 = 10;

КонецПроцедуры    
27 Irbis
 
18.03.25
14:07
(26) Да хоть как
28 H A D G E H O G s
 
18.03.25
14:19
(26) Для авторов возврата результата через параметры - уже разогревают котел.
29 Fedor-1971
 
18.03.25
14:24
(28) Давно варят (или что там) - в С параметры передаются ссылкой и можно было уконтропупить данные тупо,
присвоив новое значение параметру
30 Eiffil123
 
18.03.25
14:41
(21) вот вот. вполне удобный синтаксис:
(а, б, в) = ф();

а то в 1С всё в параметры напихают, а потом гадай, процедура их поменяла или нет
31 H A D G E H O G s
 
18.03.25
14:27
(29) Для защиты от таких ребят использую ЗНАЧ, ну кроме опасных объектов типа больших Массивов(Таблиц,списков), если только это не серверный вызов.
32 vbus
 
18.03.25
14:59
(16)
Рекомендация в PEP-8  Всегда используйте оператор def вместо оператора присваивания, который привязывает лямбда-выражение непосредственно к имени.
Законный случай использования лямбды - это когда вы хотите использовать функцию без присвоения ей имени.
https://peps.python.org/pep-0008/#public-and-internal-interfaces
33 Волшебник
 
18.03.25
15:13
(32) 👍
34 Волшебник
 
18.03.25
15:14
Что лучше: цикл или рекурсия?
35 Волшебник
 
18.03.25
15:14
Почему константа в 1С называется константой, хотя её значение может быть изменено?
36 Волшебник
 
18.03.25
15:23
Зачем в языке нужен унарный плюс, если он ничего не делает?
37 Волшебник
 
18.03.25
15:30
Почему следующий рабочий запрос не открывается конструктором?
Выбрать (&Док).Номер
38 Garykom
 
гуру
18.03.25
16:08
(37) Запрос не всегда рабочий ибо зависит от типа параметра &Док
Правильно все же соединить с нужными документами
39 Eiffil123
 
19.03.25
09:41
(22)

Приведенный код показывает, что отличий между процедурами и функциями практически нет. Два разных ключевых слова - просто синтаксический сахар (впрочем, не упрощающий жизнь никому).
40 Eiffil123
 
19.03.25
09:44
(31) это практически ни от чего не защищает, кроме примитивных типов. Ну и для того, чтобы написать Знач, вам надо быть разработчиком вызываемого метода. А в этом случае вы и так знаете, меняет ли он значение переменной или нет