Имя: Пароль:
1C
1С v8
Правильная организация и сокращение кода
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. В конце основной процедуры:
   Если ИнфаПоОшибке.Отказ Тогда
     Сообщить(ИнфаПоОшибке.ТекстОшибки);
   КонецЕсли;
Независимо от того, куда вы едете — это в гору и против ветра!