Приветствую, Форумчане!
1с8.3.12, самопис, УФ

Имеется некая процедура "ВыполнитьВсякуюЕрунду", в которой помимо прочего есть процедура создания документа

```1c
    СоздатьДокументПеремещениеТМЦ();
```

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

Как можно добится, чтобы если при создании этого документа

```1c
    ПеремещениеТМЦ.Заполнить(Объект.Ссылка);
    ПеремещениеТМЦ.Записать(РежимЗаписиДокумента.Проведение);
```

выясняется, что проведение невозможно, т.е. получен отказ, запретить выполнение дальнейших операций в процедуре
"ВыполнитьВсякуюЕрунду"
---
```1c
    ПеремещениеТМЦ.Заполнить(Объект.Ссылка);

    ПеремещениеТМЦ.Записать(РежимЗаписиДокумента.Проведение);

    Если НЕ ПеремещениеТМЦ.Проведен Тогда
    Сообщить("Не проведен!");
    Возврат;
    Конецесли;
```
---
```1c
    ПеремещениеТМЦ.Заполнить(Объект.Ссылка);

    ПеремещениеТМЦ.Записать(РежимЗаписиДокумента.Проведение);

    Если НЕ ПеремещениеТМЦ.Проведен Тогда
    Сообщить("Не проведен!");
    Возврат;
    Конецесли;
```
---
Попытка
   ... Записать()
Исключение
   Возврат
КонецПопытки;
---
Если при записи происходит исключение, то выполнение кода дальше и так не пойдет. Видимо, у автора топика исключение при отказе проведения не происходит.
---
Да ладно? Именно для этого Попытка и придумана, чтобы даже в случае исключения код продолжал работать.
---
Да, ну! Что правда? Обязательно запишу.
Из (1):
Как можно добится, чтобы если при создании этого документа выясняется, что проведение невозможно, т.е. получен отказ, запретить выполнение дальнейших операций в процедуре
"ВыполнитьВсякуюЕрунду"
---
Отказ и Исключение - это разные вещи.
---
В (3) решение для исключения.
И да, спасибо за "разные вещи", тоже запишу.
---
И что? Вы же утверждаете, что "Если при записи происходит исключение, то выполнение кода дальше и так не пойдет." Вот я и хочу у вас узнать - вы правда утверждаете, что в случае исключения исполнение кода дальше не пойдет, и оператор Сообщить не подлежит исполнению?

```1c
    Попытка
    ... Записать();
    Исключение
    КонецПопытки;
    Сообщить("СтатусПроведения");
```
---
Я утверждаю, что Попытка сама по себе лишняя, т.к. и без нее при исключении выполнение кода дальше не пойдет. Что и требуется автору темы, судя из (1). А если, этого не происходит, то решение предложенное в (3) в корне неверно и результата не даст, в отличие от решения в (2).
---
Что вы подразумеваете под исключением все же? Давайте разберемся в терминах, раз уж так.
Исключение - это ошибка, генерируемая платформой при выполнении той или иной операции.
Отказ - переменная, с помощью которой разработчик может программно управлять течением транзакции.
Так?
---
По поводу исключения возражений нет. Разве что, можно добавить, что исключение можно вызвать программно.
Отказ - это переменная, которая может использоваться по разному, в зависимости от контекста (в том числе и для указанного вами). Я бы охарактеризовал так.
И что дальше? Какая разница, что представляет из себя Отказ?
Речь шла только об исключении, т.к. первоначально мое замечание в (4) касалось именно Попытки, которая используется для обработки исключений и, соответственно, возможности продолжить дальнейшее исполнение кода. В то время, как автору темы нужно было как раз обратное, т.е. исключить дальнейшее выполнение кода. По этому, я и предположил, что исключение у автора в упомянутом коде не происходит. Об этом я написал в (4) в ответ на (3), что его предложение решения без установки флага возникновения ошибки в обработке исключения и дальнейшей проверке этого флага абсолютно бессмысленно и приведет к обратному или нулевому эффекту.
Что еще тут можно обсуждать? Разжевал подробно, как только смог.
---
в рамках конкретной задачи - одно и тоже
---
Да нет. Автор пишет про "получен отказ (не хватает остатков и прочее)", А исключение может быть еще и по причине отстутствия данных для записи регистров (платформа не дает записать движения), например.
---
то есть отказа нет, не документ почему-то не записан, а признак Проведен остался от старой версии = Истина. Так что ли?)
---
Отказ есть. Автор прямо про это пишет. Не понимаю, почему вы докопались до исключения.
---
у автора : Бывают случаи, когда при создании этого документа документ хоть и создается (программно), но не проводится и не сохраняется (не выполняются условия по остаткам товара), выходит соответствующее сообщение, что проведение невозможно...

как вы проверите признак Проведен, если документ не сохранен?
---
как вы проверите признак Проведен, если документ не сохранен?
Я вас удивлю, но я даже не буду пытаться его проверять. Как и все разумные люди.
---
Применил проверку по

```1c
    НЕ ПеремещениеТМЦ.Проведен
```

Правда пришлось переделать процедуру "СоздатьДокументПеремещениеТМЦ()" в функцию
---
Правда пришлось переделать процедуру "СоздатьДокументПеремещениеТМЦ()" в функцию

Почему?
---
Потому, что запись происходит в СоздатьДокументПеремещениеТМЦ(), а проверка нужна в ВыполнитьВсякуюЕрунду().
---
Что мешало у процедуры сделать один из параметров выходным?

```1c
    Процедура СоздатьДокументПеремещениеТМЦ(ПараметрыСозданияДокумента);

    Документ = Документы.<МойДокумент>.СоздатьДокумент();
    ......

    Попытка
    Документ.Записать(РежимЗаписиДокумента.Проведение)
    ПараметрыСозданияДокумента.Документ = Документ.Ссылка;
    Исключение
    параметрыСозданияДокумента.Ошибка = истина;
    КонецПопытки

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

    Процедура МояПроцедура()

    ПараметрыСозданияДокумента = Новый Структура("Документ, Ошибка", Документы.<МойДокумент>.ПустаяСсылка(), Ложь);
    СоздатьДокументПеремещениеТМЦ(ПараметрыСозданияДокумента);

    Если ПараметрыСозданияДокумента.Ошибка Тогда
    Сообщить("У нас проблемы, Хьюстон!);
    Возврат;
    КонецЕсли;

    Документ = ПараметрыСозданияДокумента.Документ;

    ..........

    КонецПроцедуры
```
---
Классика! Все бы так писали...
---
(22) Как по мне, это плохой подход, т.к. такое объявление абсолютно не интуитивно. Имеется ввиду, что объявляемый параметр не дает понять, что в нем возвращается результат выполнения. В то время как использование функции с именем СоздатьДокументПеремещениеТМЦ() будет более-менее явно указывать, что возвращаемый результат является результатом успешного ее выполнения.

Добавлю еще, что все параметры объявленные без ключевого слова "Знач", все, де-факто, являются выходными. Что может приводить к непредсказуемым результатам, если в коде случайно или намеренно их значения меняются.
---
ну епт.....Назовите вы его ВыходнойПараметр и работайте с ним только как с выходным параметром и никак иначе.
Или еще тупее: сделайте несколько параметров, один из которых будет сигнализировать об ошибке при проведении документа.
---
Мне не понятна тяга к усложнению. Функции не просто так придумали, "чтобы были". На низком уровне выполнения функций как таковых не сущестувет.
Зачем использовать возвращаемый параметр, если это исключит возможность записи:

```1c
    Если НекаяФункция() = Значение Тогда
```

Как усложнился бы в записи любой код, если бы вместо функций предоставляемых платформой были только процедуры с выходными параметрами?

```1c
    СтрДлина();
    Символ()Цел();
    Окр();
    ТекущаяДата();
    НачалоДня();
    ...
```

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

```1c
    КонецПериода=?(КонецПериода=Дата(1,1,1),КонецГода(ТекущаяДата()),КонецПериода)
```
---
Т.е. городить функцию, которая записывает и проводит документ, при этом не понятно, что должна вернуть по результату своего выполнения - это тяга к упрощению? Хорошо, пусть будет так.

```1c
    Процедура УстановитьКонецПериода(КонецПериода)

    КонецПериода=?(КонецПериода=Дата(1,1,1),КонецГода(ТекущаяДата()),КонецПериода);

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

    Процедура МояПроцедура()

    КонецПериода = '00010101';

    УстановитьКонецПериода(КонецПериода);

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

В чем сложности с кодом через процедуры с входными параметрами?
---
Это что уход от ответа?
Я просил заменить все функции используемые в предложенной строке кода на процедуры с возвращаемыми параметрами.
И переписать код строки без использования функций, а не оборачивание предложенной строки в процедуру.
Т.е., для непонятливых, нужно в вышеуказанной строке заменить все функции: Дата(), КонецГода(), ТекущаяДата(), на аналогичные процедуры.
---
Т.е. вы решили конкурс идиотии устроить? Извините, участвовать не буду.
---
Это вы такое предлагаете: использовать процедуры, там где очевидно использовать функции, просто потому, что это можно сделать. А я доказываю обратное.
---
Т.е. просто потому что использование процедур вместо функций как-то не укладывается в вашу "религию", мне теперь доказывать, что использование процедур вместо функций в некоторых ситуациях - не только можно, но и необходимо и это не является идиотством?
По-мне, я это доказал своим сообщением с приведенным кодом. Если вам этот код не нравится по каким-то сугубо личным параметрам - я не виноват.
---
Это в вашей "религии" вы поклоняетесь процедурам, в обход функциям. Доказательство этому как раз в этой теме: было конкретное решение с функцией, но вам захотелось "вывернуться" и предложить процедуру, хотя профита от этого показано не было. Поэтому, не вижу смысла продолжать дискуссию. Хотите молиться на процедуры, молитесь.

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

(34) А я вижу, т.к. это помогает избежать ошибок при длительном сопровождении и множественной вложенности вызовов, когда одна ссылка, например, передается во вложенной последовательности внутрь методов. И когда на каком-то уровне значение вдруг поменялось, то наружу пойдет уже не то значение. И дальше по коду работа пойдет с не тем объектом, с которым предполагалось. А если изменение значения параметра происходит только при определенных специфических условиях, то можно не отследить во время пагубные последствия. Особенно, когда изменения применяются сразу на продуктиве. (Да, так не правильно, но если бы это не использовалось, не добавляли бы динамическое обновление).
Но да, существуют несколько подходов к разработке по первоочередности: экономия памят, безопасность данных и т.д.

(35) Я как раз об этом написал выше.
Ах да, забыл ответ: естественно функция, все что возвращает результат через выражение "= ИмяМетода()", является функцией.
Кстати, может для кого-то будет открытием, но в С/С++, C# вообще нет процедур: процедура это функция, которая всегда возвращает void (для 1С будет Неопределено).

(36) Если вы меня называете ТС, то это ошибка. И не надо мне приписывать собственные утверждения.
---
Можно поинтересоваться, а вот это функция или процедура? Раз уж мы перешли к платформенным методам, а не к программируемым...

```1c
    ЗначениеСвойства = Неопределено;
    ЕстьТакоеСвойство = НекаяСтруктура.Свойство("ИмяСвойства", ЗначениеСвойства);
```
---
Кстати да, программируемые функции с выходными параметрами - это вообще, однако, сущей ересью считается у оратора Release.
---
если в коде случайно или намеренно их значения меняются.
Если уж на то пошло, то случайно или намеренно можно из объявления параметров удалить литерал "Знач".
Это все вопрос рукожопости разработчика и его понимания, зачем он этот параметр передает в функцию и как собирается его использовать. А уже потом идут вопросы безопасности, использования оперативной памяти и проч.
---
Вот из-за таких "руко...", которые не используют "Знач" (применительно к 1С, для других языков другие ключевые слова), а не случайно его удалили, и происходят вещи, которые портят многим нервы, а иногда и самому автору кода.
Какова вероятность запортить передаваемое значение при случайно удаленном значении и не ставя его из принципа?
А при совместной разработке, когда один написал процедуру/функцию, а другой ее использует. И вообще может не быть доступа к исходнику вызываемого метода и не понятно может он там изменится или нет. Использование "Знач" поможет избежать возможных проблем из-за любых "рукожопов", которые дальше будут изменять (сопровождать) код. Но большинству лень набирать в коде "лишнее", немного увеличивая время кодинг. Потому и забивают.
Чем, в том числе, в неких случаях пользуются хакеры.
Да, это не столь важно в применении к разработке на платформе 1С, но "хороший" код, вроде как, никому репутацию не портил.
---
Если контекст выполнения общий, не вижу смысла копировать объекты в памяти.