О бедном Goto замолвите слово
Среди программистов 1С часто встречаю пренебрежительное отношение к оператору Goto. Оно связано с плохой репутацией этого оператора. Раньше, когда еще не были выработаны принципы программирования, оператор Goto часто запутывал код, превращал его в лапшевидный, в котором было бы сложно разобраться.
Однако в настоящее время оператор Goto сохранен в языке 1С. По сути, он как бы скрашивает несовершенство языка, примерно как бесконечный цикл Пока (истина) служит заменой цикла Do … Until.
Рассмотрим случаи, когда его можно использовать в стиле хорошего кода.
Вложенные циклы
Если нужно выйти из текущего цикла, есть оператор Прервать, а вот если нужно выйти из всех циклов, можно использовать оператор Goto. Такое решение намного понятнее и прозрачнее, чем альтернатвы, когда в каждом цикле проверяется некий флаг, нужно ли его продолжать.
Для А = 1 По 10 Цикл Для Б = 1 По 20 Цикл Если Ошибка Тогда Перейти ~КонецВсехЦиклов; КонецЕсли; КонецЦикла; КонецЦикла; ~КонецВсехЦиклов:
Выход из процедуры
Если перед выходом из процедуры нужно сделать какие-либо дейсвтия и их нужно сделать из нескольких мест, можно использовать оператор Goto. Альтернатива — выносить код в процедуру, но иногда эти действия занимают всего несколько строк, поэтому процедура смотрится более громоздко, чем Goto:
Функция Тест() Результат = Новый Структура("ОК, Текст", ложь, ""); Если Ошибка1 Тогда Перейти ~ВыходСОшибками; Если Ошибка2 Тогда Перейти ~ВыходСОшибками; Если Ошибка3 Тогда Перейти ~ВыходСОшибками; Результат.ОК = истина; Возврат Результат; ~ВыходСОшибками; Результат.Текст = "Произошла ошибка: " + ОписаниеОшибки(); Возврат Результат; КонецФункции
А вы используете в своей практике оператор Gogo?
Львиная доля описанного заменяет throw exeption. Но в 1ц бят сношаться со словарями неведомой конструкции
приведи пример. Хотя мне кажется, ты просто привязался к частному примеру. На вскидку не помню, но были и другие случаи помимо ошибок, когда нужно было перейти в конец процедуры.
в 1С есть Попытка-Исключение.
<>
Gogo не видел, а в обфусцированных обработках Goto один из любимейших операторов ))))
вот пример обфусцированного кода:
&НаСервере
procedure ПередЗаписью(a,п988,п989)
var п992;
~0:;
п987=1;
п987=-п987;
п986=1;
п987=п987>=п986;
if п987=false then goto ~ILп987 endif;
goto ~11;
~ILп987:;
goto ~8;
~1:;
п987=0;
п992=п987;
п987=0;