О бедном Goto замолвите слово

Среди программистов 1С часто встречаю пренебрежительное отношение к оператору Goto. Оно связано с плохой репутацией этого оператора. Раньше, когда еще не были выработаны принципы программирования, оператор Goto часто запутывал код, превращал его в лапшевидный, в котором было бы сложно разобраться.

Однако в настоящее время оператор Goto сохранен в языке 1С. По сути, он как бы скрашивает несовершенство языка, примерно как бесконечный цикл Пока (истина) служит заменой цикла Do … Until.

Рассмотрим случаи, когда его можно использовать в стиле хорошего кода.

Вложенные циклы

Если нужно выйти из текущего цикла, есть оператор Прервать, а вот если нужно выйти из всех циклов, можно использовать оператор Goto. Такое решение намного понятнее и прозрачнее, чем альтернатвы, когда в каждом цикле проверяется некий флаг, нужно ли его продолжать.

Для А = 1 По 10 Цикл
  Для Б = 1 По 20 Цикл
    Если Ошибка Тогда
    	Перейти ~КонецВсехЦиклов;
    КонецЕсли;
  КонецЦикла;
КонецЦикла;
~КонецВсехЦиклов:

Выход из процедуры

Если перед выходом из процедуры нужно сделать какие-либо дейсвтия и их нужно сделать из нескольких мест, можно использовать оператор Goto. Альтернатива — выносить код в процедуру, но иногда эти действия занимают всего несколько строк, поэтому процедура смотрится более громоздко, чем Goto:

Функция Тест()

	Результат = Новый Структура("ОК, Текст", ложь, "");
	
	Если Ошибка1 Тогда Перейти ~ВыходСОшибками;
	Если Ошибка2 Тогда Перейти ~ВыходСОшибками;
	Если Ошибка3 Тогда Перейти ~ВыходСОшибками;
	
	Результат.ОК = истина;
	Возврат Результат;
	
~ВыходСОшибками;

	Результат.Текст = "Произошла ошибка: " + ОписаниеОшибки();
	Возврат Результат;
	
КонецФункции

А вы используете в своей практике оператор Gogo?

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 3

  1. Павел:

    Львиная доля описанного заменяет throw exeption. Но в 1ц бят сношаться со словарями неведомой конструкции

    • приведи пример. Хотя мне кажется, ты просто привязался к частному примеру. На вскидку не помню, но были и другие случаи помимо ошибок, когда нужно было перейти в конец процедуры.
      в 1С есть Попытка-Исключение.

  2. makfromkz:

    <>

    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;

Добавить комментарий для fixin Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *