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

18.06.09

Разработка - Механизмы платформы 1С

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

(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'е сказано:
-----------------------------------------------------------------
«Если параметр при вызове процедуры опущен, то он принимает либо установленное по умолчанию значение (если оно есть) либо принимает «пустое» значение (значение неопределенного типа).»
-----------------------------------------------------------------

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

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

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

См. также

"Виртуальный" работник на платформе 1C v7.7

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

В статье расписаны примеры из жизни использования "Виртуального" работника. Разобраны вопросы, возникающие при работе с ним.

28.11.2021    1545    user707242_Gold_karas    18    

5

Асинхронное программирование в 1с77 без внешних компонент. Обратные вызовы.

Механизмы платформы 1С Платформа 1С v7.7 Абонемент ($m)

Пример построения программного кода для достижения функционала обратных вызовов (call back) во внешних обработках исключительно штатными средствами. Тестировалось на платформе 1с77 релиз 027. Конфигурация значения не имеет.

1 стартмани

06.10.2018    7444    Vortigaunt    5    

11

Особенности разделения объектной модели документа и базы данных в 1С 7.7. Забавный глюк

Механизмы платформы 1С Оперативный учет 7.7 Абонемент ($m)

Когда занимаешься разработкой в среде 1С, редко задумываешься о том, что программным кодом ты работаешь с объектной моделью базы данных, а не с самой базой данных. И что это вообще разные вещи. Ты создаешь объекты: документы и справочники, записываешь их - и в базе данных появляются соответствующие записи. Это настолько привычно, что когда сталкиваешься с нетипичным поведением платформы, первым делом думаешь: надо протестировать базу, она битая. В этой статье я хочу разобрать одну интересную ситуацию, которая как раз демонстрирует такое поведение. Описанная ниже ситуация воспроизводится как в файловом, так и в клиент-серверном (SQL) варианте. Тестировалось на версии платформы 1с77 релиз 027.

1 стартмани

16.05.2018    10125    Vortigaunt    26    

5

Использование классов .Net в 1С для новичков

Механизмы платформы 1С Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    93961    Serginio    116    

188

Все про картинки в 1С 7.7, ну или почти все...

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

В 1С 8 наличие картинок товаров предусмотрено изначально, а в 7.7 такого нет. Проблема существует и ее исправляют, но это, как правило, частные случаи, касающиеся, например, печати прайса http://infostart.ru/public/289876/ , показу картинок в справочнике номенклатура http://infostart.ru/public/17125/, файловый менеджер картинок товара http://infostart.ru/public/15239/ или просто конфигурации работы с картинками http://infostart.ru/public/21142/ (не стремился дать полный обзор, поэтому не попавшие не обижайтесь :). Что не устроило – информация разбросана по статьям, необходимость дополнительно напрягаться, чтобы это заработало. Здесь я попытался собрать все «до кучи», а так же дать необходимые ссылки для желающих «копнуть вглубь».

1 стартмани

18.11.2014    43977    95    kitminsk    18    

20

ЗаполнитьЗначенияСвойств - заставляем работать в 7.7

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?

24.07.2014    23721    tomvlad    5    

14

Динамическая фильтрация в справочнике при вводе наименования

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

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

02.07.2012    18357    maxpiter    62    

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

Чудеса...
25. JohnyDeath 301 07.10.08 17:44 Сейчас в теме
Артур, вот это:
Код
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(,4);
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4, 1);
Показать полностью

вполне ожидаемые результаты дают (дальше не смотрел).
Единственное о чём надо помнить, ИМХО, так это про последний параметр.
Например вот это:
Код
глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1);
Показать полностью
я читаю как: Первый - по умолчанию (2), во второй - единица (1), последний - по умолчанию (5) = 8
вот это
Код
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(, 1, );
Показать полностью
так: Первый - по умолчанию (2), второй - единица (1), в третий - ПУСТОЕ (0) = 3
3. Shaman100M 1150 07.10.08 09:12 Сейчас в теме
Да, есть такое, именно с последним опущенным параметром. Наткнулся на эту фичу в глубокой отладке...
4. Abadonna 3958 07.10.08 09:26 Сейчас в теме
(3)>опущенным параметром
Опущенный параметр - жесть :)))))
motogon; vasilykushnir; +2 Ответить
5. vasilykushnir 63 07.10.08 09:31 Сейчас в теме
(4) да еще в сочетании с глубокой отладкой... Молодец, Шаман, - поднял (в смысле улучшил :-) ) настроение.
Abadonna; +1 Ответить
13. artbear 1448 07.10.08 16:39 Сейчас в теме
Например, есть функция в глобальнике
Код
Функция глШтатныеПараметрыПоУмолчанию_Сложение(А = 2, Б = 3) Экспорт
   Возврат А + Б;
КонецФункции
Показать полностью

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

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

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

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

22. artbear 1448 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 1448 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>
Показать полностью

Разве это верные/ожидаемые результаты ? :)
6. Shaman100M 1150 07.10.08 09:37 Сейчас в теме
)))))) Еще раз перечитал свой пост.... долго думал.... ))) Ну, тогда "фича" и "наткнулся" тож рулят. ))))
7. Altair777 644 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 2121 07.10.08 14:42 Сейчас в теме
(7) Даже если передается пустое значение, то в любом случае, если задано значение по умолчанию для формального параметра, формальный параметр должен инициализироваться значением по умолчанию. А этого не происходит, но только в одном случае (что радует), если пропущен фактический параметр после последней запятой при вызове функции, в остальных случаях, все работает, так как должно быть, т.е. если задано значение по умолчанию, то при пропущенно фактическом параметре, формальный параметр инициализируется значением по умолчанию. Т.е. налицо явно баг, хотя если красиво описать, то будет фича:-)))
9. Abadonna 3958 07.10.08 16:03 Сейчас в теме
(8)>Даже если передается пустое значение
Не передается НИКАКОЕ значение, не передается параметр ВООБЩЕ - а это, как говорят в Одессе, две большие разницы. Не баг и не фича, а стандартная вещь
Vitek; JohnyDeath; vasilykushnir; +3 Ответить
18. venger 2121 07.10.08 16:55 Сейчас в теме
(9) Abadonna, а про инициализацию формального параметра значением по умолчанию (которое прописано при определении функции), при отсутсвии фактического, что ты можешь сказать, млин? Где тут норма?

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

Но на выходе получим, т.е. Пар2=2, а не "Пустой":
Пар1=1
Пар2=2
Пар3=\"Пустой\"
10. vasilykushnir 63 07.10.08 16:16 Сейчас в теме
(8) А ведь стопудово прав. Все больше убеждаюсь, что для того, чтобы называть себя программистом, надо пройти курс молодого бойца на ассемблере... И все больше склоняюсь к мысли: чистый 1с-ник - не программист (в том смысле, что за плечами нет других языков программирования).
11. vasilykushnir 63 07.10.08 16:20 Сейчас в теме
Сорри, пост (10) относится к (9). И еще. Есть золотое правило: прежде чем кричать о глюках, лучше сначала выключить устройство krivie_ruchki.sys...
38. venger 2121 07.10.08 20:04 Сейчас в теме
(11) Кстати, чтоб убедиться, что я НЕ чистый 1С'ник, как минимум, я вообще НЕ 1С'ник, глянь в мой профайл, найдешь пару примитивных ВК, с исходниками. Т.е. с другими языками, я точно знаком. Я просто, даже программистом назвать себя не могу, а ты вот не стесняешься и программистом себя считаешь, хотя ни одной операционки не создал или СУБД, или на худой случай среды разработки с языком гениальным, покрасивее, чем С++, например...
39. venger 2121 07.10.08 20:05 Сейчас в теме
34. venger 2121 07.10.08 19:40 Сейчас в теме
(10) Я, кстати, не 1С'ник, и за плечами у меня не ассемблер, конечно, но есть много чего, правда многое было давно, в студенческие годы…
Но раз мы такие опытные, приведите еще один язык (среду), с подобным поведением в передаче параметров.
35. venger 2121 07.10.08 19:49 Сейчас в теме
(10) И много таких примеров Вы наберете? А как в Си, Паскале с этим? И сколько сред отрабатывают действительно ожидаемо?
Соотношение будет в лучшем для Вас случае: как в 1С - 5%, как НЕ в 1С - 95%. И что ожидаемей по вашему?
36. venger 2121 07.10.08 19:52 Сейчас в теме
(10) А по-поводу кривых рук, я б сказал, да не буду, деятель великий нашелся...
21. Altair777 644 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

-------------------------
Кажется, работает правильно :-)
51. Abadonna 3958 08.10.08 03:59 Сейчас в теме
Все непонятки у вас, мужики, из-за того, что вы хотите быть святее папы римского
Есть определенные правила, как передать ПУСТОЙ параметр.
Код
Функция Сумма (А=2,Б=3)
   Возврат А+Б;
КонецФункции

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

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

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

Показать полностью
alf2005q; +1 Ответить
61. Altair777 644 08.10.08 11:36 Сейчас в теме
(51) А кто в данном случае Папа Римский? :-)
Налицо с недокументированный :-) баг 1С. Вчитайтесь!
«Если параметру задано значение по умолчанию и он является последним в списке, то при вызове процедуры его можно опускать в списке передаваемых фактических параметров и не ставить запятую перед опущенным параметром.»
На самом деле, опускать можно ЛЮБОЙ параметр... Главное, с запятыми не запутатся.

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

Код
А то я тут еще 2 нашел
   Сообщить(Сумма(,10,20));   // пустой 1!
   Сообщить(Сумма(5,,20));   // пустой 2!
Показать полностью
62. Abadonna 3958 08.10.08 11:44 Сейчас в теме
(61) Баг не недокументированный, просто плохо документированный.
Надо было написать так: "..и он является последним в списке, то при вызове процедуры его можно опускать в списке передаваемых фактических параметров. При этом запятую перед ним СТАВИТЬ не надо"
P.S. Вот у меня почему-то никогда не возникало сомнений, как её правильно вызвать, наверное потому, что никогда документацию
по таким вопросам не читаю :))))))))
63. Abadonna 3958 08.10.08 11:57 Сейчас в теме
(61)>А кто в данном случае Папа Римский? :-))
Папа Римский - Бенедикт XVII, кажись ;))))
67. Abadonna 3958 08.10.08 15:33 Сейчас в теме
(66) Не, вот он http://www.wareznik.net/world/id_53261/
У Нуралиева скорее всего конфессия другая;)
68. Altair777 644 08.10.08 16:38 Сейчас в теме
(67) Сейчас отвикипедил :-) слово "конфессия"

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

Второе значение - это прямо про нас.
Немножко перефразировав Митяева - "а для чего все мы здесь сегодня собрались"
Так что... своего рода Нуралиев для нас - Папа Римский... :-)
Abadonna; +1 Ответить
69. Abadonna 3958 08.10.08 16:40 Сейчас в теме
(68)отвикипедил - плюсссссс!
70. Altair777 644 08.10.08 16:46 Сейчас в теме
(69) Спасибо за плюсик :-)
Самому до сих пор смешно, хотя уже годик-два употребляю этот глагол.
Ничего военного в этом нет. Простая компиляция по принципу "Гугл - отгуглил".
71. vasilykushnir 63 09.10.08 09:01 Сейчас в теме
(68) -(70) Ну вы прям словарь сленга создаете;
гугл = гугнул, отгуглил, гугланул, загуглячил...
... все = загуглили все
Полный ... = полный яндекс
72. Abadonna 3958 09.10.08 09:02 Сейчас в теме
(71) Забыл еще одно: полный гуглец :)))
73. vasilykushnir 63 09.10.08 09:03 Сейчас в теме
+ к (71)
- ты не занят.
- Занят! Но я отвечу на все твои вопроссы. И вообще последнее время, блин!, рядом с тобой я чувствую себя полным гуглом...
12. artbear 1448 07.10.08 16:36 Сейчас в теме
Для справки - подобные баги при работе с параметрами по умолчанию были обнаружены еще пару лет назад при работе над ВК 1С++ :)
У меня даже тесты соответствующие с тех пор остались.
.
ЗЫ это мы разбирались, как правильно передавать параметры по умолчанию в классы 1С++.
15. vasilykushnir 63 07.10.08 16:40 Сейчас в теме
(12) Нет худа без добра - подумал зять, кидая камнем в собаку и попадая в тещу... :-)
14. artbear 1448 07.10.08 16:40 Сейчас в теме
(12+) Даже где-то на форуме 1cpp.ru есть соответствующая ветка.
16. artbear 1448 07.10.08 16:41 Сейчас в теме
А для 3 и более параметров, как у автора, вообще полные чудеса творятся :)
17. artbear 1448 07.10.08 16:46 Сейчас в теме
(12+) Соответственно, работа с методами по умолчанию в классах 1С++ лишена этого недочета 1С - в 1С++ все просто и прозрачно, как в других языках :) Но только в том случае, если обращаться к объекту класса через контекст - типа ОБъект.Метод()
В ином случае, если, например, внутри класса вызвать просто Метод(), 1С "сильнее" и работает именно ее синтаксис и ее баги :)
19. Abadonna 3958 07.10.08 17:05 Сейчас в теме
>фактического, что ты можешь сказать, млин?
А вот, млин, и говорю: первый та передал как 1, второй (раз он между запятыми) - ПустоеЗначение (вот и присвоилось значение =2), третий ты ваще не передал (т.е. не передавал ты туда пустое значение на основании которого он должен был стать=3)
20. artbear 1448 07.10.08 17:12 Сейчас в теме
(19) Ты не прав - явный же изврат получился :)
24. artbear 1448 07.10.08 17:39 Сейчас в теме
Кстати, не обратил внимания сначала - автор написал абсолютно верно
Т.е. получается, что при передаче фактических параметров при вызове процедуры, если после последней запятой фактический параметр опущен, то соответствующему формальному параметру в любом случае будет присвоено пустое значение, а не значение по умолчанию, которое ему задано
.
Т.е. разработчик 1С не проверил граничное последнее значение и сделал ошибку, а отсутствие соответствующих юнит-тестов не позволило найти эту ошибку, в результате чего ошибка так и живет до сих пор :(
.
Именно эти факты и доказывают наши тесты и примеры :(
26. JohnyDeath 301 07.10.08 17:45 Сейчас в теме
(24) ну вот, сам же жирным и ответил на все вопросы. Т.е. никакого бага. Всё ожидаемо, КМК.
27. Altair777 644 07.10.08 17:50 Сейчас в теме
(26) > Т.е. никакого бага.
Баг есть... у фирмы 1С
31. artbear 1448 07.10.08 18:03 Сейчас в теме
(26) Жень, ну сам посуди, где же ожидаемое поведение -
Значение = глШтатныеПараметрыПоУмолчанию_Сложение_3Параметра(4,);
9 разве ожидаемо? Т.е. второй пустой, а 3 параметр берется по умолчанию ??
Изврат полный :)
28. JohnyDeath 301 07.10.08 17:53 Сейчас в теме
29. venger 2121 07.10.08 17:55 Сейчас в теме
Им (JohnyDeath, Abadonna) просто 1С деньги пошляет, вот они и на защиту встали:-)))
30. Altair777 644 07.10.08 17:58 Сейчас в теме
И я хатю... Дайте два! :-)
32. artbear 1448 07.10.08 18:09 Сейчас в теме
Кстати, могу в ВК 1С++ или в ФормЕкс исправить данное корявое поведение 1С :)
Т.е. вместо пустых значений при использовании запятой будут выдаваться значения по умолчанию.
.
Но представляете, сколько давно работающего кода может оказаться неверным :)
motogon; Crush; +2 Ответить
33. Altair777 644 07.10.08 18:50 Сейчас в теме
(32) Будут баги при использовании исправленного бага? :-)
37. venger 2121 07.10.08 19:53 Сейчас в теме
Сорри, пост 36 относится к 11-му посту:-)))
40. Душелов 4013 07.10.08 20:30 Сейчас в теме
А вы тут все - молодцы!
41. venger 2121 07.10.08 20:38 Сейчас в теме
Пошел, покушал, стал добрее. Кушайте люди, помогает от злости:-))
Я итак на работе не могу заниматься программированием, а когда видишь (я счас не про сайт и не про тех, кто с сайта), что есть куча людей, в том числе и 1С'ников, особенно у франчей. Сидят целыми днями и могут заниматься программированием, а толку, только место занимают. А ты, через силу, после работы или по выходным, усталый и с кучей других проблем, нормально, а даже и получше, тратя гораздо меньше времени и вопреки обстоятельствам успеваешь и изучить, и делать получше, чем они. И с кучей отвлекающих обстоятельств. И ты после этого, так себе, а они супер-пупер прогеры, а зачастую только усидчивостью и берут. ОбЫдно, елы-палы...
42. Душелов 4013 07.10.08 20:46 Сейчас в теме
(41) Учись, студент. И работать, и программить :) И жениться тоже :)
43. venger 2121 07.10.08 20:54 Сейчас в теме
(42) Прорвемся, где наша не пропадала:-)
Я правда только в душе студент, а так давно уже нет, закончил, но это дела не меняет:-))
Меня просто жизнь все время как то мешала увязнуть в программировании. Первый раз - это было классе в пятом, подарили мне советский еще комп БК, подключался к телеку, винт - магнитофон с кассетами. Так у меня магнитофона не было, приходилось набирать каждый раз все по новой:-)) И вот, я уже дошел до того, чтобы писать игрухи простенькие, чужих то не было, ни кассет, ни магнитофона. И я, математику то, толком еще не начали нам еще читать, приставал к взрослым, как мне посчитать отскок мяча от стенки:-))) В общем, перегорел он, компьютер. На полгода или год, не было возможности. Потом опять начал, появился комп, потом опять что-то случилось. И вот так все время. Не хочет судьба, чтобы я с компами долго общался:-)))
44. Душелов 4013 07.10.08 20:56 Сейчас в теме
(43) Ну если по воспоминаниям... Я свою первую прогу написал в 11 лет, на спектруме, на бейсике... И понеслась :)
45. venger 2121 07.10.08 21:02 Сейчас в теме
Я тоже на бейсике:-))) Правда потом понеслось в другую сторону, спорт, горы, скалолазанье, горными лыжами, потом легкая атлетика, баскетбол, потом старшие классы, это уже не совсем спорт, но впечатления новые, из серии вспомнить есть что, а детям рассказать нечего:-) И все время пытался вернуться к программированию, и все время через какое-то время, что-то выбивало:-)))
46. JohnyDeath 301 07.10.08 21:32 Сейчас в теме
По теме: поведение 1С может быть и не совсем грамотное, но вполне предсказуемо. и даже документировано.
47. venger 2121 07.10.08 21:38 Сейчас в теме
(46) Насчет предсказуемо - это да, в смысле, первый раз не ожидаешь, все следующие разы знаешь, что будет. А документировано где? Ветки на форумах - их еще найти надо...
48. venger 2121 07.10.08 21:55 Сейчас в теме
Необязательная установка значения параметра по умолчанию. Параметры с установленными значе­ниями по умолчанию можно располагать в любом месте списка формальных параметров.

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

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

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

Если параметру не задано значения по умолча­нию, то при вызове процедуры его можно опускать в списке передаваемых фактических параметров, но разделительную запятую надо ставить.
49. venger 2121 07.10.08 22:03 Сейчас в теме
Я просто решил перелистать описание языка, чтоб систематизировать и закрепить знания, и начал с первой главы...
И когда читал 3-й, 4-й и 5-й абзацы, то понял, что с последним параметром и последней запятой, что-то непонятно мне. И решил проверить, что там когда происходит. Проверил, подофигел и расписал ситуацию, чтоб и самому до конца систематизировать ситуацию и разобраться в ней, а заодно думаю, че добру пропадать, выложу, заодно посмотрю, что другие скажут, может материала для размышлений еще подкинут. Т.е. я эту ситуацию чисто из описания прочувствовал, что как то непонятно. Т.е. без всяких отладчиков, без всяких встречаний в реальной деятельности или написании ВК. Т.е. в этом смысле, что думающий человек полезет уточнять и докопается, то да документировано:-)
50. CheBurator 3119 08.10.08 02:20 Сейчас в теме
БК, спектрумы и прочее.. - счастливцы.. у вас хоть это было.. а в мое время - не было! и "если бы я не был мальчиком, то у меня даже не было бы в дестве игрушки"...
единственное, что оттачивает мозг - это ассемблер... все остальное - это хорошо, гуд, итд. но однозначного поведения и ясности - только в ассемблере есть...
53. artbear 1448 08.10.08 07:22 Сейчас в теме
(51,52) В других языках написание запятой без следующего параметра будет считаться ошибкой :(
А у 1С все не как у людей :) Поэтому очень даже запросто можно сделать подобную незаметную ошибку и поведение кода изменится :(
Т.е. в данном случае 1С очень недружелюбно относится к синтаксису :(
.
С моей точки зрения Сумма(,5) и Сумма(5,) не должны отличаться! В обоих случаях должны передаваться значения по умолчанию, если есть.
.
А вообще Сумма(,5) также изврат - как-то более надежно, что параметры по умолчанию могут быть только в конце списка параметров.
54. Abadonna 3958 08.10.08 07:47 Сейчас в теме
(53) Проверю ради интереса на Дельфе. Чё-то как-то не озадачивался до этого...
57. Abadonna 3958 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 63 08.10.08 11:22 Сейчас в теме
(57) И правильно ругнется - ибо неча... Всегда надо четко осознавать, что передаешь в функцию - следовательно вправе ожидать адекватной реакции функции. Передашь ерунду - ерунду на выходе и получишь.
55. vasilykushnir 63 08.10.08 09:07 Сейчас в теме
Вагнер, мне даже спорить с тобой лень - не игривое настроение что-то сегодня. А по сути вопросса... Хотя нет - сначала загадка:

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

НЕ программист ответит - одно. И будет не прав. Задача не имеет решения - мы не знаем, сколько яблок было у мальчика до того.
Отсюда вывод: ВСЕГДА НАДО ИНИЦИАЛИЗИРОВАТЬ ПЕРЕМЕННЫЕ ДО ИХ ИСПОЛЬЗОВАНИЯ. Тогда не будет возникать никаких глюков и подобных тем.
56. vasilykushnir 63 08.10.08 09:08 Сейчас в теме
+ к (55) Вагнер = Вангер (опечатка - честное слово не нарочно).
59. Crush 08.10.08 11:23 Сейчас в теме
Всем большое спасибо за указание на ошибку.. В последующих текстах буду учитывать подобное поведение.. Но чувствую что голова еще долго будет болеть за ранее написанные программы =))
60. vasilykushnir 63 08.10.08 11:35 Сейчас в теме
А плюсик пожалуй автору поставлю (хоть он и обидчивый сверх меры - ничего личного, тем более в его конкретно адрес, не имел в виду) - за любознательность и старательность. Самому бы в лом было возится со столькими вариантами передачи параметров.
Тема еще раз подтвердила верность выбранной мной технологии - всегда четко представлять с чем работаешь, что передаешь и что ожидаешь получить.
Кстати, значениями по умолчанию в списках формальных параметров стараюсь пользоватся при крайней необходимости - комфортнее себя чувствую, проведя анализ в теле функции на пустое значение параметра и потом уже присвоение значения по умолчанию.
64. alexqc 150 08.10.08 12:23 Сейчас в теме
Вообще, мало есть языков, в которых допустима конструкция с пустыми запятыми. Например в с++ нельзя, в делфи/паскале тоже (но тут уже сказали), в яве. Вроде можно в VBA/VBS, но там и именованные параметры задавать можно.

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

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

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

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

Вобщем что-то с этим последним параметром мутно. Было бы интересно взглянуть на исходник, но к сожалению сие [почти] неосуществимо.
65. artbear 1448 08.10.08 14:17 Сейчас в теме
Народ, дело ведь не только в параметрах по умолчанию, а в том, что 1С зачем-то разрешила не задавать параметры явно, а дала возможность пропускать их, просто не указываю :(
.
Например, есть
Функция глШтатныеПараметрыПоУмолчанию_Сложение(А, Б)
ее же можно и так
глШтатныеПараметрыПоУмолчанию_Сложение(,) :(
.
В итоге и может появиться код, который ведет себя странным образом, причем 1С об этом ну никак не сообщит. Например, простая опечатка в запятой :(
.
Другие языки все-таки более качественно отнеслись к этому вопросу и не допускают таких непоняток.
74. Vitek 09.10.08 09:05 Сейчас в теме
Имхо "отвикипедил" ближе к созданию статьи в википедии.
Погуглил, повикипедил, полуркал...
но это уже полный офф :)
75. Altair777 644 09.10.08 09:37 Сейчас в теме
(74) имхо, Вы не правы... А что тогда "отгуглил"?
Хакнул робота Гугла и продвинул свой сайт в топы? :-)
76. Abadonna 3958 09.10.08 09:40 Сейчас в теме
И последний вариант: википедик :))))
77. vip 09.10.08 09:48 Сейчас в теме
79. Abadonna 3958 09.10.08 09:55 Сейчас в теме
(77) Сорри за OFF. Ероха, ты чё в асе скрываешься?
78. Altair777 644 09.10.08 09:50 Сейчас в теме
(76) этот тот, кого википедают? :-)
80. sash-ml 09.10.08 15:45 Сейчас в теме
а шо если запятую убрать а?
81. Altair777 644 09.10.08 16:08 Сейчас в теме
83. pvase 401 09.10.08 20:13 Сейчас в теме
Автор не прав, он передает 2 параметра, так как стоит запятая (,). Соответсвенно считается что параметр 1 и параметр 2 пустые.
84. venger 2121 09.10.08 21:55 Сейчас в теме
(83) Значения по умолчанию формальных параметров учли? :-))
85. venger 2121 09.10.08 21:58 Сейчас в теме
(83) Комментарии к статье читали? Там есть еще много различных примеров в дополнение к сказанному в статье. В статье минимум, чтоб понять смысл...
86. venger 2121 09.10.08 21:58 Сейчас в теме
(83) В общем, поверьте на слово, автор прав:-))
87. venger 2121 09.10.08 22:00 Сейчас в теме
(83) Основные расхождения в интерпретации, как всегда, - это баг или не очень:-))
Но с этим, конечно, можно жить и вполне радостно, только надо об этом знать и учитывать:-))
motogon; vasilykushnir; +2 1 Ответить
89. vasilykushnir 63 10.10.08 16:37 Сейчас в теме
(87)"Основные расхождения в интерпретации, как всегда, - это баг или не очень:-))"

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

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

97. nickVZ 10 14.10.08 10:34 Сейчас в теме
А может стоит бросить привычку ожидать, что реализовано что-то по вашему мнению? А? И в сомнительных случаях просто ставить проверку?
vasilykushnir; +1 Ответить
98. vasilykushnir 63 14.10.08 10:56 Сейчас в теме
101. vasilykushnir 63 14.10.08 12:33 Сейчас в теме
(97) Быстрее нет, чем да. Просто, как сказано в (97), стараюсь максимально ставить проверки - от греха подальше. Хотя с моими юзверями не всегда спасает... Именно в этой части согласен с (97).
102. venger 2121 14.10.08 13:09 Сейчас в теме
(101) Я вот чего понять не могу, чем эта позиция (ведь у меня такая же) мешает признать, что в 1С немного подошиблись и перекрутили в реализации приема/передачи параметров?
Оставьте свое сообщение