Оператор GOTO в 1С - табу или волшебная палочка?

19.02.23

Разработка - Механизмы платформы 1С

В ежедневной практике программирования на платформе 1С оператор Goto (Перейти) практически не встречается. Не удивительно, что половина специалистов даже не подозревает о существовании данного оператора. Ну, а знающим он внушает ужас, и его стараются избегать. Так что же это за редкий оператор, и для чего он нужен?

Что такое оператор GOTO?

Оператор GOTO - это базовый оператор для управления потоком выполнения кода. Обычно платформа выполняет код в рамках единого блока (модуля, процедура, тело цикла) по очереди - выполнив одну команду, переходит к выполнению следующей. Но если платформа 1С видит оператор GOTO, то после него начинает выполняться строчка в произвольном месте кода, на которую ссылается этот оператор.

Указание новой точки выполнения кода происходит с помощью Меток, численно-буквенных идентификаторов, которые начинаются на символ ~ (тильда). Требования к идентификатору Метки не столь строги, как к прочим идентификаторам, и допускается делать Метки начиная с числа или даже вовсе без букв. Чтобы выполнить пометку строки, перед ней необходимо указать Метку и двоеточие. При вызове оператора GOTO вместе с ним указывается Метка и точка с запятой.

Пока Истина Цикл
	Перейти ~КонецЦикла; // выходим из цикла
	Сообщить("Застрял в бесконечном цикле..."); // никогда не выполнится
КонецЦикла;
~КонецЦикла:
Сообщить("Вышел из цикла!");

Переходы ограничены пределами текущих областей видимости - функциями, процедурами и модулями объектов, в которых применяется оператор GOTO. Т.е. у меток для использования переходов есть только пределы локальной видимости (напомню, что, в отличии от многих языков программирования высоких уровней, в 1С для тела Условий и Циклов нет собственной вложенной области видимости).

С появлением 8.2 появилось новое ограничение - запрещено использовать GOTO в коде управляемых приложений, которые должны выполняться на стороне клиента. Ограничение связано с отсутствием реализации оператора в веб-клиенте.

 

Почему у оператора Goto плохая слава в академической среде?

Изначально в низкоуровневых языках программирования операторы условных и безусловных переходов были единственно доступными операторами управления потоком выполнения. Но с появлением языков программирования высокого уровня появились новые альтернативные и более удобные операторы - Условия и Циклы, с которыми возникла парадигма Структурного Программирования.

Программисты "старой школы", которые уже имели за плечами огромный багаж программирования в машинных кодах и на версиях Ассемблера, с радостью приняли новый "синтаксический сахар", но при этом не отказались от некоторых ранее наработанных алгоритмов на переходах. Использование "не структурных операторов управления" затрудняло понимание и поддержку такого кода молодым поколением программистов, которые никогда ранее не работали с языками низкого уровня. Но было намного хуже, когда эти молодые специалисты видя операторы GOTO у старших товарищей, начинали за ними повторять и активно использовать переходы в своем коде, что должно было продемонстрировать "крутизну", но в результате только превращали их программы в трудно читаемых "монстров" со множеством ошибок. Такой код получил нарицательное прозвище "спагетти-код".

В 1966 году было опубликовано "Доказательство Бема-Якопини", суть которого заключалась в том, что любой алгоритм можно переписать без переходов по меткам на одних только условиях и циклах, хоть это может приводить к существенным потерям в эффективности. В 1968 году голландский ученый Эдсгер Дейкстра, будучи уже известным в ИТ-сообществе после своей публикации алгоритма для поиска кратчайшего пути на графе и после участия в группе разработки компилятора языка Algol, публикует свою статью "О вреде оператора GOTO" (GOTO considered harmful), которая вызвала бурные академические споры. Дейкстра утверждал, что на основе статистического анализа пришел к выводу, что количество ошибок в изученном программном коде прямо пропорционально количеству использованных в тексте программ GOTO и потому предложил радикально улучшить качество программирования введением запрета на данный оператор.

С этого момента начались гонения на оператор GOTO. И запреты на использование оператора часто были настолько фанатично слепы, что за него пришлось публично вступиться таким известным людям как Дональду Кнуту, Брайану Кернигану и Деннису Ритчи, Линусу Торвальдсу, Стиву МакКоннелли и многим другим чуть менее известным. Эти авторитетные люди заявили, что оператор GOTO улучшает скорость, размер и ясность кода программы, но только при разумном использовании разумным программистом.

Любопытные факты. Общеизвестно, что Дейкстра был мало заинтересован в приеме на старшие курсы университета, где он преподавал, студентов со знанием Фортрана по той причине, что вместе с этими знаниями могли привиться дурные привычки программирования. Под дурной привычкой имелось в виду, конечно же, применение GOTO, правила использования которого в Фортране было очень свободным. В результате давления порицанием от научного сообщества в 1978 году в Фортране сначала запретили свободный вход/выход в рамках циклов (до сих пор разрешен в C++), а потом в 1995 запретили почти все прочие варианты переходов.

 

Откуда у оператора GOTO плохая слава в 1С?

Почему с оператором GOTO все не так однозначно в универсальных высокоуровневых языках, на которых до сих пор делают ассемблерные вставки, более-менее понятно. Но почему в сообществе 1С при виде использования оператора перехода начинается настоящая истерика с криками "четвертовать", "сжечь", "повесить", "волчий билет и запрет на программирование"?

Откуда столько негатива? Ведь язык 1С - это DSL, который не предполагает написание сложных алгоритмов, а потому большая часть программистов пишет простые скрипты и скорее всего даже не догадывается про существование GOTO, а остальные просто помнят о его существовании, но при этом превосходно обходятся без него.

Причина №1 - Академический навык. Далеко не все программисты 1С самоучки или свитчеры из финансистов. Есть те, кто окончили кафедры компьютерных наук и из-за событий непреодолимой силы попали в 1С. А гонения на оператор GOTO - это классика современных компьютерных наук. Таким людям на лекциях сказали, что использование GOTO - это плохо. Если они на экзамене смогли воспроизвести данное утверждение, то получали хорошую оценку и закрепляли навык порицания.

Причина №2 - Портирование внешнего кода. Часто при работе с данными в бинарных форматах, драйверами торгового оборудования и с прочими библиотеками, от поставщика есть пример кода, который легко скопировать в 1С и который после этого даже будет работать. Но ради эффективности такой код часто низкоуровневый и содержит множественные GOTO. Если потом неподготовленному человеку потребуется что-то там исправить, то возникает состояние "плачу кровавыми слезами" и кредо "никогда в жизни не буду связываться с GOTO".

Причина №3 - Обфускация кода. Когда хотят затруднить самостоятельное использование кода клиентом и обеспечить дополнительный доход для поддержки, то код запутывают. Есть несколько вариантов запутывания на уровнях исходного кода и байткода, но практически все варианты для затруднения анализа используют множественные GOTO. Когда такой код видят специалисты клиента, то он вызывает высокий уровень раздражения. Когда такой запутанный код работает с ошибками, которые нужно исправить, а "поставщик" исчез, то раздражение возрастает на порядок.

Любопытные факты. На уровне байткода не существуют никаких структурных операторов, а все условия, циклы, обработки ошибок и процедуры с функциями реализованы на условных и безусловных переходах. Т.е.  байткод 1С сильно подобен ассемблеру. Выходит, что изначально для платформы 1С оператор GOTO является "родным", а циклы и условия по своей сути являются "синтаксическим сахаром" для удобства программистов.

 

Когда можно и нужно использовать GOTO в 1С?

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

Так же без GOTO никуда, если вы решили писать собственную версию обфускатора. Но не рекомендую таким заниматься. Во первых, ниша уже занята и у вас практически нет шансов совершить революцию, чтобы потеснить конкурентов и хотя бы отбить затраты на разработку (даже для себя проще купить чужое решение, чем тратить время на разработку). А во вторых, тех, кто обфусцирует собственный код, никто не любит - это может существенно испортить деловую репутацию (кто занимается отраслевыми решениями меня поймут).

Но все же, а какие адекватные причины могут побудить использовать GOTO при написании своего кода? Предлагаю следующий перечень по возрастанию степени ответственности за принятое решение:

 

1. Сложный входящий алгоритм

Не всегда мы придумываем свои алгоритмы самостоятельно, иногда нам ставят задачу просто кодировать согласно чужим "блок-схемам". Это может быть как адаптация "под 1С" чужого кода на универсальном языке программирования. Или это может постановка от пользователя, который именно "так" видит решение. И эти внешние алгоритмы могут содержать переходы в произвольные части кода, которые можно реализовать исключительно с помощью GOTO. Что-то такое:

 

 

Только на схеме маленький и простой вариант, который легко переделать (о переделке еще вспомним в пункте №3). Но представьте, что к вам пришел руководитель кадровой службы и попросил сделать для него мегакрутую штатную расстановку, на которой будет ВСЁ, и в описании которой десятки таких странных "поворотов сюжета".

Вы можете заявить, что такой алгоритм стоит предварительно "причесать" - структурировать, выровнять линии управления, возможно упростить некоторые условия согласно карт Карно. Но хватит ли у вас квалификации и знания предметной области для написания своего алгоритма? А если вам платят только за программирование, то готовы ли несколько вечеров забрать у своей семьи и жить на работе? А как будете поддерживать написанное? А если к вам снова придет заказчик и скажет - "тут ещё работы на 5 минут", просто добавь в этом блоке новое условие под "новый вчера принятый закон" и утром уже должно быть в "проде" или иначе компанию ждут гигантские штрафы, но вы изначально не учли вероятность изменения законов и для вашего нового алгоритма теперь нужна неделя на "всё переписать"?

Если ответственность за создание алгоритма на другом человеке, то чаще лучше не требовать её на себя и не привносить лишние риски на свою "пятую точку". В конце-концов с нами тоже работают профессионалы и их алгоритмы могут являться не результатом безумия, а компромиссом между "понятностью" и "внешними условиями".

 

2. Быстрый выход из вложенных циклов

Мало кто знает, но операторы Прервать (Break) и Продолжить (Continue) - это тоже операторы безусловного перехода, подобные GOTO. Первый совершает переход на скрытую метку после цикла, а второй на окончание цикла перед переходом на следующую итерацию. Для нас это чрезвычайно удобные переходы уже как минимум за счет того, что не нужно явно ставить метки и следить за уникальностью их имен - все происходит автоматически. Но не всегда циклы одноуровневые!

Не очень часто, но все же время от времени нужно писать циклы, где уровней очень много - например, обработка данных с группировкой по периодам, видам контрагентов, самим контрагентам, валютам, договорам, заказам и т.д. И далее предположим, что для нашей бизнес-задачи погашения долгов нужно отобрать из этой древовидной структуры данные на определенную сумму, но с хитрым условием, которое прописали юристы в договоре - нужно возвращать деньги за полные поставки с сортировками сначала по дате заключения заказа, а потом по дате фактического прибытия груза. Лимит по сумме тоже хитрый - поскольку и мы и поставщики транснациональные компании, то долги нужно возвращать в разных валютах и при этом действуют независимые лимиты на уровне валюты (ограничения от банков) и в целом по управленческой валюте (ограничение от своих финансистов).

Как обычно делают такие "прыжки" через несколько уровней цикла? На каждом уровне создаются сигнальные переменные, значение которых проверяем при завершении тела цикла. Если значение переменной изменилось, то прерываем выполнение текущего уровня и переходим к проверке значений переменных выше. Но чем больше уровней, чем сложнее будет логика "возврата" - слишком много таких переменных и блоков кода по их проверке.

 
 Так будет выглядеть подобный код

Хотя намного проще в такой ситуации было бы поставить метки "СледующаяВалюта" и "СледующийКонтрагент".

 
 С метками будет без лишних сущностей и визуально значительно короче

По сути это все еще тот же Прервать, только сразу на нужный нам уровень.

 

3. Отказ от избыточных подпрограмм (процедур).

Как упоминалось ранее, любой алгоритм с GOTO можно переписать в алгоритм с циклами и условиями. Но что мы получим в результате? Давайте рассмотрим простой пример такого преобразования:

 

 

Сразу становится видимой главная проблема - дублирование участков кода. Теперь блок инструкций B вставлен два раза, а блок C - три раза.

Можно так и оставить, но сильно усложняется поддержка - ведь при изменении одного блока, нужно искать его дубликаты и вносить туда аналогичные правки. Автор лично видел очень много подобного дублируемого кода, где "синхронизацией" не заморачивались, что и приводило к проблемам из-за side-effects.

Как известно из теории компьютерных наук, правильным подходом при наличии дублирующих участков является выделение их в отдельные подпрограммы - процедуры, если говорить терминами 1С. Ярким примером, который знаком всем, является расчет стоимости по цене и количеству - алгоритм расчета выносим в отдельную процедуру, которую вызываем не только в рамках текущего алгоритма (например в заполнении по основанию), но и при последующем программировании логики (например в обработчиках изменения количества на форме). При чем для алгоритма не важно, что было передано ему в качестве параметра и он одинаково отработает для табличных частей Товары, Работы, Материалы, Продукция или Полуфабрикаты.

Но не каждая процедура такая универсальная как расчет суммы по цене и количеству. Если нужно выполнить более сложные действия, то тут или нужно усложнять сигнатуру метода и переписывать все вызовы (и потом ловим ошибки в процессе работы, так как благодаря отсутствию типизации в 1С нет контроля на передачу сложных параметров), или внутри процедуры обращаться к метаданным конфигурации и выполнять действия в зависимости от типов и состава реквизитов (и потом получить медленную программу из-за высоких накладных расходов по работе с метаданными), или писать в модули десяти служебных подпрограмм (и получить захламленный и сложно читаемый модуль, так как в 1С не предусмотрено хранение иерархического кода - выделение в Регионы интересная попытка, но пока очень сырая).

А ведь еще не упомянули про то, что выделение кода в подпрограмму - это не "бесплатно". За передачу параметров, за создание нового изолированного контекста и за обслуживание стека вызовов нужно платить дополнительным расходом памяти и процессорного временем.

Любопытные факты. В 1С упомянутый стек вызовов не просто слегка замедляет выполнение программы, но еще и может привести к ее падению, когда он окажется переполнен. В результате просто невозможно реализовать некоторые классы рекурсивных алгоритмов обработки данных - при увеличении входящего потока информации каждый раз получим падения. Из-за этого реализацию действительно "глубоких" рекурсий на 1С можно сделать исключительно с помощью GOTO.

Но вернемся к самому началу - к преобразованию алгоритма на картинке. Мы действительно можем убрать GOTO и за счет обслуживающих "замену" инструментов слегка замедлить выполнение - пусть с 10 миллисекунд до 1 секунды. Какая мелочь - 0,99 секунды ведь никто не заметит, это же "квантовое измерение" и замедление в 100 раз это ни о чем. Хотя СТОП! А если этот маленький кусочек кода находится в цикле, который при обычных условиях выполняется один час (какой-нибудь парсинг цен конкурентов), то теперь этот цикл займет 100 часов, или другими словами остановит работу на четыре дня вместо традиционного перекура, к которому уже все привыкли.

Итого. Если у нас есть возможность "почистить" модуль от десятка служебных процедур, сделать код алгоритма более читаемым, а общее время выполнение ускорить на один-два порядка, то не вижу здравых причин от этого отказываться. Зачем делать закрытие месяца с расчетом себестоимости продукции на протяжении дня-недели, если есть возможность ускорить до часа-двух?

 

4. Создание динамических алгоритмов (метапрограммирование).

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

Это может быть код, который генерируется "на лету" для обменов по "Конвертация данных 2". Или это может быть интеграция по некоторому хитрому формату внешних данных, правила обработки которого являются частью данного формата. Или возможно вы делаете NoCode-инструмент, чтобы ваши пользователи сами писали сложную обработку данных просто накликивая требуемую им блок-схему.

Т.е. у вас может быть только информация о базовом наборе "кирпичиков" для будущего алгоритма и правила для их объединения, но никаких догадок о том, в какие финальные конфигурации они будут складываться.

Подобное метапрограммирование на 1С делается двумя способами: 

  1. формированием текста будущей программы и запуск ее с помощью команды Выполнить (Execute);
  2. формированием текста будущей программы, запись ее во внешнюю обработку с помощью популярной утилиты v8unpack, а затем запуск этой обработки.

У первого способа есть ограничения, которые накладываются платформой 1С:

  1. отсутствие вложенных контекстов и работа только с контекстом точки вызова;
  2. отсутствие возможности создания процедур и функций;
  3. запрет на использование ключевого слова Возврат (Return).

Команда Выполнить изначально задумывалась для запуска фрагмента, а не полноценного кода, и потому тут использование операторов GOTO максимально облегчит нашу работу. Во первых, упрощается стыковка "кирпичиков" - на вход следующего фрагмента вставляем метку, а на выходе из требуемых предыдущих блоков делаем переход на эту метку. Во вторых, при описании содержимого самих "кирпичиков" мы можем избежать самоповтора кода (см. часть "Отказ от избыточных подпрограмм").

У второго способа (создание внешней обработки) нет никаких платформенных ограничений и мы можем генерировать полноценный код согласно парадигме структурного программирования без всяких, так сказать, "мерзких" GOTO. Но есть ряд нюансов, с которыми нужно будет сперва побороться:

  1. Этот метод в целом не поддерживается и не поощряется фирмой 1С. Утилита v8unpack (и ей подобные) создана независимыми программистами, которые предоставляют свою работу в OpenSource по модели "AS IS" - т.е. если у вас возникают проблемы, то решение их будет вашей личной задачей.
  2. Установка и запуск утилиты v8unpack на сервере 1С может быть связана со сложностями. Особенно если это не ваш сервер, а местные системные администраторы очень настороженно относятся к малоизвестным программам из интернета.
  3. Запись внешней обработки на диск и её последующее чтение могут быть заблокированы антивирусом или сбоем файловой подсистемы.
  4. При загрузке внешних обработок иногда происходят сбои. Если вы каждый раз не генерируете новое уникальное название, то часто программный кэш не очищается и 1С работает со старыми версиями обработок. Но и смена названий не панацея - иногда внешние обработки по непонятным причинам просто не работают (возможно сбои реализации защищенного режима?).

 

Заключительное слово

Позиция автора статьи предельно прозрачна - не нужно быть столь категоричными к оператору GOTO. Иногда с ним код становится красивым и более понятным. Иногда использование GOTO экономит часы и дни разработки. Иногда его наличие позволяет оптимизировать сложные расчеты и выполнить их в разумные сроки. 

У нас на платформе 1С и так слишком много технологических ограничений, чтобы мы еще дополнительно себя ограничивали. Главное не боятся взять на себя ответственность и предварительно дать утвердительные ответы на следующие вопросы:

  1. точно ли будет ощутимый эффект от применения GOTO?
  2. точно ли ваш код будет понятен другим, кто станет его поддерживать?
  3. хорошо ли вы продумали ваш алгоритм и уверены в отсутствии "побочных эффектов"?

 

post scriptum

Автор статьи достаточно видел применение GOTO в различном коде (даже в популярных Инструментах разработчика), но при этом ни разу не сталкивался с проблемами, которые вызвал именно факт его использования. Возможно у читателей есть подобный опыт? Буду чистосердечно благодарен, если поделитесь в комментариях.

программирование перейти метка goto label

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    8179    bayselonarrend    20    

156

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    6342    dsdred    18    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    19334    YA_418728146    26    

72

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    24235    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    15278    YA_418728146    7    

169
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapervodichka 6918 19.02.23 16:11 Сейчас в теме
я забыл уже что он есть, спасибо, вспомнил!
eborisov_b1; user1436515; user1900957; ubnkfl; kas1989; maksa2005; AllexSoft; Sword; lostcay; mrChOP93; t278; +11 Ответить
2. maximpl 19.02.23 18:00 Сейчас в теме
А для пункта 2, такой вариант чем хуже (в смысле, использовать в процедурах Возврат):
Код
EvilMilko; eden; independ; quazare; +4 Ответить
3. Dementor 1037 19.02.23 19:22 Сейчас в теме
(2) у вас правильная декомпозиция. Но я сделал упрощенный пример - на практике с этим деревом может быть связано еще несколько расчетов да и происхождение может быть мутным (первоначально делали запрос для вывода отчета, а потом делаем второстепенные расчеты, которые не смогли выразить с помощью языка запросов). Тогда будем делать еще больше процедур, а потом героически пытаться в них не запутаться?

Т.е. у вашего решения есть плюс - не нужно вручную отслеживать наименование меток, можно использовать подсказки от EDT. Но есть и минусы - кода банально больше и возникает задача его упорядочить; появляются уровни абстракции усложняющие доработку, контекст модуля разбухает и потребляет чуть больше ресурсов.

P.S. Тогда и от Прервать/Продолжить можно отказаться - все отлично декомпозируется на систему вложенных процедур и функций.
user618986_first-among-equals; +1 Ответить
4. maximpl 19.02.23 19:50 Сейчас в теме
(3) Спасибо, за развёрнутый ответ. )))
6. maximpl 20.02.23 07:32 Сейчас в теме
(3) Можно еще такой вариант, вроде нет озвученных недостатков (100% не гарантирую, не отлаживал, но как "мысль"):
КОД

Про "Перейти" из 1С ИТС
17. ivanov660 4583 20.02.23 15:07 Сейчас в теме
(3) Так если вы делали одно, а потом начинаете поверх пилить другое, то нужно остановиться и "переосмыслить". А не продолжать или начинать костылить.
user595646_formsg2007; ProgrammistC; eden; user1580936; +4 Ответить
47. caponid 21.02.23 03:20 Сейчас в теме
(2) Почему то мне кажется, что это код неправильно построен на уровне запроса
shiaju; user1564146; +2 Ответить
5. DrAku1a 1747 20.02.23 05:40 Сейчас в теме
В типовых конфигурациях 1С данный оператор не применяется, за очень редким исключением (для быстрого выхода из вложенных циклов).
Скорее всего, про это есть в стандартах методик разработки.

Также, в типовых конфигурациях стараются избегать конструкций Попытка - Исключение. Пользователю надо показывать ошибки, чтобы он реагировал и звал программиста. Плюс, "Попытка-Исключение" - это часто лень разработчика (ON ERROR RESUME NEXT). Будет вторая статья на эту тему?))
8. paramedic 20.02.23 10:04 Сейчас в теме
(5)В типовых избегают Попытка-Исключение? Не смешите мои подковы. Да в типовых этой конструкции хоть лопатой жри.
Лень программиста писать обработку исключений - не повод для игнорирования конструкции очень важной для избегания падения критического кода во время исполнения.
Кроме того, это единственный способ не обрушить программу при выполнении явных преобразований типов.
kas1989; anvolkov1cbit; AllexSoft; cdrw3; Sword; +5 Ответить
10. DrAku1a 1747 20.02.23 12:18 Сейчас в теме
(8) Возьмите типовую (БП, КА, УТ и т.п.) и подсчитайте - сколько раз встречается отдельно слово "КонецПопытки;" во всех модулях, и сравните это с количеством, например "КонецЕсли;" или "КонецЦикла;".
Вот пример:
БП 3.0.130.22
"КонецПопытки;" =   9 935 раз;
"КонецЦикла;"   = 147 801 раз; (почти в 15 раз больше)
"КонецЕсли;"    = 632 876 раз; (почти в 64 раза больше)
Вот из этого я делаю вывод, что 1С старается избегать конструкций "Попытка-Исключение". То есть, по-возможности не использовать, но в крайних случаях - это допустимо.
Перейти ~       = 24 раза; 
И все 24 раза - в двух отчетах:
Отчет.РегламентированныйОтчетПрибыльИностраннойОрганизации.Форма.ФормаОтчета2007Кв1.Форма.Модуль;
Отчет.РегламентированныйОтчетПрибыльИностраннойОрганизации.Форма.ФормаОтчета2014Кв1.Форма.Модуль
Прикрепленные файлы:
12. gybson 20.02.23 12:46 Сейчас в теме
(10)Мне просто интересно, а где вы видели такой типовой код, в котором не стали делать попытку-исключение, хотя могли бы?
48. DrAku1a 1747 21.02.23 06:39 Сейчас в теме
(12) Я не анализирую на "вот тут можно было бы поставить Попытка-Исключение", но на вскидку - любой код вида
Если Делитель<>0 Тогда
	Частное = Делимое / Делитель;
Иначе
	Частное = 0;
КонецЕсли;
можно заменить на
Попытка
	Частное = Делимое / Делитель;
Исключение
	Частное = 0;
КонецПопытки;
, но методологически это неправильно. Т.к. такая обработка ошибок затрагивает и нештатную ситуацию, когда в Делитель не число, а, например, дата (или Ссылка, или Неопределено, или...).

(18)
КонецПроцедуры  = 301 557 раз;
КонецФункции    = 100 707 раз;
Суммарно(кп+кф) = 402 264 раз;
//(кп+кф) = (КонецПроцедуры + КонецФункции)
- сопоставимо с "КонецЕсли;", порядок тот-же.

(42)
это очень МНОГО РАЗ!
Это примерно 2,5% кода. А если сравнивать количество строк, обернутых в Попытка-Исключение с общим количеством строк - процент будет меньше.

(34) Техподдержка, пользователь присылает скриншот ошибки, доступа в базу пользователя нет (в журнал не зайти). Связи с пользователем нет. Раньше по скрину ошибки можно было хотя-бы увидеть строку кода, найти и проанализировать его, сейчас - нет.

(35) Работу с транзакциями стараюсь всегда делать без Попытка-Исключение. При исключениях, как и при выходе из процедуры, если транзакция не была зафиксирована - происходит *. Обработку больших массивов данных - тоже стараюсь делать без попыток, и, например, при обмене данными 1С - если происходит ошибка, предпочтительнее завалить обмен, чем продолжать грузить инфу с непонятными искажениями. Если же выбирается "продолжить в случае ошибки", то как минимум, ошибки эти где-то нужно собирать и мониторить.

(43) Согласен с Вами. Судя по обилию комментариев и интересу к теме - надо бы написать статью))

--
Писать код, который будет избегать ошибок (с проверками на тип данных, на наличие поля у справочника и т.п.) - всегда сложнее, чем воткнуть "Попытка - Исключение", но использовать второй вариант - это, скорее, лень программиста. Вот я о чем толкую.
Однако, всё-же, есть фрагменты кода, где нет возможности избежать исключительных ситуаций (например, работа с внешними обработками, работа с интернет-функциям), но нужно их обработать и при ошибке выполнить альтернативный алгоритм.
50. Brawler 458 21.02.23 08:06 Сейчас в теме
(48) не нужно в попытку пихать деление и ловить ошибку деления на ноль
Сама по себе попытка это же не некое условие, а обработка нештатной ситуации во время которой платформа выполняет затратные по ресурсам операции, строит тот же стек вызова, формирует там у себя в мозгах текст ошибки и прочие прелести, что явно дольше отрабатывает нежели проверка на 0 в простом Если. Можно конечно тип переменной еще проверить и если не число тогда ошибку выкинуть самостоятельно мол типа чего вы пытаетесь число на строку поделить, но это уже тоже вызывает доп расходы на вычисления этих типов данных. Тут бы помогла статическая типизация но ее в 1С нет.
54. gybson 21.02.23 09:18 Сейчас в теме
(48) Надо проанализировать и потом выдвигать утверждение, а то балаболом назовут.
18. ivanov660 4583 20.02.23 15:12 Сейчас в теме
(10)Не корректная оценка. По вашей логике в попытку исключение нужно заворачивать каждую строчку кода, но у этого оператора определенная область применения. Сравните с количеством функций и процедур.
kuntashov; Brawler; +2 Ответить
42. Brawler 458 20.02.23 21:42 Сейчас в теме
(18) Вынужден согласиться с вами!

Можно так же смело заявить, что 1С умышленно не использует циклы с условием (Пока условие Цикл), и везде их заменяет на Циклы типа Для Каждого или Для Индекс = 0 По...

Конечно же всему свое применение и назначение.

А
"КонецПопытки;" = 9 935 раз;
это очень МНОГО РАЗ!
9. Dementor 1037 20.02.23 10:50 Сейчас в теме
(5) Статья на тему Try-Catch ? А смысл? Все и так используют этот оператор настолько часто, что теперь трудно находить ошибки банальной галочкой "остановка по ошибке".

А вот если бы существовала альтернативная Попыткам методология написания стабильного кода, то это реально хорошая тема для статьи.
13. gybson 20.02.23 12:48 Сейчас в теме
(9) Попытка-исключение не скрывает ошибку от этой галочки, остановка произойдет.
bilex; Brawler; +2 Ответить
52. user1513764 21.02.23 08:34 Сейчас в теме
(13) да блин, вы не в теме.
Речь о том, что пока ты доберешься до своей РЕАЛЬНОЙ ошибки - тебе надо продраться через тонну остановок в местах где прогеру тупо лень было типы значений проверить.

И использовать «остановку по ошибке» уже не хочется. Потому что палец на ф5 уже устал.

Моё мнение - попытка должна быть только в проде в критичном коде в новых участках (чтобы точно не упало) при срочной доработке
odinsmot; Evg-Lylyk; CnupT; zqzq; +4 Ответить
55. gybson 21.02.23 09:22 Сейчас в теме
(52) Мне очень жаль, что вы работает с настолько кривой конфигурацией. В моей практике такого не было.
43. Brawler 458 20.02.23 21:47 Сейчас в теме
(9) Ошибка это в Исключение проглатывать ошибку и ничего не делать.

Код
Попытка
    // делаем что-то умное приводящее к ошибке
Исключение
    // ничего не делаем
КонецПопытки;
Показать полностью


Я наоборот часто делаю эскалацию ошибки выше, чтобы вызывающий код страдал от своей тупости что передает невесть что приводящее к ошибкам.

Код
Попытка
    // делаем что-то умное приводящее к ошибке
Исключение
    // делаем что-то умное, что обязательно надо сделать при возникновении ошибки
    ВызватьИсключение; // даем вызвавшему коду понять что он олень
КонецПопытки;
Показать полностью
user1580936; DrAku1a; +2 Ответить
11. gybson 20.02.23 12:44 Сейчас в теме
(5) Если вы показываете пользователю ошибки 1С, то вы злодей, а не программист.
34. w.r. 650 20.02.23 21:06 Сейчас в теме
(11)

Ошибки можно писать в журнал регистрации. Пользователю можно выводить нужное сообщение без стэка с кодом 1с. В новых версиях платформы реализовали на уровне платформы уже
35. w.r. 650 20.02.23 21:10 Сейчас в теме
(5)

Интересно, как вы работу с транзакциями организовываете без попытка-исключение или обработку больших массивов данных
7. dsdred 3643 20.02.23 08:28 Сейчас в теме
Использую в тех случаях когда использую выполнить.
karpik666; DrAku1a; Dementor; +3 Ответить
14. paramedic 20.02.23 13:01 Сейчас в теме
(10) Не сравнивайте жопу с пальцем. Вы бы еще сравнили с количеством "КонецПроцедуры" и "КонецФункции". Никто не говорит, что Попытку надо пихать во все щели.
Судя по вашей логике, разработчики так же против использования транзакций - всего 1368 раз встречается НачатьТранзакцию() в той же УТ (это у меня еще и с кучей расширений, а если брать "чистую", то еще меньше)
А использовать GoTo народ просто фактически не умеет - выросло уже не одно поколение прикладных программистов, которые фактически даже не знают что это такое и для чего нужно. Поэтому-то и обфускация множественными goto так дико бесит. А на самом деле это один из самых простых для распутывания способ.
16. lostcay 10 20.02.23 13:07 Сейчас в теме
(14) Согласен. Эта очень странная выборка данных. Не понятно что анализируем и что нам это дает. Давайте ещё сравним количество использования буквы а и б.
15. lostcay 10 20.02.23 13:03 Сейчас в теме
Раз уж речь зашла о странных платформеных решениях, давайте поговорим о том, что константы и перечисления хранятся в бд как отдельные таблицы каждая. Есть много вопросов и к последовательности разработки самой платформы. То есть они как-то додумались реализовать задачи, ботов и т п, а гуид в запросе это слишком сложно, нужно больше времени. Вопросы к самой концепции хранилища. Отходя чуть в сторону, проблемы общей методологии найма 1с-ников.
И это только то что первое в голову пришло.
19. kembrik 10 20.02.23 15:17 Сейчас в теме
(15) Рекомендую "Вспомнить" или "Прочитать" как хранились константы или периодические реквизиты справочников в 7.7 в табличке _1SCONST и вспомнить как "легко и просто" было переливать такие данные запросом из таблицы
60. AllexSoft 21.02.23 11:37 Сейчас в теме
(15)гуид в запросе это скорее не сложно, там по политическим соображениям кое что не делают, есть вещи которые нужно давать с опаской программистам без надлежащей квалификации.. вспомните как долго сопротивлялись делать запись в внешние источники, как долго сопротивлялись дать возможность пакетного запроса в дин списки.. Ну вот дин списками то оказались от части правы, я видел формы где напихано в дин список целые отчеты, а потом эти горе программисты удивляются почему это не работает или "нам что то вешает сервер".
20. obemgyorik 99 20.02.23 15:42 Сейчас в теме
Предложу ещё один пример разумного использования оператора Перейти в 1С:

Если мы дорабатываем типовую функцию в расширении с директивой &ИзменениеИКонтроль и нам по какой-то причине нужно пропустить большое количество строк типового кода и перескочить в середину процедуры.

&ИзменениеИКонтроль
Функция СложныйМногоступенчатыйАлгоритмНа100500Строк()
   
   //100500 строк нужного кода
   
   #Вставка
   Перейти ~ПропуститьНенужныйКод;
   #КонецВставки

   //100500 строк НЕ нужного кода
    
   #Вставка
   ~ПропуститьНенужныйКод:
   #КонецВставки

   //100500 строк нужного кода

КонецФункции
Показать
maksa2005; viplelik; ZhokhovM; AllexSoft; kser87; Dementor; +6 Ответить
21. Dementor 1037 20.02.23 16:31 Сейчас в теме
(20) Отличный пример! Спасибо.
33. gybson 20.02.23 21:03 Сейчас в теме
(20)

Если Ложь Тогда
КонецЕсли

Да просто закомментировать, будет более читаемый код.
maksa2005; anvolkov1cbit; +2 Ответить
36. obemgyorik 99 20.02.23 21:17 Сейчас в теме
(33)
>Если Ложь Тогда
>КонецЕсли

менее наглядно для последующей поддержки, т.к. сложно будет найти поиском/глазами конец фрагмента пропускаемого кода

>Да просто закомментировать

ломает последующее обновление

>#Удаление
>#КонецУдаления

подойдёт для этого упрощённого примера (хотя проблема быстрого поиска окончания пропускаемого кода остаётся), но неприменимо, если его немного усложнить, когда "100500 строк НЕ нужного кода" нужно выполнять в одних случаях, а в других не выполнять

Т.е. если усложнять пример "разумного использования", то он будет выглядеть так:
&ИзменениеИКонтроль
Функция СложныйМногоступенчатыйАлгоритмНа100500Строк()
   
   //100500 строк нужного кода
   
   #Вставка
  Если НЕ НадоВыполнитьКусокТиповогоКода Тогда
       Перейти ~ПропуститьНенужныйКод;
  КонецЕсли;
   #КонецВставки

   //100500 строк НЕ нужного кода
    
   #Вставка
   ~ПропуститьНенужныйКод:
   #КонецВставки

   //100500 строк нужного кода

КонецФункции
Показать
38. gybson 20.02.23 21:24 Сейчас в теме
(36)
А как вам такой вариант
#Удаление
#КонецУдаления
39. obemgyorik 99 20.02.23 21:25 Сейчас в теме
(38) я прокомментировал и этот вариант в предыдущем комментарии
40. gybson 20.02.23 21:30 Сейчас в теме
(39)Добавить Область. Вариант с "перейти" никак не исправляет ситуацию.
Если вы выкинули 100500 строк кода и решили, что они вообще никогда вам не понадобятся, то пишите "Вместо".
41. obemgyorik 99 20.02.23 21:35 Сейчас в теме
Вчитайтесь в пример
Значение флага "НадоВыполнитьКусокТиповогоКода" зависит от определенных условий

Использование "Вместо" в этом примере вообще очень плохо, т.к. ломает обновление
45. gybson 20.02.23 22:09 Сейчас в теме
(41) Никто никогда не узнает, что пропущен большой кусок кода. Это прекрасный пример того, почему "перейти" должен быть запрещен в принципе.
user1580936; +1 Ответить
44. Brawler 458 20.02.23 21:53 Сейчас в теме
(20) Лучше воздержаться от такого чтобы не путать всех прочих разработчиков.
Типовые приемы это использовать

#Удаление
#КонецУдаления
22. Alxby 1117 20.02.23 16:57 Сейчас в теме
Те, у кого действительно есть настоящий "академический навык", знают что перейти мало чем отличается от прервать, продолжить и возврат в середине процедуры. А те, кто еще и на языке ассемблера программировал, знают, что вызов функции почти то же самое, что GOTO. Все это - "синтаксический сахар" для нарушения последовательного выполнения кода. Использование / неиспользование GOTO определяется скорее соглашениями внутри коллектива разработчиков и возможностями, предоставляемыми языком. Так, в языке 1С нет аналога цикла do...while (его надо эмулировать циклом Пока... ), нет аналога switch...case...breake (можно эмулировать каскадом процедур). Последнее предоставляет средство множественного входа в блок кода. Специального средства множественного выхода из блока кода тоже нет, но его легко получить с помощью прервать или возврат. Использовать вместо перейти try..catch, технически тоже можно, но с точки зрения методологии это самый плохой вариант, механизм исключений не для этого придуман.
Артано; +1 Ответить
37. gybson 20.02.23 21:19 Сейчас в теме
(22)Все это начинает напоминать разговор об однополом сексе. Мол конечно мы допускаем и у нас был такой коллега, но сами не особо, как-то не пришлось.
23. kser87 2473 20.02.23 17:06 Сейчас в теме
Возврат по сути тоже частный случай GoTo. Заменяли код "скриптами" запускаемыми при помощи Выполнить во времена когда расширений еще не было. Приходилось все "Возврат" менять на Goto. На мой взгляд главный риск это то, что с Goto можно случайно создать бесконечный цикл, если метка стоит перед оператором.
24. Alxby 1117 20.02.23 17:11 Сейчас в теме
(23)Риск с неверным расположением метки GOTO примерно аналогичен риску бесконечной рекурсии или риску изменения итератора внутри цикла Для..., или риску бесконечного цикла Пока...
user1580936; +1 Ответить
25. kser87 2473 20.02.23 17:14 Сейчас в теме
(24) в целом да, но риск все же повыше. Циклы как-то визуально ограничены. Метки Goto можно просто не заметить в "дебрях" кода.
26. Alxby 1117 20.02.23 17:16 Сейчас в теме
(25) Согласен, хотя это дело привычки и возможностей визуализации в IDE.
27. kser87 2473 20.02.23 17:20 Сейчас в теме
(24) неверно выразился. На мой вгляд дело не в визуальном оформлении кода, а в сложности раскуриваний условий перехода. Если в случае цикла разбирать придется только внутренности Пока...Цикл..КонецЦикла, то в случае Goto все содержимое между меткой и оператором.
user1580936; Brawler; +2 Ответить
28. Alxby 1117 20.02.23 17:32 Сейчас в теме
(27)так это же одно и то же. Есть некая область кода, ограниченная Цикл... КонецЦикла или GOTO... метка (метка ... GOTO). Она может быть большой или маленькой, но одинаково влиять (или не влиять) на условие перехода к метке или на следующую итерацию цикла.
29. Dzenn 894 20.02.23 17:35 Сейчас в теме
Я люблю GoTo. GoTo любит меня.
asutyagin; +1 Ответить
30. Hans 3 20.02.23 18:05 Сейчас в теме
Обработчики ожидания и оповещения те же GoTo.
31. SerVer1C 817 20.02.23 18:18 Сейчас в теме
Больная тема затронута в статье.
Тех, кто использует GoTo на ЯВУ, надо по пальцам бить. Кроме запутанности кода никакого прироста производительности на практике от него нет. Если не умеете обходиться без GoTo, то может быть лучше перестроить алгоритм или сменить профессию ?
GoTo только для низкоуровневого программирования и для прошивок микроконтроллеров.
А вот про создание собственного обфускатора с автором не согласен - пишу свой с применением самых лучших практик и добавлением своих фишек.
It-developer; user1580936; Brawler; +3 4 Ответить
32. Alxby 1117 20.02.23 18:27 Сейчас в теме
(31) Не надо никого бить. Даже по пальцам) Если разработчики ЯВУ включают в него GOTO, значит допускают его использование. Само по себе использование GOTO не увеличивает производительность, просто в некоторых случаях реализация алгоритмов без GOTO более сложна, о чем в статье и написано. Вопрос только в том, умеет ли программист писать качественный код с использованием GOTO, или нет. Если не умеет - то ему не следует использовать GOTO, вот и все.
asutyagin; AllexSoft; Dementor; tormozit; bulpi; +5 Ответить
46. tormozit 7238 21.02.23 00:11 Сейчас в теме
Со статьей полностью согласен. Буду прописывать ее "блюстителям строгих правил".
Переходы ограничены пределами текущих областей видимости - функциями, процедурами и модулями объектов, в которых применяется оператор GOTO

Может невнимательно читал, но в статье не уловил довольно важный момент - переходы по меткам разрешены в пределах видимости и только внутри текущих конструкций языка, т.е. внутрь соседнего цикла/условия/попытки снаружи запрыгнуть нельзя.

Да. Насчитал в инструментах разработчика 9 статических и 3 генерируемых переходов по меткам. Всегда не испытывал за них стыда. Наоборот даже горжусь тем, что я умею их применять.
brr; abasovit; ardn; nyam-nyam; AllexSoft; Dementor; caponid; +7 Ответить
49. tormozit 7238 21.02.23 07:55 Сейчас в теме
(0)
Если вы каждый раз не генерируете новое уникальное название, то часто программный кэш не очищается и 1С работает со старыми версиями обработок

Такая проблема была в генераторе в консоли кода ИР на платформе 8.3.11+, где изменили кэширование внешних обработок
Но я нашел ее решение. Предлагаю добавить эту информацию в статью раз уж ты решил так глубоко копнуть.
abasovit; nyam-nyam; Dementor; +3 Ответить
59. Dementor 1037 21.02.23 11:36 Сейчас в теме
(49) выглядит как магия.
В конце недели планирую вычитать все комментарии и подправить статью - сделать акцент на то, что нельзя прыгать внутрь циклов/условий/попыток и добавить интересный код. Ну и решение с внешними обработками добавлю, раз оно есть.
51. flex81 70 21.02.23 08:20 Сейчас в теме
Я рисую алгоритмы работы в Драконе и код храню тамже. Изначально он генерит код с помошью goto. Но и линейно может
61. Dementor 1037 21.02.23 11:39 Сейчас в теме
(51) при подготовке статьи встречал много отсылок на Дракон. Где-то даже цитировали его разработчиков, которые утверждали, что циклы несут больший вред для алгоритмического мышления чем goto (может не такими словами, но по сути).
53. zqzq 25 21.02.23 09:03 Сейчас в теме
Использовал 1 раз GOTO для выхода из двойного цикла.
Практически, можно и нужно без него обходиться, кроме очень редких случаев.
56. gybson 21.02.23 09:24 Сейчас в теме
Проблема с безусловным переходом в том, что он условный.
57. starik-2005 3091 21.02.23 09:27 Сейчас в теме
Статья неплохая.

Но не все, кто академически занимается и программированием тоже, заканчивали какие-то кафедры (да, я там работал, но знаю и тех, кто вообще ничего не заканчивал, но они жали руки кнутам и дейкстрам направо и налево). И пункт номер РАЗ - это надуманный пункт, т.к. разные методы расчета - это функции. В части выхода из циклов, ветвлений и т.д. - полностью поддерживаю. По поводу отказа в ряде случаев от процедур и функций, то очень зыбкое такое допущение. Может быть в каком-то пограничном варианте это может привести к какой-то пользе.

Да, иногда использую "гото" для выхода из циклов и ветвлений и для того, чтобы не пилить лишний цикл на два шага (типа в последний день месяца делаем это два раза, а в остальные дни месяца - раз, тут как раз случай, когда код не выносится в процедуру, хотя можно было бы это сделать и вызвать функцию раз для дня и еще раз, если он последний в месяце, но если в функцию приходится тащить кучу локальных переменных, то пилить сто параметров или засовывать их все в структуру - это как-то убого выглядит, т.е. сильно хуже, чем "гото").

В общем, "гото" - это хорошо в некоторых случаях (как соль в еде), хотя тех, кто учился на кафедрах и не смог на достаточном уровне познать дзен-программинг, часто с "гото" плющит и колбасит. Прям как последователей чумаков, которым сказали, что вода в крещение течет заряженная с крана...

ЗЫ: Сам последний раз в 1С "гото" употреблял очень давно - года три назад. Мало в 1С сложного в последнее время требуется. А простое можно и без "гото" написать.
Dementor; +1 Ответить
58. Dementor 1037 21.02.23 11:26 Сейчас в теме
(57) спасибо за столь подробный комментарий.
62. Cyberhawk 135 21.02.23 14:32 Сейчас в теме
63. alexey_kurdyukov 166 22.02.23 09:25 Сейчас в теме
Давайте просто использовать средства там, где нужно. Если нужно Перейти - то используем Перейти, если не нужно - то не используем, а не вот это вот как маленькие бородатые девочки: "Ай миня гоуту укусиль, нильзя его использовать!"
64. alexey_kurdyukov 166 22.02.23 09:29 Сейчас в теме
А Попытка-Исключение позволяет отделить рабочую логику функции от обработки ошибки и не вкорячивать всякие флаги, спецзначения, передачу параметров из функции в аргументах и тому подобное
65. Артано 795 22.02.23 13:44 Сейчас в теме
Согласен с автором, безусловные гонения именно против оператора GoTo ничем не лучше его бессистемного использования.
Причем, на практике заметил, что наиболее яркие противники ничего не имеют против Возврат, Продолжить или Прервать, хотя это тоже безусловные переходы, только к предопределённым точкам
66. w.r. 650 22.02.23 15:33 Сейчас в теме
Вообще
Перейти
удобно когда не нужно выполнять большой кусок кода. Можно обернуть этот код условием, но читаемость от это понизится
user1491286; +1 Ответить
67. flex81 70 23.02.23 13:55 Сейчас в теме
(61) На самом деле есть программа ИС ДРАКОН - в ней рисуются алгоритмы, и она переносит код с алгортимов в конфигуратор в стилистике GoTo.
Тоесть в итоге я вижу графическое представление кода 1С на схеме. А код в конфигуратор, с расставлением GoTo делает сам программа. Я работаю только над логикой решения в графическом виде. Очень удобно. Делаю целые проекты так уже лет 15.
info1i; Dementor; +2 Ответить
68. ardn 658 23.02.23 17:52 Сейчас в теме
69. info1i 236 25.02.23 01:26 Сейчас в теме
Я редко использую GoTo и обычно в маленьких блоках кода, получается очень компактно и читабельно.
70. alex_sayan 53 09.03.23 19:39 Сейчас в теме
Ужас. "Лесенка" из циклов и "если" даже не намекает, а прям орёт про проблемы с кодом. Такой код надо переписывать, а не подпирать GOTO. Я бы такой код даже близко к проду не подпустил
It-developer; +1 1 Ответить
74. brr 184 08.10.24 16:49 Сейчас в теме
(70) Вы пришли на проект, а там такое. Вам нужно выйти из цикла. Попробуете переписать получите по шапке, потому что сломаете неочевидную логику.
75. alex_sayan 53 09.10.24 04:06 Сейчас в теме
(74) это где такое, что за рефакторинг говнокода дают по шапке?
76. brr 184 09.10.24 10:25 Сейчас в теме
(75) Попробуйте полностью прочитать то что я написал. Там есть ответ на ваш вопрос.
77. alex_sayan 53 09.10.24 13:48 Сейчас в теме
(76) ну вот я и переспросил: в какой компании за рефакторинг говнокода дают по шапке? Чтобы знать, где точно не стоит работать. Если конечно это реальный случай из практики
71. user1206119 90 20.03.23 22:51 Сейчас в теме
На самом деле часто оператор перейти, если его правильно использовать, очень помогает оптимизировать код. Был случай, когда переделывал код из стандартного на код с GOTO- удалось ускорить выполнение тяжелой формы в 2 раза. Другое дело, что этот оператор надо использовать очень и очень осторожно - в пределах видимости, чтобы у следующих программистов не было проблем с поиском ошибок.
72. Aleksey.Polushin 22.03.23 07:38 Сейчас в теме
Ни разу за всю свою практику не потребовалось использовать GOTO. Как-то благополучно обходился без этого.
It-developer; user1491286; +2 Ответить
73. It-developer 26 30.08.23 17:48 Сейчас в теме
С метками код значительно лучше? Автор, ты в порядке?
Этот код УЖАСЕН. И 1-й вариант ужасный и 2-й тем более! Те кто так пишет - никогда этого не делайте. НИКОГДА!
Я должен понимать ваш код и мне не должно быть от него тошно. На примереах - как раз этот случай.
Книга "Чистый код" почитайте.
Автор, а Вы тестили goto на производительность? Есть такое предположение, что все будет тупить.
Ну и ухудшение читаемости - очевидно
78. user1286657 29.11.24 17:17 Сейчас в теме
Коллеги скинули сегодня эту статью... и я в шоке... В шоке хотя бы от того, что НИКТО в комментариях за полтора года существования статьи не заметил, что оба варианта кода из примеров в статье, что "плохой", что "исправленный" - некорректные, и к тому же не эквивалентны друг другу!

В первом варианте что мы делаем? Ищем должников? Ок, мы ищем должников, если лимит долга превышен - взводим семафор, что долг найден, прерываем кучу вложенных циклов, выполняем ДобавитьДолгНаВозврат. Ок, а если за все итерации всех циклов долга не накопилось и семафоры не взвелись? Мы... все равно добавляем долг на возврат! Ни один из семафоров не используется, они просто предназначены, чтобы прервать бессмысленный цикл пораньше. Г - лоГика...

Но ок, может тут что-то не так и так и задумано? Мы пытаемся "улучшить" этот адов угар с помощью Перейти... и нарушаем логику кода. Потому что теперь при превышении лимита общего долга, там, где взводился внешний семафор, мы... переходим по метке, ПЕРЕПРЫГИВАЯ вызов нашей ДобавитьДолгНаВозврат, которая для данного контрагента никогда не выполнится...

Автор, огромное спасибо за демонстрацию того, как при попытке "улучшить" нечитаемый говнокод можно шикарно выстрелить себе в ногу использованием ненужных операторов не в том месте... Надеюсь, за прошедшие полтора года вы научились использовать булевы поля в запросах вида СУММА(...) < &Лимит КАК ЭтоДолжник и перестали ваять подобные мозговыносящие обходы шестикратно вложенных выборок там, где это можно заменить одной строкой в запросе...

P.S. Мне реально жаль вашего работодателя...
Оставьте свое сообщение