Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Правильная организация и сокращение кода

Правильная организация и сокращение кода
Я
   ktibo
 
13.11.18 - 04:26
Всем привет! В типовой ЗУП 3.1 делаю большую обработку по преобразованию одних видов документов в другие (задачу поставили). Хочу на каждых этапах преобразования возвращать понятное сообщение в случае ошибки.

Для этого обернул все алгоритмы в функции, которые возвращают Истину, если все прошло ОК, либо строку с текстом ошибки.
Функции могут быть вложенными.

Получилось что-то типа такого:

Функция ЗаполнитьДокумент (ОбъектОригинал, ОбъектКопия)

    СтруктураПериодОтпуска = Неопределено;

    Результат = ЗаполнитьПериодОтпуска(СтруктураПериодОтпуска);
    Если Результат <> Истина Тогда
        Возврат Результат;
    КонецЕсли;

Результат = ЗаполнитьКопиюСотрудника(ОбъектОригинал.Сотрудник, ОбъектКопия.Сотрудник);
    Если Результат <> Истина Тогда
        Возврат Результат;
    КонецЕсли;
    
    Возврат Истина;
    
КонецФункции


На лицо повторение кода. Скорей всего, я изначально неправильно подошел к задаче. Как сделать правильно?
 
 
   Bigbro
 
1 - 13.11.18 - 04:57
я бы предложил не вываливать первую попавшуюся ошибку. а собирать все ошибки в табличку и потом выдавать все хором.
понятно что часть из них будут одна из-за другой происходить. но часть могут быть вполне себе независимыми. и чтобы не лазить сотню раз по чайной ложке лучше вывести все ошибки сразу.
   ktibo
 
2 - 13.11.18 - 05:07
(1) Я тоже об этом думал, но проблема в том, что иногда алгоритм не может продолжаться дальше, если ранее уже возникла ошибка. Поэтому копить ошибки не выйдет, нужно сразу возврат делать.
   Krabb
 
3 - 13.11.18 - 05:09
Если НЕ ЗаполнитьПериодОтпуска(СтруктураПериодОтпуска) Тогда
    Возврат Ложь;
ИначеЕсли НЕ ЗаполнитьКопиюСотрудника(ОбъектОригинал.Сотрудник, ОбъектКопия.Сотрудник) Тогда
    Возврат Ложь;
Иначе
    Возврат ИСтина;
КонецЕсли
   Krabb
 
4 - 13.11.18 - 05:31
И, кстати, имей в виду что строки при проверке на булево преобразуются в истину. Поэтому если нужен текст ошибки, то я бы возвращал структуру в которой будет булевный ключ, например "Результат" и строковый "Описание ошибки"
   ktibo
 
5 - 13.11.18 - 05:33
(3) ну как вариант
   ktibo
 
6 - 14.11.18 - 09:57
В итоге сделал с помощью ВызватьИсключение. Оно автоматически и прекращает дальнейшую работу, и можно обработать ошибку.
   El_Duke
 
7 - 14.11.18 - 10:38
(0) >>делаю большую обработку по преобразованию одних видов документов в другие (задачу поставили)

А можно озвучить эту задачу ?
Больно уж любопытно стало в чем её практический смысл
   Buster007
 
8 - 14.11.18 - 11:09
(3) потом у тебя будет миллион "если"...
   Buster007
 
9 - 14.11.18 - 11:23
+(8) я бы прикинул как-нибудь так:
список действий
ошибки

в списке действий перечисляешь все, что надо выполнить
в каждой процедуре обработчике проверяешь, надо ли выполнять действие

дабы исключить дублирование кода, можно вызывать обработчик рекурсивно

Пример
Процедура ОбработатьШаг(Действия, Ошибки)

Если ЕстьКритичныеОшибки(Ошибки)
 Или Действия.Количество() = 0 Тогда
Возврат;
КонецЕсли;

ВыполнитьДействие(Действия[0], Ошибки);
Действия.Удалить(Действия[0]);

ОбработатьШаг(Действия, Ошибки);

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

Процедура ВыполнитьДействие(Действие, Ошибки)

выполнитьОперациюБлабла1(Действие, Ошибки);
…
выполнитьОперациюБлаблаN(Действие, Ошибки);

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

Процедура выполнитьОперациюБлабла1(Действие, Ошибки)

Если Не Действие = "Блабла1" Тогда
Возврат;
КонецЕсли;

…
// не смогли обработать

Ошибки.Добавить("Блабла1", ОписаниеОшибки());

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

Имена процедур сам придумаешь )
   Малыш Джон
 
10 - 14.11.18 - 11:43
(0)
1. Заведи структуру с инфой по ошибке:
ИнфаПоОшибке = Новый Структура("Отказ, ТекстОшибки", Ложь, "");
2. В каждую вызываемую процедуру передавай эту структуру. В этих процедурах:
  а) в начале процедуры ставь условие
     Если ИнфаПоОшибке.Отказ Тогда
       Возврат;
     КонецЕсли;
  б) в местах где происходит ошибка:
     ИнфаПоОшибке.Отказ = Истина;
     ИнфаПоОшибке.ТекстОшибки = "подходящий ситуации текст ошибки";
3. В конце основной процедуры:
   Если ИнфаПоОшибке.Отказ Тогда
     Сообщить(ИнфаПоОшибке.ТекстОшибки);
   КонецЕсли;
 
 Рекламное место пустует

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует