gifts2017

[1С:Предприятие 7.7] Занимательная передача параметров

Опубликовал Александр Венгер (venger) в раздел Программирование - Практика программирования

"Казнить нельзя, помиловать.
Казнить, нельзя помиловать."

(c) Детская сказка

Платформа 1С:Предприятие 7.7 (7.70.023)

Предположим, я написал процедуру:
//---------------------------------------------------------------
Процедура ПередачаПараметров1(Пар1, Пар2=2, Пар3=3) Экспорт
   Сообщить("Пар1="+?(ПустоеЗначение(Пар1)=1,"""Пустой""",Пар1));
   Сообщить("Пар2="+?(ПустоеЗначение(Пар2)=1,"""Пустой""",Пар2));
   Сообщить("Пар3="+?(ПустоеЗначение(Пар3)=1,"""Пустой""",Пар3));
КонецПроцедуры
//---------------------------------------------------------------

И теперь, предположим, хочу ее вызвать, причем опустив первый параметр, т.е. примерно так:
//---------------------------------------------------------------
ПередачаПараметров1( , );
//---------------------------------------------------------------

По идее, я должен получить в строке состояния:
-----------------------------------------------------------------
Пар1="Пустой"
Пар2=2
Пар3=3
-----------------------------------------------------------------

Но, совершенно удивленно получаю следующий результат:
-----------------------------------------------------------------
Пар1="Пустой"
Пар2="Пустой"
Пар3=3
-----------------------------------------------------------------

Хотя, так как для второго параметра задано значение по умолчанию в списке формальных параметров в определении процедуры, то я вообще то, думаю, что совершенно справедливо, ожидал, что у него будет это значение (т.е. =2), но он оказался пустым.

Да, я понимаю, что можно вызвать следующим образом и получить нужный результат:
//---------------------------------------------------------------
ПередачаПараметров1(ПолучитьПустоеЗначение());
//---------------------------------------------------------------

Но, все-таки, давайте заглянем в Help, читаем, четко и ясно в Help'е сказано:
-----------------------------------------------------------------
«Если параметр при вызове процедуры опущен, то он принимает либо установленное по умолчанию значение (если оно есть) либо принимает «пустое» значение (значение неопределенного типа).»
-----------------------------------------------------------------

Ну, хорошо, есть там такие слова:
-----------------------------------------------------------------
«Если параметру задано значение по умолчанию и он является последним в списке, то при вызове процедуры его можно опускать в списке передаваемых фактических параметров и не ставить запятую перед опущенным параметром.»
-----------------------------------------------------------------

Ну, знаете, слово «можно» это еще не означает обязательно. Да и второй параметр в нашем случае не последний, есть еще третий.

Т.е. получается, что при передаче фактических параметров при вызове процедуры, если после последней запятой, фактический параметр опущен, то соответствующему формальному параметру, в любом случае будет присвоено пустое значение, а не значение по умолчанию, которое ему задано.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. zyto (zyto) 07.10.08 06:06
ИМХО опустить параметр = вообще не упоминать об его существовании при вызове процедуры, т.е. ПередачаПараметров1(1) - в данном случае будет Пар1 = 1, Пар2 = 2 и т.д.
А то что ты делаешь - ПередачаПараметров1( , ) -ты передаёшь пустое значение (в 8ке там было бы Неопределено)...
2. ssp_ (ssp_) 07.10.08 08:39
Весело. Щас попробовал ПередачаПараметров1(,,). Получил:
Пар1="Пустой"
Пар2=2
Пар3="Пустой"

Чудеса...
3. Михаил Семенов (Shaman100M) 07.10.08 09:12
Да, есть такое, именно с последним опущенным параметром. Наткнулся на эту фичу в глубокой отладке...
4. Аркадий Кучер (Abadonna) 07.10.08 09:26
(3)>опущенным параметром
Опущенный параметр - жесть :)))))
motogon; vasilykushnir; +2 Ответить 4
5. VasilyKushnir (vasilykushnir) 07.10.08 09:31
(4) да еще в сочетании с глубокой отладкой... Молодец, Шаман, - поднял (в смысле улучшил :-) ) настроение.
6. Михаил Семенов (Shaman100M) 07.10.08 09:37
)))))) Еще раз перечитал свой пост.... долго думал.... ))) Ну, тогда "фича" и "наткнулся" тож рулят. ))))
7. Альтаир (Altair777) 07.10.08 14:25
На 7.70.27 (SQL) релизе тоже самое.
Похоже, все-таки, дело в запятой перед параметром
Если запятая есть, то параметр передан.
А т.к. его фактически нет :-), то передается ПустоеЗначение. (сравните 4 и 5)
Но тогда не понятно, почему во втором и третьем запуске написало "2"?

------------------------------
1) ПередачаПараметров1(,)
Пар1="Пустой"
Пар2="Пустой"
Пар3=3
------------------------------
2) ПередачаПараметров1(,,)
Пар1="Пустой"
Пар2=2
Пар3="Пустой"
------------------------------
3) ПередачаПараметров1(1,,)
Пар1=1
Пар2=2
Пар3="Пустой"
------------------------------
4) ПередачаПараметров1(1,2,)
Пар1=1
Пар2=2
Пар3="Пустой"
------------------------------
5) ПередачаПараметров1(1,2)
Пар1=1
Пар2=2
Пар3=3
------------------------------
8. Venger (venger) 07.10.08 14:42
(7) Даже если передается пустое значение, то в любом случае, если задано значение по умолчанию для формального параметра, формальный параметр должен инициализироваться значением по умолчанию. А этого не происходит, но только в одном случае (что радует), если пропущен фактический параметр после последней запятой при вызове функции, в остальных случаях, все работает, так как должно быть, т.е. если задано значение по умолчанию, то при пропущенно фактическом параметре, формальный параметр инициализируется значением по умолчанию. Т.е. налицо явно баг, хотя если красиво описать, то будет фича:-)))
9. Аркадий Кучер (Abadonna) 07.10.08 16:03
(8)>Даже если передается пустое значение
Не передается НИКАКОЕ значение, не передается параметр ВООБЩЕ - а это, как говорят в Одессе, две большие разницы. Не баг и не фича, а стандартная вещь
lomok; JohnyDeath; vasilykushnir; +3 Ответить 2
10. VasilyKushnir (vasilykushnir) 07.10.08 16:16
(8) А ведь стопудово прав. Все больше убеждаюсь, что для того, чтобы называть себя программистом, надо пройти курс молодого бойца на ассемблере... И все больше склоняюсь к мысли: чистый 1с-ник - не программист (в том смысле, что за плечами нет других языков программирования).
11. VasilyKushnir (vasilykushnir) 07.10.08 16:20
Сорри, пост (10) относится к (9). И еще. Есть золотое правило: прежде чем кричать о глюках, лучше сначала выключить устройство krivie_ruchki.sys...
12. Артур Аюханов (artbear) 07.10.08 16:36
Для справки - подобные баги при работе с параметрами по умолчанию были обнаружены еще пару лет назад при работе над ВК 1С++ :)
У меня даже тесты соответствующие с тех пор остались.
.
ЗЫ это мы разбирались, как правильно передавать параметры по умолчанию в классы 1С++.
13. Артур Аюханов (artbear) 07.10.08 16:39
Например, есть функция в глобальнике
Код
Функция глШтатныеПараметрыПоУмолчанию_Сложение(А = 2, Б = 3) Экспорт
   Возврат А + Б;
КонецФункции
Показать полностью

и тест
Код
Процедура Тест_ГлобальнаяФункция_ШтатныеПараметрыПоУмолчанию() Экспорт
   Сам=Сам();

   Значение = глШтатныеПараметрыПоУмолчанию_Сложение(4);
   Сам.ПроверитьРавенство(Значение, 7);

   Значение = глШтатныеПараметрыПоУмолчанию_Сложение(,4);
   Сам.ПроверитьРавенство(Значение, 6);

   Значение = глШтатныеПараметрыПоУмолчанию_Сложение(4,);
   
   Сам.ПропуститьТест(0, "Штатные параметры по умолчанию неверно работают !!"+РазделительСтрок+
      "       Например, глоб. функция глШтатныеПараметрыПоУмолчанию_Сложение(4,) должна вернуть 7, "+РазделительСтрок+
      "       но 1С возвращает 4 :("+РазделительСтрок);
   
   Сам.ПроверитьРавенство(Значение, 7); // БАГ 1С - система возвращает 4
КонецПроцедуры
Показать полностью

14. Артур Аюханов (artbear) 07.10.08 16:40
(12+) Даже где-то на форуме 1cpp.ru есть соответствующая ветка.
15. VasilyKushnir (vasilykushnir) 07.10.08 16:40
(12) Нет худа без добра - подумал зять, кидая камнем в собаку и попадая в тещу... :-)
16. Артур Аюханов (artbear) 07.10.08 16:41
А для 3 и более параметров, как у автора, вообще полные чудеса творятся :)
17. Артур Аюханов (artbear) 07.10.08 16:46
(12+) Соответственно, работа с методами по умолчанию в классах 1С++ лишена этого недочета 1С - в 1С++ все просто и прозрачно, как в других языках :) Но только в том случае, если обращаться к объекту класса через контекст - типа ОБъект.Метод()
В ином случае, если, например, внутри класса вызвать просто Метод(), 1С "сильнее" и работает именно ее синтаксис и ее баги :)
18. Venger (venger) 07.10.08 16:55
(9) Abadonna, а про инициализацию формального параметра значением по умолчанию (которое прописано при определении функции), при отсутсвии фактического, что ты можешь сказать, млин? Где тут норма?

В варианте таком, тоже во второй параметр передается ПУСТОЕ значение:
ПередачаПараметров1(1,,);

Но на выходе получим, т.е. Пар2=2, а не "Пустой":
Пар1=1
Пар2=2
Пар3=\"Пустой\"
19. Аркадий Кучер (Abadonna) 07.10.08 17:05
>фактического, что ты можешь сказать, млин?
А вот, млин, и говорю: первый та передал как 1, второй (раз он между запятыми) - ПустоеЗначение (вот и присвоилось значение =2), третий ты ваще не передал (т.е. не передавал ты туда пустое значение на основании которого он должен был стать=3)
20. Артур Аюханов (artbear) 07.10.08 17:12
(19) Ты не прав - явный же изврат получился :)
21. Альтаир (Altair777) 07.10.08 17:15
Пока реализовывал мысль из (8)
> Т.е. налицо явно баг, хотя если красиво описать, то будет фича:-)))
вы уже много чего написать успели :-D
===================================

Ага :-)
Например....

Код
Функция КолвоЗапятыхВПараметрах(Пар1="это оно!", Пар2="это оно!", Пар3="это оно!") Экспорт      
   Если ПустоеЗначение(Пар3)=1 Тогда   
      Возврат 2;
   ИначеЕсли ПустоеЗначение(Пар2)=1 Тогда   
      Возврат 1;
   ИначеЕсли Пар3<>"это оно!" Тогда   
      Возврат 2;
   ИначеЕсли Пар2<>"это оно!" Тогда   
      Возврат 1;
   Иначе   
      Возврат 0;
   КонецЕсли;   
КонецФункции      
//--------------------------      
Процедура Сформировать()      
   Сообщить(КолвоЗапятыхВПараметрах());   
   Сообщить(КолвоЗапятыхВПараметрах(1));
   Сообщить(КолвоЗапятыхВПараметрах(1,));
   Сообщить(КолвоЗапятыхВПараметрах(1,2));
   Сообщить(КолвоЗапятыхВПараметрах(1,2,));
   Сообщить(КолвоЗапятыхВПараметрах(,,3));
КонецПроцедуры   
Показать полностью


Результаты
0
0
1
1
2
2

-------------------------
Кажется, работает правильно :-)
22. Артур Аюханов (artbear) 07.10.08 17:26
Какие-то у вас примеры некачественные :(
Выкладываю свои юнит-тесты.
Проще всего решать проблему на числах, при сложении, например, пустое значение преобразуется к нулю и видны все баги.
Тесты для 2-х параметров я приводил в (13)
Тесты для 3-х параметров:
.
В глобальнике есть функция
Код
Функция глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(А = 2, Б = 3, Ц = 5) Экспорт
   Возврат А + Б + Ц;
КонецФункции
Показать полностью

.
Вот юнит-тест
Код
Процедура Тест_ГлобальнаяФункция_ШтатныеПараметрыПоУмолчанию_3Параметра() Экспорт
   Сам=Сам();

   Сам.ПропуститьТест(0, "Штатные параметры по умолчанию неверно работают !!"+РазделительСтрок+
      "       Например, глоб. функция глШтатныеПараметрыПоУмолчанию_Сложение(4,) должна вернуть 7, "+РазделительСтрок+
      "       но 1С возвращает 4 :("+РазделительСтрок);

   Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4);
   Сам.ПроверитьРавенство(Значение, 12);

   Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(,4);
   Сам.ПроверитьРавенство(Значение, 11);

   Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
   Сам.ПроверитьРавенство(Значение, 12);

   Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1);
   Сам.ПроверитьРавенство(Значение, 10);

   Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1, );
   Сам.ПроверитьРавенство(Значение, 10);

   Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1);
   Сам.ПроверитьРавенство(Значение, 8);

   Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1, );
   Сам.ПроверитьРавенство(Значение, 8);
КонецПроцедуры
Показать полностью

.
Проверьте результаты и порадуйтесь/погорюйте за 1С :)
23. Артур Аюханов (artbear) 07.10.08 17:30
(22+) Результаты выполнения кода
Код
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4);
Сообщить("Значение = <"+Значение+">");
   
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(,4);
Сообщить("Значение = <"+Значение+">");
   
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
Сообщить("Значение = <"+Значение+">");
   
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1);
Сообщить("Значение = <"+Значение+">");
   
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1, );
Сообщить("Значение = <"+Значение+">");
   
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1);
Сообщить("Значение = <"+Значение+">");
   
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1, );
Сообщить("Значение = <"+Значение+">");
Показать полностью

равны
Код
Значение = <12> это верно, а дальше фигня
Значение = <11>
Значение = <9>
Значение = <10>
Значение = <5>
Значение = <8>
Значение = <3>
Показать полностью

Разве это верные/ожидаемые результаты ? :)
24. Артур Аюханов (artbear) 07.10.08 17:39
Кстати, не обратил внимания сначала - автор написал абсолютно верно
Т.е. получается, что при передаче фактических параметров при вызове процедуры, если после последней запятой фактический параметр опущен, то соответствующему формальному параметру в любом случае будет присвоено пустое значение, а не значение по умолчанию, которое ему задано
.
Т.е. разработчик 1С не проверил граничное последнее значение и сделал ошибку, а отсутствие соответствующих юнит-тестов не позволило найти эту ошибку, в результате чего ошибка так и живет до сих пор :(
.
Именно эти факты и доказывают наши тесты и примеры :(
25. Евгений Мартыненков (JohnyDeath) 07.10.08 17:44
Артур, вот это:
Код
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(,4);
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1);
Показать полностью

вполне ожидаемые результаты дают (дальше не смотрел).
Единственное о чём надо помнить, ИМХО, так это про последний параметр.
Например вот это:
Код
глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1);
Показать полностью
я читаю как: Первый - по умолчанию (2), во второй - единица (1), последний - по умолчанию (5) = 8
вот это
Код
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1, );
Показать полностью
так: Первый - по умолчанию (2), второй - единица (1), в третий - ПУСТОЕ (0) = 3
26. Евгений Мартыненков (JohnyDeath) 07.10.08 17:45
(24) ну вот, сам же жирным и ответил на все вопросы. Т.е. никакого бага. Всё ожидаемо, КМК.
27. Альтаир (Altair777) 07.10.08 17:50
(26) > Т.е. никакого бага.
Баг есть... у фирмы 1С
28. Евгений Мартыненков (JohnyDeath) 07.10.08 17:53
29. Venger (venger) 07.10.08 17:55
Им (JohnyDeath, Abadonna) просто 1С деньги пошляет, вот они и на защиту встали:-)))
30. Альтаир (Altair777) 07.10.08 17:58
31. Артур Аюханов (artbear) 07.10.08 18:03
(26) Жень, ну сам посуди, где же ожидаемое поведение -
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
9 разве ожидаемо? Т.е. второй пустой, а 3 параметр берется по умолчанию ??
Изврат полный :)
32. Артур Аюханов (artbear) 07.10.08 18:09
Кстати, могу в ВК 1С++ или в ФормЕкс исправить данное корявое поведение 1С :)
Т.е. вместо пустых значений при использовании запятой будут выдаваться значения по умолчанию.
.
Но представляете, сколько давно работающего кода может оказаться неверным :)
motogon; Crush; +2 Ответить 1
33. Альтаир (Altair777) 07.10.08 18:50
(32) Будут баги при использовании исправленного бага? :-)
34. Venger (venger) 07.10.08 19:40
(10) Я, кстати, не 1С'ник, и за плечами у меня не ассемблер, конечно, но есть много чего, правда многое было давно, в студенческие годы…
Но раз мы такие опытные, приведите еще один язык (среду), с подобным поведением в передаче параметров.
35. Venger (venger) 07.10.08 19:49
(10) И много таких примеров Вы наберете? А как в Си, Паскале с этим? И сколько сред отрабатывают действительно ожидаемо?
Соотношение будет в лучшем для Вас случае: как в 1С - 5%, как НЕ в 1С - 95%. И что ожидаемей по вашему?
36. Venger (venger) 07.10.08 19:52
(10) А по-поводу кривых рук, я б сказал, да не буду, деятель великий нашелся...
37. Venger (venger) 07.10.08 19:53
Сорри, пост 36 относится к 11-му посту:-)))
38. Venger (venger) 07.10.08 20:04
(11) Кстати, чтоб убедиться, что я НЕ чистый 1С'ник, как минимум, я вообще НЕ 1С'ник, глянь в мой профайл, найдешь пару примитивных ВК, с исходниками. Т.е. с другими языками, я точно знаком. Я просто, даже программистом назвать себя не могу, а ты вот не стесняешься и программистом себя считаешь, хотя ни одной операционки не создал или СУБД, или на худой случай среды разработки с языком гениальным, покрасивее, чем С++, например...
39. Venger (venger) 07.10.08 20:05
40. Василий Демидов (Душелов) 07.10.08 20:30
41. Venger (venger) 07.10.08 20:38
Пошел, покушал, стал добрее. Кушайте люди, помогает от злости:-))
Я итак на работе не могу заниматься программированием, а когда видишь (я счас не про сайт и не про тех, кто с сайта), что есть куча людей, в том числе и 1С'ников, особенно у франчей. Сидят целыми днями и могут заниматься программированием, а толку, только место занимают. А ты, через силу, после работы или по выходным, усталый и с кучей других проблем, нормально, а даже и получше, тратя гораздо меньше времени и вопреки обстоятельствам успеваешь и изучить, и делать получше, чем они. И с кучей отвлекающих обстоятельств. И ты после этого, так себе, а они супер-пупер прогеры, а зачастую только усидчивостью и берут. ОбЫдно, елы-палы...
42. Василий Демидов (Душелов) 07.10.08 20:46
(41) Учись, студент. И работать, и программить :) И жениться тоже :)
43. Venger (venger) 07.10.08 20:54
(42) Прорвемся, где наша не пропадала:-)
Я правда только в душе студент, а так давно уже нет, закончил, но это дела не меняет:-))
Меня просто жизнь все время как то мешала увязнуть в программировании. Первый раз - это было классе в пятом, подарили мне советский еще комп БК, подключался к телеку, винт - магнитофон с кассетами. Так у меня магнитофона не было, приходилось набирать каждый раз все по новой:-)) И вот, я уже дошел до того, чтобы писать игрухи простенькие, чужих то не было, ни кассет, ни магнитофона. И я, математику то, толком еще не начали нам еще читать, приставал к взрослым, как мне посчитать отскок мяча от стенки:-))) В общем, перегорел он, компьютер. На полгода или год, не было возможности. Потом опять начал, появился комп, потом опять что-то случилось. И вот так все время. Не хочет судьба, чтобы я с компами долго общался:-)))
44. Василий Демидов (Душелов) 07.10.08 20:56
(43) Ну если по воспоминаниям... Я свою первую прогу написал в 11 лет, на спектруме, на бейсике... И понеслась :)
45. Venger (venger) 07.10.08 21:02
Я тоже на бейсике:-))) Правда потом понеслось в другую сторону, спорт, горы, скалолазанье, горными лыжами, потом легкая атлетика, баскетбол, потом старшие классы, это уже не совсем спорт, но впечатления новые, из серии вспомнить есть что, а детям рассказать нечего:-) И все время пытался вернуться к программированию, и все время через какое-то время, что-то выбивало:-)))
46. Евгений Мартыненков (JohnyDeath) 07.10.08 21:32
По теме: поведение 1С может быть и не совсем грамотное, но вполне предсказуемо. и даже документировано.
47. Venger (venger) 07.10.08 21:38
(46) Насчет предсказуемо - это да, в смысле, первый раз не ожидаешь, все следующие разы знаешь, что будет. А документировано где? Ветки на форумах - их еще найти надо...
48. Venger (venger) 07.10.08 21:55
Необязательная установка значения параметра по умолчанию. Параметры с установленными значе­ниями по умолчанию можно располагать в любом месте списка формальных параметров.

Если параметр при вызове процедуры опущен, то он принимает либо установленное по умолчанию значение (если оно есть) либо принимает «пустое» значение (значение неопределенного типа).

Если параметру не задано значение по умолча­нию и он является последним в списке передавае­мых параметров, то при вызове процедуры его нельзя опускать.

Если параметру задано значение по умолчанию и он является последним в списке, то при вызове процедуры его можно опускать в списке передавае­мых фактических параметров и не ставить запятую перед опущенным параметром.

Если параметру не задано значения по умолча­нию, то при вызове процедуры его можно опускать в списке передаваемых фактических параметров, но разделительную запятую надо ставить.
49. Venger (venger) 07.10.08 22:03
Я просто решил перелистать описание языка, чтоб систематизировать и закрепить знания, и начал с первой главы...
И когда читал 3-й, 4-й и 5-й абзацы, то понял, что с последним параметром и последней запятой, что-то непонятно мне. И решил проверить, что там когда происходит. Проверил, подофигел и расписал ситуацию, чтоб и самому до конца систематизировать ситуацию и разобраться в ней, а заодно думаю, че добру пропадать, выложу, заодно посмотрю, что другие скажут, может материала для размышлений еще подкинут. Т.е. я эту ситуацию чисто из описания прочувствовал, что как то непонятно. Т.е. без всяких отладчиков, без всяких встречаний в реальной деятельности или написании ВК. Т.е. в этом смысле, что думающий человек полезет уточнять и докопается, то да документировано:-)
50. Сhe Burashka (CheBurator) 08.10.08 02:20
БК, спектрумы и прочее.. - счастливцы.. у вас хоть это было.. а в мое время - не было! и "если бы я не был мальчиком, то у меня даже не было бы в дестве игрушки"...
единственное, что оттачивает мозг - это ассемблер... все остальное - это хорошо, гуд, итд. но однозначного поведения и ясности - только в ассемблере есть...
51. Аркадий Кучер (Abadonna) 08.10.08 03:59
Все непонятки у вас, мужики, из-за того, что вы хотите быть святее папы римского
Есть определенные правила, как передать ПУСТОЙ параметр.
Код
Функция Сумма (А=2,Б=3)
   Возврат А+Б;
КонецФункции

Процедура Сформировать()
   Сообщить(Сумма()); // оба пустых
   Сообщить(Сумма(,5)); // первый пустой
   Сообщить(Сумма(8));  // второй пустой
КонецПроцедуры
Показать полностью

Возвращает как и положено 5, 7, 11
И только так!!! И никаких извратов типа Сумма(,) и Сумма(8,)
52. Аркадий Кучер (Abadonna) 08.10.08 05:01
+(51) А вот единственно правильный способ вызова в тремя параметрами
Код
Функция Сумма(А=1,Б=2,В=3)
   Возврат А+Б+В;
КонецФункции

Процедура Сформировать()
   Сообщить(Сумма());  //  все пустые:никаких запятых!
   Сообщить(Сумма(5)); //пустые 2 и 3: никаких запятых после 5!
   Сообщить(Сумма(5,5));  // пустой 3: не надо запятую после 5!
   Сообщить(Сумма(,,5));   // пустые 1 и 2
   Сообщить(Сумма(,5));   // пустые 1 и 3: не надо запятую после 5!
КонецПроцедуры

Показать полностью
53. Артур Аюханов (artbear) 08.10.08 07:22
(51,52) В других языках написание запятой без следующего параметра будет считаться ошибкой :(
А у 1С все не как у людей :) Поэтому очень даже запросто можно сделать подобную незаметную ошибку и поведение кода изменится :(
Т.е. в данном случае 1С очень недружелюбно относится к синтаксису :(
.
С моей точки зрения Сумма(,5) и Сумма(5,) не должны отличаться! В обоих случаях должны передаваться значения по умолчанию, если есть.
.
А вообще Сумма(,5) также изврат - как-то более надежно, что параметры по умолчанию могут быть только в конце списка параметров.
54. Аркадий Кучер (Abadonna) 08.10.08 07:47
(53) Проверю ради интереса на Дельфе. Чё-то как-то не озадачивался до этого...
55. VasilyKushnir (vasilykushnir) 08.10.08 09:07
Вагнер, мне даже спорить с тобой лень - не игривое настроение что-то сегодня. А по сути вопросса... Хотя нет - сначала загадка:

Мальчику дали три яблока. Он два съел. Сколько яблок осталось у мальчика?

НЕ программист ответит - одно. И будет не прав. Задача не имеет решения - мы не знаем, сколько яблок было у мальчика до того.
Отсюда вывод: ВСЕГДА НАДО ИНИЦИАЛИЗИРОВАТЬ ПЕРЕМЕННЫЕ ДО ИХ ИСПОЛЬЗОВАНИЯ. Тогда не будет возникать никаких глюков и подобных тем.
56. VasilyKushnir (vasilykushnir) 08.10.08 09:08
+ к (55) Вагнер = Вангер (опечатка - честное слово не нарочно).
57. Аркадий Кучер (Abadonna) 08.10.08 09:43
(53)+(54)>В других языках написание запятой без следующего параметра будет считаться ошибкой
function Summa(A:integer=1;B:integer=2):integer;
begin
Result:=A+B;
end;
Дельфи при компиляции одинаково ругается и на Summa(5,), и на Summa(,5)
58. VasilyKushnir (vasilykushnir) 08.10.08 11:22
(57) И правильно ругнется - ибо неча... Всегда надо четко осознавать, что передаешь в функцию - следовательно вправе ожидать адекватной реакции функции. Передашь ерунду - ерунду на выходе и получишь.
59. crush (Crush) 08.10.08 11:23
Всем большое спасибо за указание на ошибку.. В последующих текстах буду учитывать подобное поведение.. Но чувствую что голова еще долго будет болеть за ранее написанные программы =))
60. VasilyKushnir (vasilykushnir) 08.10.08 11:35
А плюсик пожалуй автору поставлю (хоть он и обидчивый сверх меры - ничего личного, тем более в его конкретно адрес, не имел в виду) - за любознательность и старательность. Самому бы в лом было возится со столькими вариантами передачи параметров.
Тема еще раз подтвердила верность выбранной мной технологии - всегда четко представлять с чем работаешь, что передаешь и что ожидаешь получить.
Кстати, значениями по умолчанию в списках формальных параметров стараюсь пользоватся при крайней необходимости - комфортнее себя чувствую, проведя анализ в теле функции на пустое значение параметра и потом уже присвоение значения по умолчанию.
61. Альтаир (Altair777) 08.10.08 11:36
(51) А кто в данном случае Папа Римский? :-)
Налицо с недокументированный :-) баг 1С. Вчитайтесь!
«Если параметру задано значение по умолчанию и он является последним в списке, то при вызове процедуры его можно опускать в списке передаваемых фактических параметров и не ставить запятую перед опущенным параметром.»
На самом деле, опускать можно ЛЮБОЙ параметр... Главное, с запятыми не запутатся.

(52) >А вот единственно правильный способ вызова в тремя параметрами
Вы уверены, что перечислили ВСЕ?

Код
А то я тут еще 2 нашел
   Сообщить(Сумма(,10,20));   // пустой 1!
   Сообщить(Сумма(5,,20));   // пустой 2!
Показать полностью
62. Аркадий Кучер (Abadonna) 08.10.08 11:44
(61) Баг не недокументированный, просто плохо документированный.
Надо было написать так: "..и он является последним в списке, то при вызове процедуры его можно опускать в списке передаваемых фактических параметров. При этом запятую перед ним СТАВИТЬ не надо"
P.S. Вот у меня почему-то никогда не возникало сомнений, как её правильно вызвать, наверное потому, что никогда документацию
по таким вопросам не читаю :))))))))
63. Аркадий Кучер (Abadonna) 08.10.08 11:57
(61)>А кто в данном случае Папа Римский? :-))
Папа Римский - Бенедикт XVII, кажись ;))))
64. AlexQC (alexqc) 08.10.08 12:23
Вообще, мало есть языков, в которых допустима конструкция с пустыми запятыми. Например в с++ нельзя, в делфи/паскале тоже (но тут уже сказали), в яве. Вроде можно в VBA/VBS, но там и именованные параметры задавать можно.

Так что, на счет правильного поведения вопрос неоднозначный. За уши к формальному описанию в доке притянуть можно. Ведь действительно, как трактовать последний пустой параметр - как то что он опущен? - тогда нахрен вообще запятую ставили?

И даже наши предположения про "граничное последнее значение" без кода - только предположения (ведь параметры и до, и после последнего обрабатываются одинаково, т.е. именно последний параметр обрабатывается особым образом, т.е. для него сделан отдельный блок?).
Я например не представляю какой должен быть код, чтобы последний параметр "случайно" стал таким особым.
Разве что так - изначально массив параметров инициализируются пустыми значениями;
потом идем по списку, и ставим либо параметр вызова, либо параметр по-умолчанию если оного нет. И только потом - заполняем по-умолчанию то что осталось "за скобками". При этом каким-то образом в этой обработке умудрились опустить последний пустой параметр (а ведь он точно обрабатывается, иначе бы и заданные последние параметры опускались)? Тогда опять приходим к тому что для последнего параметра отдельный блок, вне цикла?

Вот если б первый параметр из параметров "за скобками" пропустили - тогда понятно было бы (не с того второй цикл начали), но это бы выловилось быстро.

И к тому же, схема все-таки странная: я бы сначала инициализировал параметры константным "вектором по-умолчанию" (тем более что 1С в качестве параметров по-умолчанию разрешает только константы, т.е. этот вектор можно просчитать единожды на этапе компиляции), а потом бы просто ставил имеющиеся параметры вызова.

Вобщем что-то с этим последним параметром мутно. Было бы интересно взглянуть на исходник, но к сожалению сие [почти] неосуществимо.
65. Артур Аюханов (artbear) 08.10.08 14:17
Народ, дело ведь не только в параметрах по умолчанию, а в том, что 1С зачем-то разрешила не задавать параметры явно, а дала возможность пропускать их, просто не указываю :(
.
Например, есть
Функция глШтатныеПараметрыПоУмолчанию_Сложение(А, Б)
ее же можно и так
глШтатныеПараметрыПоУмолчанию_Сложение(,) :(
.
В итоге и может появиться код, который ведет себя странным образом, причем 1С об этом ну никак не сообщит. Например, простая опечатка в запятой :(
.
Другие языки все-таки более качественно отнеслись к этому вопросу и не допускают таких непоняток.
67. Аркадий Кучер (Abadonna) 08.10.08 15:33
(66) Не, вот он http://www.wareznik.net/world/id_53261/
У Нуралиева скорее всего конфессия другая;)
68. Альтаир (Altair777) 08.10.08 16:38
(67) Сейчас отвикипедил :-) слово "конфессия"

Конфе́ссия (лат. confessio — исповедание) — особенность вероисповедания в пределах определённого религиозного учения, а также объединение верующих, придерживающихся этого вероисповедания.

Второе значение - это прямо про нас.
Немножко перефразировав Митяева - "а для чего все мы здесь сегодня собрались"
Так что... своего рода Нуралиев для нас - Папа Римский... :-)
69. Аркадий Кучер (Abadonna) 08.10.08 16:40
(68)отвикипедил - плюсссссс!
70. Альтаир (Altair777) 08.10.08 16:46
(69) Спасибо за плюсик :-)
Самому до сих пор смешно, хотя уже годик-два употребляю этот глагол.
Ничего военного в этом нет. Простая компиляция по принципу "Гугл - отгуглил".
71. VasilyKushnir (vasilykushnir) 09.10.08 09:01
(68) -(70) Ну вы прям словарь сленга создаете;
гугл = гугнул, отгуглил, гугланул, загуглячил...
... все = загуглили все
Полный ... = полный яндекс
72. Аркадий Кучер (Abadonna) 09.10.08 09:02
(71) Забыл еще одно: полный гуглец :)))
73. VasilyKushnir (vasilykushnir) 09.10.08 09:03
+ к (71)
- ты не занят.
- Занят! Но я отвечу на все твои вопроссы. И вообще последнее время, блин!, рядом с тобой я чувствую себя полным гуглом...
74. Lomok (lomok) 09.10.08 09:05
Имхо "отвикипедил" ближе к созданию статьи в википедии.
Погуглил, повикипедил, полуркал...
но это уже полный офф :)
75. Альтаир (Altair777) 09.10.08 09:37
(74) имхо, Вы не правы... А что тогда "отгуглил"?
Хакнул робота Гугла и продвинул свой сайт в топы? :-)
76. Аркадий Кучер (Abadonna) 09.10.08 09:40
И последний вариант: википедик :))))
78. Альтаир (Altair777) 09.10.08 09:50
(76) этот тот, кого википедают? :-)
79. Аркадий Кучер (Abadonna) 09.10.08 09:55
(77) Сорри за OFF. Ероха, ты чё в асе скрываешься?
80. sash-ml (sash-ml) 09.10.08 15:45
а шо если запятую убрать а?
81. Альтаир (Altair777) 09.10.08 16:08
83. pvase (pvase) 09.10.08 20:13
Автор не прав, он передает 2 параметра, так как стоит запятая (,). Соответсвенно считается что параметр 1 и параметр 2 пустые.
84. Venger (venger) 09.10.08 21:55
(83) Значения по умолчанию формальных параметров учли? :-))
85. Venger (venger) 09.10.08 21:58
(83) Комментарии к статье читали? Там есть еще много различных примеров в дополнение к сказанному в статье. В статье минимум, чтоб понять смысл...
86. Venger (venger) 09.10.08 21:58
(83) В общем, поверьте на слово, автор прав:-))
87. Venger (venger) 09.10.08 22:00
(83) Основные расхождения в интерпретации, как всегда, - это баг или не очень:-))
Но с этим, конечно, можно жить и вполне радостно, только надо об этом знать и учитывать:-))
motogon; vasilykushnir; +2 1 Ответить 1
88. Альтаир (Altair777) 09.10.08 22:19
Спмое забавное, что вариант (,) проходит...
Хотя первому параметру не присвоено значение по умолчанию.
Сравните с тем, что вариант () на этапе синтаксиса уже не проходит.
Вот еще 1 баг :-)
89. VasilyKushnir (vasilykushnir) 10.10.08 16:37
(87)"Основные расхождения в интерпретации, как всегда, - это баг или не очень:-))"

Наполовину беременна, наполовину нет... :-)
motogon; venger; +2 Ответить 1
90. Venger (venger) 10.10.08 17:01
(89) VasilyKushnir, вообще я не злой:-))
Кстати, мой ник - это по фамилии на русском - Венгер, на первом слоге ударение, если произносить:-))
Хотя Вагнер или Бетховен или Бах, тоже приятно, быть композитором в программировании - это исскуство:-))
91. Venger (venger) 10.10.08 17:02
+(90) Но я не так крут еще:-))
92. Сhe Burashka (CheBurator) 10.10.08 17:36
(90) угумс.. был у нас замполит - зАсов и чел с фамилией кОзлов... но больше всего не повезет жене человека с фамилией Вагин....
93. Евгений Мартыненков (JohnyDeath) 10.10.08 18:14
(92) а со мной училась такая ;)
94. Сhe Burashka (CheBurator) 10.10.08 18:51
А фамилия чела Воробьев - лучше ее в обществе женщин задом наперед вслух не читать...
95. Venger (venger) 11.10.08 01:48
Головач Лена, так что обломитесь все:-)
96. Александр Левнёв (alevnev) 11.10.08 15:58
1) В случае вызова (,) опущен 1-й фактический параметр, не имеющий значения по-умолчанию. А по документации: "Если параметру задано значение по умолчанию и он является последним в списке..."

2) Функция ПустоеЗначение() очень часто ведет себя непредсказуемо даже в 27-ом релизе, в частности, с агрегатными типами данных (справочник, документ).

97. nickVZ (nickVZ) 14.10.08 10:34
А может стоит бросить привычку ожидать, что реализовано что-то по вашему мнению? А? И в сомнительных случаях просто ставить проверку?
vasilykushnir; +1 Ответить 2
98. VasilyKushnir (vasilykushnir) 14.10.08 10:56
99. Venger (venger) 14.10.08 11:17
(97,98) :-)))

Это само сабой, на эту тему, по-моему, достаточно полный Вам ответ от меня можете почитать тут:
http://infostart.ru/profile/20743/blogs/635/

Но ожидать, люди всегда чего-то ожидают, Вы ведь ожидаете, что если Вы напишете: а=1+1, то а будет равняться двум? Или если не будет то не сильно расстроитесь?
Знания - это и есть ожидания:-))) В каком-то смысле:-)))
100. Venger (venger) 14.10.08 11:52
VasilyKushnir, Вы явно ко мне неравнодушны:-))))
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа