|
Правильная организация и сокращение кода | ☑ | ||
---|---|---|---|---|
0
ktibo
13.11.18
✎
04:26
|
Всем привет! В типовой ЗУП 3.1 делаю большую обработку по преобразованию одних видов документов в другие (задачу поставили). Хочу на каждых этапах преобразования возвращать понятное сообщение в случае ошибки.
Для этого обернул все алгоритмы в функции, которые возвращают Истину, если все прошло ОК, либо строку с текстом ошибки. Функции могут быть вложенными. Получилось что-то типа такого: Функция ЗаполнитьДокумент (ОбъектОригинал, ОбъектКопия) СтруктураПериодОтпуска = Неопределено; Результат = ЗаполнитьПериодОтпуска(СтруктураПериодОтпуска); Если Результат <> Истина Тогда Возврат Результат; КонецЕсли; Результат = ЗаполнитьКопиюСотрудника(ОбъектОригинал.Сотрудник, ОбъектКопия.Сотрудник); Если Результат <> Истина Тогда Возврат Результат; КонецЕсли; Возврат Истина; КонецФункции На лицо повторение кода. Скорей всего, я изначально неправильно подошел к задаче. Как сделать правильно? |
|||
1
Bigbro
13.11.18
✎
04:57
|
я бы предложил не вываливать первую попавшуюся ошибку. а собирать все ошибки в табличку и потом выдавать все хором.
понятно что часть из них будут одна из-за другой происходить. но часть могут быть вполне себе независимыми. и чтобы не лазить сотню раз по чайной ложке лучше вывести все ошибки сразу. |
|||
2
ktibo
13.11.18
✎
05:07
|
(1) Я тоже об этом думал, но проблема в том, что иногда алгоритм не может продолжаться дальше, если ранее уже возникла ошибка. Поэтому копить ошибки не выйдет, нужно сразу возврат делать.
|
|||
3
Krabb
13.11.18
✎
05:09
|
Если НЕ ЗаполнитьПериодОтпуска(СтруктураПериодОтпуска) Тогда
Возврат Ложь; ИначеЕсли НЕ ЗаполнитьКопиюСотрудника(ОбъектОригинал.Сотрудник, ОбъектКопия.Сотрудник) Тогда Возврат Ложь; Иначе Возврат ИСтина; КонецЕсли |
|||
4
Krabb
13.11.18
✎
05:31
|
И, кстати, имей в виду что строки при проверке на булево преобразуются в истину. Поэтому если нужен текст ошибки, то я бы возвращал структуру в которой будет булевный ключ, например "Результат" и строковый "Описание ошибки"
|
|||
5
ktibo
13.11.18
✎
05:33
|
(3) ну как вариант
|
|||
6
ktibo
14.11.18
✎
09:57
|
В итоге сделал с помощью ВызватьИсключение. Оно автоматически и прекращает дальнейшую работу, и можно обработать ошибку.
|
|||
7
El_Duke
гуру
14.11.18
✎
10:38
|
(0) >>делаю большую обработку по преобразованию одних видов документов в другие (задачу поставили)
А можно озвучить эту задачу ? Больно уж любопытно стало в чем её практический смысл |
|||
8
Buster007
14.11.18
✎
11:09
|
(3) потом у тебя будет миллион "если"...
|
|||
9
Buster007
14.11.18
✎
11:23
|
+(8) я бы прикинул как-нибудь так:
список действий ошибки в списке действий перечисляешь все, что надо выполнить в каждой процедуре обработчике проверяешь, надо ли выполнять действие дабы исключить дублирование кода, можно вызывать обработчик рекурсивно Пример Процедура ОбработатьШаг(Действия, Ошибки) Если ЕстьКритичныеОшибки(Ошибки) Или Действия.Количество() = 0 Тогда Возврат; КонецЕсли; ВыполнитьДействие(Действия[0], Ошибки); Действия.Удалить(Действия[0]); ОбработатьШаг(Действия, Ошибки); КонецПроцедуры Процедура ВыполнитьДействие(Действие, Ошибки) выполнитьОперациюБлабла1(Действие, Ошибки); … выполнитьОперациюБлаблаN(Действие, Ошибки); КонецПроцедуры Процедура выполнитьОперациюБлабла1(Действие, Ошибки) Если Не Действие = "Блабла1" Тогда Возврат; КонецЕсли; … // не смогли обработать Ошибки.Добавить("Блабла1", ОписаниеОшибки()); КонецПроцедуры Имена процедур сам придумаешь ) |
|||
10
Малыш Джон
14.11.18
✎
11:43
|
(0)
1. Заведи структуру с инфой по ошибке: ИнфаПоОшибке = Новый Структура("Отказ, ТекстОшибки", Ложь, ""); 2. В каждую вызываемую процедуру передавай эту структуру. В этих процедурах: а) в начале процедуры ставь условие Если ИнфаПоОшибке.Отказ Тогда Возврат; КонецЕсли; б) в местах где происходит ошибка: ИнфаПоОшибке.Отказ = Истина; ИнфаПоОшибке.ТекстОшибки = "подходящий ситуации текст ошибки"; 3. В конце основной процедуры: Если ИнфаПоОшибке.Отказ Тогда Сообщить(ИнфаПоОшибке.ТекстОшибки); КонецЕсли; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |