|   |   | 
| 
 | Как выбрать что использовать: процедуру или функцию? 🠗 (Волшебник 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) это практически ни от чего не защищает, кроме примитивных типов. Ну и для того, чтобы написать Знач, вам надо быть разработчиком вызываемого метода. А в этом случае вы и так знаете, меняет ли он значение переменной или нет     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |