Получить признак отказа при проведении документа

1. Arkadag 21.09.20 14:48 Сейчас в теме
Приветствую, Форумчане!
1с8.3.12, самопис, УФ

Имеется некая процедура "ВыполнитьВсякуюЕрунду", в которой помимо прочего есть процедура создания документа
СоздатьДокументПеремещениеТМЦ();


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

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

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


выясняется, что проведение невозможно, т.е. получен отказ, запретить выполнение дальнейших операций в процедуре
"ВыполнитьВсякуюЕрунду"
По теме из базы знаний
Найденные решения
2. user5300 1000 21.09.20 14:50 Сейчас в теме
ПеремещениеТМЦ.Заполнить(Объект.Ссылка);        

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

Если НЕ ПеремещениеТМЦ.Проведен Тогда
     Сообщить("Не проведен!");
     Возврат;
Конецесли;

Показать
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. user5300 1000 21.09.20 14:50 Сейчас в теме
ПеремещениеТМЦ.Заполнить(Объект.Ссылка);        

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

Если НЕ ПеремещениеТМЦ.Проведен Тогда
     Сообщить("Не проведен!");
     Возврат;
Конецесли;

Показать
3. Азбука Морзе 104 21.09.20 14:56 Сейчас в теме
Попытка
... Записать()
Исключение
Возврат
КонецПопытки;
4. Release 21.09.20 15:05 Сейчас в теме
(3) Если при записи происходит исключение, то выполнение кода дальше и так не пойдет. Видимо, у автора топика исключение при отказе проведения не происходит.
5. FatPanzer 21.09.20 15:08 Сейчас в теме
(4) Да ладно? Именно для этого Попытка и придумана, чтобы даже в случае исключения код продолжал работать.
6. Release 21.09.20 15:15 Сейчас в теме
(5) Да, ну! Что правда? Обязательно запишу.
Из (1):
Как можно добится, чтобы если при создании этого документа выясняется, что проведение невозможно, т.е. получен отказ, запретить выполнение дальнейших операций в процедуре
"ВыполнитьВсякуюЕрунду"
7. FatPanzer 21.09.20 15:16 Сейчас в теме
(6) Отказ и Исключение - это разные вещи.
8. Release 21.09.20 15:17 Сейчас в теме
(7) В (3) решение для исключения.
И да, спасибо за "разные вещи", тоже запишу.
9. FatPanzer 21.09.20 15:21 Сейчас в теме
(8) И что? Вы же утверждаете, что "Если при записи происходит исключение, то выполнение кода дальше и так не пойдет." Вот я и хочу у вас узнать - вы правда утверждаете, что в случае исключения исполнение кода дальше не пойдет, и оператор Сообщить не подлежит исполнению?
Попытка
    ... Записать();
Исключение
КонецПопытки;
Сообщить("СтатусПроведения");
11. Release 21.09.20 15:24 Сейчас в теме
(9) Я утверждаю, что Попытка сама по себе лишняя, т.к. и без нее при исключении выполнение кода дальше не пойдет. Что и требуется автору темы, судя из (1). А если, этого не происходит, то решение предложенное в (3) в корне неверно и результата не даст, в отличие от решения в (2).
19. FatPanzer 21.09.20 15:41 Сейчас в теме
(11) Что вы подразумеваете под исключением все же? Давайте разберемся в терминах, раз уж так.
Исключение - это ошибка, генерируемая платформой при выполнении той или иной операции.
Отказ - переменная, с помощью которой разработчик может программно управлять течением транзакции.
Так?
23. Release 21.09.20 16:19 Сейчас в теме
(19) По поводу исключения возражений нет. Разве что, можно добавить, что исключение можно вызвать программно.
Отказ - это переменная, которая может использоваться по разному, в зависимости от контекста (в том числе и для указанного вами). Я бы охарактеризовал так.
И что дальше? Какая разница, что представляет из себя Отказ?
Речь шла только об исключении, т.к. первоначально мое замечание в (4) касалось именно Попытки, которая используется для обработки исключений и, соответственно, возможности продолжить дальнейшее исполнение кода. В то время, как автору темы нужно было как раз обратное, т.е. исключить дальнейшее выполнение кода. По этому, я и предположил, что исключение у автора в упомянутом коде не происходит. Об этом я написал в (4) в ответ на (3), что его предложение решения без установки флага возникновения ошибки в обработке исключения и дальнейшей проверке этого флага абсолютно бессмысленно и приведет к обратному или нулевому эффекту.
Что еще тут можно обсуждать? Разжевал подробно, как только смог.
10. Азбука Морзе 104 21.09.20 15:22 Сейчас в теме
(7) в рамках конкретной задачи - одно и тоже
12. FatPanzer 21.09.20 15:27 Сейчас в теме
(10) Да нет. Автор пишет про "получен отказ (не хватает остатков и прочее)", А исключение может быть еще и по причине отстутствия данных для записи регистров (платформа не дает записать движения), например.
16. Азбука Морзе 104 21.09.20 15:31 Сейчас в теме
(12) то есть отказа нет, не документ почему-то не записан, а признак Проведен остался от старой версии = Истина. Так что ли?)
17. FatPanzer 21.09.20 15:37 Сейчас в теме
(16) Отказ есть. Автор прямо про это пишет. Не понимаю, почему вы докопались до исключения.
18. Азбука Морзе 104 21.09.20 15:40 Сейчас в теме
(17) у автора : Бывают случаи, когда при создании этого документа документ хоть и создается (программно), но не проводится и не сохраняется (не выполняются условия по остаткам товара), выходит соответствующее сообщение, что проведение невозможно...

как вы проверите признак Проведен, если документ не сохранен?
21. FatPanzer 21.09.20 15:44 Сейчас в теме
(18)
как вы проверите признак Проведен, если документ не сохранен?

Я вас удивлю, но я даже не буду пытаться его проверять. Как и все разумные люди.
13. Arkadag 21.09.20 15:27 Сейчас в теме
Применил проверку по
НЕ ПеремещениеТМЦ.Проведен


Правда пришлось переделать процедуру "СоздатьДокументПеремещениеТМЦ()" в функцию
14. user5300 1000 21.09.20 15:28 Сейчас в теме
(13)
Правда пришлось переделать процедуру "СоздатьДокументПеремещениеТМЦ()" в функцию


Почему?
15. Release 21.09.20 15:29 Сейчас в теме
(14) Потому, что запись происходит в СоздатьДокументПеремещениеТМЦ(), а проверка нужна в ВыполнитьВсякуюЕрунду().
user5300; +1 Ответить
20. nomad_irk 71 21.09.20 15:42 Сейчас в теме
(15)Что мешало у процедуры сделать один из параметров выходным?

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

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

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

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


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

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

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

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

..........

КонецПроцедуры
Показать
FatPanzer; +1 Ответить
22. FatPanzer 21.09.20 15:49 Сейчас в теме
(20) Классика! Все бы так писали...
24. Release 21.09.20 16:29 Сейчас в теме
(20) (22) Как по мне, это плохой подход, т.к. такое объявление абсолютно не интуитивно. Имеется ввиду, что объявляемый параметр не дает понять, что в нем возвращается результат выполнения. В то время как использование функции с именем СоздатьДокументПеремещениеТМЦ() будет более-менее явно указывать, что возвращаемый результат является результатом успешного ее выполнения.

Добавлю еще, что все параметры объявленные без ключевого слова "Знач", все, де-факто, являются выходными. Что может приводить к непредсказуемым результатам, если в коде случайно или намеренно их значения меняются.
25. nomad_irk 71 21.09.20 16:42 Сейчас в теме
(24)ну епт.....Назовите вы его ВыходнойПараметр и работайте с ним только как с выходным параметром и никак иначе.
Или еще тупее: сделайте несколько параметров, один из которых будет сигнализировать об ошибке при проведении документа.
26. Release 21.09.20 16:56 Сейчас в теме
(25) Мне не понятна тяга к усложнению. Функции не просто так придумали, "чтобы были". На низком уровне выполнения функций как таковых не сущестувет.
Зачем использовать возвращаемый параметр, если это исключит возможность записи:
Если НекаяФункция() = Значение Тогда

Как усложнился бы в записи любой код, если бы вместо функций предоставляемых платформой были только процедуры с выходными параметрами?
СтрДлина();
Символ()Цел();
Окр();
ТекущаяДата();
НачалоДня();
...

и десятки других.
Для примера предлагаю записать код ниже, через процедуры с выходными параметрами:
КонецПериода=?(КонецПериода=Дата(1,1,1),КонецГода(ТекущаяДата()),КонецПериода)
28. nomad_irk 71 21.09.20 17:07 Сейчас в теме
(26)Т.е. городить функцию, которая записывает и проводит документ, при этом не понятно, что должна вернуть по результату своего выполнения - это тяга к упрощению? Хорошо, пусть будет так.

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

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

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

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

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

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

КонецПроцедуры
Показать


В чем сложности с кодом через процедуры с входными параметрами?
30. Release 21.09.20 17:21 Сейчас в теме
(28) Это что уход от ответа?
Я просил заменить все функции используемые в предложенной строке кода на процедуры с возвращаемыми параметрами.
И переписать код строки без использования функций, а не оборачивание предложенной строки в процедуру.
Т.е., для непонятливых, нужно в вышеуказанной строке заменить все функции: Дата(), КонецГода(), ТекущаяДата(), на аналогичные процедуры.
31. nomad_irk 71 21.09.20 17:24 Сейчас в теме
(30)Т.е. вы решили конкурс идиотии устроить? Извините, участвовать не буду.
32. Release 21.09.20 17:27 Сейчас в теме
(31) Это вы такое предлагаете: использовать процедуры, там где очевидно использовать функции, просто потому, что это можно сделать. А я доказываю обратное.
33. nomad_irk 71 21.09.20 17:31 Сейчас в теме
(32) Т.е. просто потому что использование процедур вместо функций как-то не укладывается в вашу "религию", мне теперь доказывать, что использование процедур вместо функций в некоторых ситуациях - не только можно, но и необходимо и это не является идиотством?
По-мне, я это доказал своим сообщением с приведенным кодом. Если вам этот код не нравится по каким-то сугубо личным параметрам - я не виноват.
37. Release 21.09.20 18:09 Сейчас в теме
(33) Это в вашей "религии" вы поклоняетесь процедурам, в обход функциям. Доказательство этому как раз в этой теме: было конкретное решение с функцией, но вам захотелось "вывернуться" и предложить процедуру, хотя профита от этого показано не было. Поэтому, не вижу смысла продолжать дискуссию. Хотите молиться на процедуры, молитесь.

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

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

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

(36) Если вы меня называете ТС, то это ошибка. И не надо мне приписывать собственные утверждения.
35. FatPanzer 21.09.20 17:34 Сейчас в теме
(32) Можно поинтересоваться, а вот это функция или процедура? Раз уж мы перешли к платформенным методам, а не к программируемым...
Структура (Structure)
Свойство (Property)
Синтаксис:
Свойство(<Ключ>, <НайденноеЗначение>)
Параметры:
<Ключ> (обязательный)
Тип: Строка.
Ключ для поиска свойства.
<НайденноеЗначение> (необязательный)
Тип: Произвольный.
В данный параметр возвращается найденное значение. Если ключа нет в структуре, то возвращается Неопределено.
Возвращаемое значение:
Тип: Булево.
Истина - ключ найден; Ложь в противном случае.
Описание:
Получает значение элемента по указанному имени, а также проверяет, имеется ли указанное свойство.
Показать


ЗначениеСвойства = Неопределено;
ЕстьТакоеСвойство = НекаяСтруктура.Свойство("ИмяСвойства", ЗначениеСвойства);
36. nomad_irk 71 21.09.20 17:40 Сейчас в теме
(35)Кстати да, программируемые функции с выходными параметрами - это вообще, однако, сущей ересью считается у оратора Release.
27. FatPanzer 21.09.20 16:58 Сейчас в теме
(24)
если в коде случайно или намеренно их значения меняются.

Если уж на то пошло, то случайно или намеренно можно из объявления параметров удалить литерал "Знач".
Это все вопрос рукожопости разработчика и его понимания, зачем он этот параметр передает в функцию и как собирается его использовать. А уже потом идут вопросы безопасности, использования оперативной памяти и проч.
29. Release 21.09.20 17:16 Сейчас в теме
(27) Вот из-за таких "руко...", которые не используют "Знач" (применительно к 1С, для других языков другие ключевые слова), а не случайно его удалили, и происходят вещи, которые портят многим нервы, а иногда и самому автору кода.
Какова вероятность запортить передаваемое значение при случайно удаленном значении и не ставя его из принципа?
А при совместной разработке, когда один написал процедуру/функцию, а другой ее использует. И вообще может не быть доступа к исходнику вызываемого метода и не понятно может он там изменится или нет. Использование "Знач" поможет избежать возможных проблем из-за любых "рукожопов", которые дальше будут изменять (сопровождать) код. Но большинству лень набирать в коде "лишнее", немного увеличивая время кодинг. Потому и забивают.
Чем, в том числе, в неких случаях пользуются хакеры.
Да, это не столь важно в применении к разработке на платформе 1С, но "хороший" код, вроде как, никому репутацию не портил.
34. SlavaKron 21.09.20 17:32 Сейчас в теме
(29) Если контекст выполнения общий, не вижу смысла копировать объекты в памяти.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)