Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Работает ли СтатусВозврата(0) в КОПе ? (число прочтений - 10029 )
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Работает ли СтатусВозврата(0) в КОПе ?
03. Апреля 2009 :: 09:22
Печать  
Есть Документ

Процедура ОбработкаПроведения()

   ....
   ВыполнитьПроведение();

КонецПроцедуры

Процедура ВыполнитьПроведение()

    МойКОП.Провести();
КонецПроцедуры


в МойКОП

Процедура Провести()
    ....
     Если Что-то Тогда
         СтатусВозврата(0);
         Возврат;
    КонецЕсли;
КонецПроцедуры

В любом случае в модуле документа СтатусВозврата()=1

Под отладчиком перед входом в МойКОП.Провести()
СтатусВозврата()=1
при входе в МойКОП СтатусВозврата()=1677...
щас не вспомню - какое-то длинное число
при входе внутрь очередной процедуры /функции
статусВозврата()=очередное большое число и т.д.
при выходе из КОП СтатусВозврата()=1

Это фича или я где-то недочитал доку?

1cpp v 3.0.1.21
  
Наверх
ICQ  
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #1 - 03. Апреля 2009 :: 11:41
Печать  
Насколько я понимаю, метод "СтатусВозврата" применим только в предопределенных процедурах, в которых можно отменить соответствующее "событие", а в данном случае это просто метод класса.

Наверное стоит сделать как то так:
Код
Выбрать все
Есть Документ

Процедура ОбработкаПроведения()

   ....
   СтатусВозврата(МойКОП.Провести());

КонецПроцедуры

в МойКОП

Функция Провести()
    ....
     Если Что-то Тогда
         Возврат 0;
    КонецЕсли;

    Возврат 1;
КонецФункции 

  
Наверх
 
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #2 - 03. Апреля 2009 :: 11:53
Печать  
Разве так?

в не в Коп"е такое прокатит -
статусВозврата устанавливается при вызове предопределенной
процедуры и если внутри кокай-нить вложенной процедуры
установить СтатусВозврата(0) - то исходная предопр. процедура
"увидит" его как 0
  
Наверх
ICQ  
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #3 - 03. Апреля 2009 :: 12:06
Печать  
ну может быть, но у меня так в перехватчике сделано и все работает Улыбка
  
Наверх
 
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #4 - 03. Апреля 2009 :: 12:15
Печать  
CaBaT писал(а) 03. Апреля 2009 :: 11:41:
Код
Выбрать все
   ....
   СтатусВозврата(МойКОП.Провести());

 



так наверное не совсем точно
в общем случае надо
Код
Выбрать все
   ....

   Если МойКОП.Провести()=0 Тогда СтатусВозврата(0); КонецЕсли;

 

  
Наверх
ICQ  
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #5 - 03. Апреля 2009 :: 13:03
Печать  
не понял, а в чем принципиальная разница?
у меня именно так и все отлично работает Улыбка
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #6 - 03. Апреля 2009 :: 13:06
Печать  
вот что написано в хелпе:

СтатусВозврата(<?>)
Синтаксис:
СтатусВозврата(<Статус>)
Назначение:
Определение или установка статуса возврата предопределенной процедуры.
Возвращает:
1, если статус возврата - Выполнить Действие;
0, если статус возврата - Отменить Действие.
Параметры:
<Статус> - необязательный параметр:
если опущен, то установка статуса возврата предопределенной процедуры не меняется;
если задано 1, то устанавливается статус возврата - Выполнить Действие;
если задано 0, то устанавливается статус возврата - Отменить Действие.
Замечание:
Функция/процедура СтатусВозврата применяется в теле предопределенных процедур.
Начальное значение статуса возврата предопределенной процедуры равно 1 - Выполнить Действие, устанавливается системой при вызове предопределенной процедуры.
Подробнее см. в документации, глава 'Системные процедуры и функции'
  
Наверх
 
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #7 - 03. Апреля 2009 :: 13:33
Печать  
Разница в том,
если где-то раньше устанавливается СтатусВозврата(0)

то при СтатусВозврата(МойКоп.Провести())

СтатусВозврата можно ошибочно привести обратно в 1
  
Наверх
ICQ  
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #8 - 03. Апреля 2009 :: 13:34
Печать  
и все равно вопрос остается открытым - передается ли из КОП статусВозврата в вызывающую предопределенную процедуру
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #9 - 06. Апреля 2009 :: 09:36
Печать  
sashas09 писал(а) 03. Апреля 2009 :: 13:34:
и все равно вопрос остается открытым - передается ли из КОП статусВозврата в вызывающую предопределенную процедуру

Давай закроем - статус возврата из КОП в вызывающий модуль не передается!
Проблема в том, что
1. у 1С внутри для каждого программного модуля задается свой программный статус возврата, а КОП также является отдельным модулем
2. СтатусВозврата, используемый в 1С, это неявный возврат данных, что может приводить и приводит к неявному коду Печаль

В 1С++ принято решение не использовать подобную неявную схему возврата данных. Используйте код возврата, непосредственно возвращаемый функций - Возврат 1/0.

ЗЫ из-за специфических особенностей работы Перехватчика статус возврата автоматически преобразуется из функций/процедур обработчиков.
Для обычного КОП, как я уже написал, подобного преобразования нет и никогда не будет.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #10 - 06. Апреля 2009 :: 09:38
Печать  
CaBaT писал(а) 03. Апреля 2009 :: 11:41:
Код
Выбрать все
[highlight]СтатусВозврата(МойКОП.Провести()); 



sashas09 писал(а) 03. Апреля 2009 :: 12:15:
в общем случае надо
Код
Выбрать все
Если МойКОП.Провести()=0 Тогда СтатусВозврата(0); КонецЕсли; 



Подытожу - оба вариант применимы, но последний в общем случае более точен, конечно Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #11 - 06. Апреля 2009 :: 09:43
Печать  
artbear писал(а) 06. Апреля 2009 :: 09:36:
sashas09 писал(а) 03. Апреля 2009 :: 13:34:
и все равно вопрос остается открытым - передается ли из КОП статусВозврата в вызывающую предопределенную процедуру

Давай закроем - статус возврата из КОП в вызывающий модуль не передается!
Проблема в том, что
1. у 1С внутри для каждого программного модуля задается свой программный статус возврата, а КОП также является отдельным модулем
2. СтатусВозврата, используемый в 1С, это неявный возврат данных, что может приводить и приводит к неявному коду Печаль

В 1С++ принято решение не использовать подобную неявную схему возврата данных. Используйте код возврата, непосредственно возвращаемый функций - Возврат 1/0.

ЗЫ из-за специфических особенностей работы Перехватчика статус возврата автоматически преобразуется из функций/процедур обработчиков.
Для обычного КОП, как я уже написал, подобного преобразования нет и никогда не будет.


а как же глобальный модуль?
из него в модуль документа - передается Статус
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #12 - 06. Апреля 2009 :: 09:56
Печать  
Неа, не так все происходит Улыбка
При возврате из глобальника 1С устанавливает флаг возврата в глобальном модуле, а уж потом в модуле документа, после получения управления от глобальника, проверяет статус возврата глобальника и выполняет спец.действия в зависимости от этого кода.
Т.е. для КОП такой вариант не очень подойдет.

Но все равно основные причины смотрите выше, они важнее Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #13 - 06. Апреля 2009 :: 11:22
Печать  
sashas09 писал(а) 03. Апреля 2009 :: 12:15:
CaBaT писал(а) 03. Апреля 2009 :: 11:41:
Код
Выбрать все
   ....
   СтатусВозврата(МойКОП.Провести());

 



так наверное не совсем точно
в общем случае надо
Код
Выбрать все
   ....

   Если МойКОП.Провести()=0 Тогда СтатусВозврата(0); КонецЕсли;

 



Не, господа, ну есть же ВыброситьИсключение.
Самое красивое:

Код
Выбрать все
Попытка
.... Действия по проведению ...
Исключение
    СтатусВозврата(0);
КонецПопытки
 


И в копах не париться с возвращаемыми значениями и статусом возврата.

Ошибка?
Кинь исключение.
  
Наверх
 
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #14 - 06. Апреля 2009 :: 11:30
Печать  
orefkov писал(а) 06. Апреля 2009 :: 11:22:
Ошибка? Кинь исключение.


Блин, красивое неочевидно...

Буду ща пробовать
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #15 - 06. Апреля 2009 :: 11:45
Печать  
В отличии от СтатусаВозврата, исключения очень замечательно передаются между копами и модулями.
Эту мульку помню делал лично, когда еще 1С++ не было в исходниках, патчил что-то там в deb'овском коде.
Так вот и получил потом доступ к телу, таксать.
Эх, молодость, молодость...
  
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #16 - 06. Апреля 2009 :: 11:49
Печать  
sashas09 писал(а) 06. Апреля 2009 :: 11:30:
orefkov писал(а) 06. Апреля 2009 :: 11:22:
Ошибка? Кинь исключение.


Блин, красивое неочевидно...

Буду ща пробовать

попытка, по времени дольше работает  Нерешительный
  
Наверх
 
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #17 - 06. Апреля 2009 :: 11:53
Печать  
PVR писал(а) 06. Апреля 2009 :: 11:49:
sashas09 писал(а) 06. Апреля 2009 :: 11:30:
orefkov писал(а) 06. Апреля 2009 :: 11:22:
Ошибка? Кинь исключение.


Блин, красивое неочевидно...

Буду ща пробовать

попытка, по времени дольше работает  Нерешительный


ну а труды по протаскиванию через процедуры/функции
нужного статуса?
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #18 - 06. Апреля 2009 :: 12:44
Печать  
PVR писал(а) 06. Апреля 2009 :: 11:49:
попытка, по времени дольше работает  Нерешительный


Не факт.
Во-первых - Попытка одна - в самой внешней функции, зато не надо кучи
Если ВызовМетода() = 0 Тогда

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

  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #19 - 07. Апреля 2009 :: 08:28
Печать  
Да, для проведения документа вариант с исключением не нарушает идеологии работы - возникла ошибки, выбросим ее наружу без спец.проверок.
Как раз блок попытка-исключение и не нужен в этом случае.

Но для других событий вариант с исключением ИМХО не так целесообразен.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 855
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Работает ли СтатусВозврата(0) в КОПе ?
Ответ #20 - 25. Января 2013 :: 12:37
Печать  
Здесь всё обсуждалось об установке СтатусаВозврата в классе и передаче этого значения в предопределенную процедуру. Это не работает. Как лечить - понятно.

А что делать, если нужно получить СтатусВозврата в классе? Т.е. просто вызвав СтатусВозрата()?

Сейчас этот метод в классе возвращает лабуду типа 75532848.

Почему спрашиваю.
В классе КрасиваяКнопка пытаюсь выполнить формулу, что прописана в кнопке. Для обработки формулы типа "#Записать Провести" приходится вызывать ПриЗаписи() через ВыполняемыйМодуль. Но, чтобы корректно отрабатывать следующие действия нужно как раз отследить СтатусВозврата. Если он =1, то делаем следующие действия директивы. И тут такая засада со СтатусомВозврата....

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать