[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    7445    Vortigaunt    5    

11

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

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

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

1 стартмани

16.05.2018    10128    Vortigaunt    26    

5

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

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

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

27.01.2016    93973    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    23722    tomvlad    5    

14

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

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

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

02.07.2012    18359    maxpiter    62    

15
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
103. venger 2121 14.10.08 13:10 Сейчас в теме
+(102) Такое впечатление, что я на святое покусился и оскверняю святые мощи 1С:-))
104. Abadonna 3958 14.10.08 14:02 Сейчас в теме
(103)>Такое впечатление, что я на святое покусился
Да ни на что ты не покусился. Просто вот у меня никогда даже не возникало сомнения как параметры передать, не хряпал лишних запятых и даже не задумывался над вопросом, который ты поднял. Я ваще ЖКК первый раз в глаза увидал после начала работы с клюшками, открывал, кажись, один раз после этого
105. Abadonna 3958 14.10.08 14:06 Сейчас в теме
+(104) через год (пропустил тут )"в глаза увидал после начала работы с клюшками"
99. venger 2121 14.10.08 11:17 Сейчас в теме
(97,98) :-)))

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

Но ожидать, люди всегда чего-то ожидают, Вы ведь ожидаете, что если Вы напишете: а=1+1, то а будет равняться двум? Или если не будет то не сильно расстроитесь?
Знания - это и есть ожидания:-))) В каком-то смысле:-)))
100. venger 2121 14.10.08 11:52 Сейчас в теме
VasilyKushnir, Вы явно ко мне неравнодушны:-))))
106. Atheist 15.10.08 06:58 Сейчас в теме
Есть процедура ПередачаПараметров1, имеющая три параметра, первый из которых обязательный, соответственно чтобы эта процедура отработала с данными параметров заданными по умолчанию, нужно просто передать только первый параметр, например: ПередачаПараметров1(777).
Если же вызвать процедуру так ПередачаПараметров1(,), то в этом случае первому и второму параметру процедуры передано ПУСТОЕ ЗНАЧЕНИЕ.

P.S.
По утверждениям медиков, постоянное потребление тормозной жидкости сильно понижает мыслительные способности.
107. Abadonna 3958 15.10.08 07:38 Сейчас в теме
(106) Я про это еще в (52) написал :)
109. Altair777 644 15.10.08 11:44 Сейчас в теме
(106)
> Если же вызвать процедуру так ПередачаПараметров1(,), то в этом случае первому и второму параметру процедуры передано ПУСТОЕ ЗНАЧЕНИЕ.
В том-то и дело, что и обязательному(!) и необязательному параметру, у которого есть значение по умолчанию, присваивается ПУСТОЕ ЗНАЧЕНИЕ
Как надо мы уже давно разобрались, Вы что не читали обсуждение с самого начала?
Речь идет о том, что это баг.

P.S. Вот видите, Вы сами понимаете, а пьете. Нехорошо....
P.P.S. А ЧЕГО ВЫ КАПСИТЕ? ВЫ БЛОНДИНКО? :-)
motogon; venger; +2 Ответить
108. venger 2121 15.10.08 11:35 Сейчас в теме
(106,107) Вы уже утомили:-)))
А если вызвать так: ПередачаПараметров1( , , )? То второй инициализируется значением по умолчанию, а третий нет? И это расхождение с заявленныем поведением в документации. Это факт. И че умничать, спрашивается? А как вызвать функцию и как писать код, я то знаю. Но и факт этот тоже знаю. Причем тут одно к другому?
110. Altair777 644 15.10.08 11:46 Сейчас в теме
(108) Одновременно писали :-)
111. user739767 26.09.18 16:09 Сейчас в теме
Че вы гоните?

Все правильно....пропущенный параметр а это значит запятая передается пустое значение поэтому и затираются значения по умолчанию....логику развейте в себе хотя-бы)
112. Cерый 25 18.12.22 18:38 Сейчас в теме
Обнаружил, что при повторной передаче пустого параметра ему не присваивается значение по умолчанию:
Процедура Тест2(Пар1=0, Пар2=0, Пар3=0)
	Сообщить("Параметр 1: " + Пар1);
	Сообщить("Параметр 2: " + Пар2);
	Сообщить("Параметр 3: " + Пар3);
КонецПроцедуры

Процедура Тест1(Пар1,   Пар2,   Пар3)
	      Тест2(Пар1,   Пар2,   Пар3);
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
	Сообщить("фактический параметр опущен после последней запятой: ИСПРАВЛЕНО В 1С 8х:"); //https://infostart.ru/1c/articles/57311/
	Тест2(,2,);
	Сообщить("умолчания параметров при их повторной передаче: в любом случае пустое значение:");
	Тест1(,,3);
КонецПроцедуры
Показать

Описанная Вами ситуация исправлена в 1с 8х, описанная здесь - нет.
Отмечу, что в 7.7 это наблюдалось в стандартной Бухгалтерии на часто используемой процедуре глПров(...
Прикрепленные файлы:
Занимательная передача параметров 1C 8х.epf
Оставьте свое сообщение