Операторы перехода в программном коде: использовать или нет?

Публикация № 1326746 16.11.20

Разработка - Рефакторинг и качество кода

качество кода операторы перехода

Рассмотрим ситуации использования операторов перехода Перейти (GoTo), Возврат (Return), Прервать (Break), Продолжить (Continue). Как вы считаете - это дурной тон, нормальная практика или зависит от ситуации?

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

Со времен «старой школы» существует мнение, что структурное программирование — это хорошо, а любое отступление от него — это плохо. Однако, общение с профессиональными программистами показывает, что использование операторов break, continue, return на практике применяется довольно часто, потому что это удобно и в большинстве случаев делает программу более понятной. Если взять код типовой конфигурации от компании 1С и немного покопаться, то встречаются эти оба подхода вперемешку (предположу, что писали разные люди в разные временные промежутки).

И действительно Дональд Кнут в свое время писал:

«… Настоящая цель программиста состоит в том, чтобы формулировать наши программы таким образом, чтобы их было легко понимать.» 

Давайте рассмотрим примеры использования и не использования этих операторов и сравним.
 

1. Оператор Перейти (GoTo).

 

Это совсем дурной тон и его использовать не будем). Однако интересно было бы услышать ваши мысли, возможно в сообществе еще есть «староверцы».

2. Оператор Возврат (Return).

 

Давайте рассмотрим некоторый виртуальный пример. Задача будет следующая: Требуется написать функцию получения математическое ожидание покупок клиента или средний чек.

 
 Используем оператор возврата 

 

Функция ПолучитьСреднийЧек(Партнер) Экспорт 
	
	// уходим если ошибка, обрабатывать не стоит
	Если НЕ ЗначениеЗаполнено(Партнер) Тогда
		Возврат новый Структура(Неопределено,"Данные пустые");
	КонецЕсли;
	
	Запрос = новый Запрос;
	Запрос.Текст="ВЫБРАТЬ
	|	СРЕДНЕЕ(РасчетыСКлиентами.Сумма) КАК СреднийЧек
	|ИЗ
	|	РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
	|ГДЕ
	|	РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер = &Партнер
	|	И РасчетыСКлиентами.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
	|	И РасчетыСКлиентами.Сумма <> 0
	|
	|ИМЕЮЩИЕ
	|	НЕ СРЕДНЕЕ(РасчетыСКлиентами.Сумма) ЕСТЬ NULL";
	
	Запрос.УстановитьПараметр("Партнер",Партнер);
	Результат = Запрос.Выполнить();
	
	Если Результат.Пустой() Тогда
		Возврат новый Структура(Неопределено,"Результат пустой");
	КонецЕсли;
	
	// На самом деле тут может быть многоа кода
	// очень много кода
	// более размера одного экрана
	// ...
	// ...
	
	Выборка.Следующий();
	Возврат новый Структура(Выборка.СреднийЧек,"Все успешно");
	
КонецФункции

 

 

 
Не используем оператор возврата 

 

Функция ПолучитьСреднийЧек(Данные) Экспорт
	
	СтруктураВозврата = Неопределено;
	
	// уходим если ошибка, обрабатывать не стоит
	Если ЗначениеЗаполнено(Партнер) Тогда
		
		Запрос = новый Запрос;
		Запрос.Текст="ВЫБРАТЬ
		|	СРЕДНЕЕ(РасчетыСКлиентами.Сумма) КАК СреднийЧек
		|ИЗ
		|	РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
		|ГДЕ
		|	РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер = &Партнер
		|	И РасчетыСКлиентами.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
		|	И РасчетыСКлиентами.Сумма <> 0
		|
		|ИМЕЮЩИЕ
		|	НЕ СРЕДНЕЕ(РасчетыСКлиентами.Сумма) ЕСТЬ NULL";
		Запрос.УстановитьПараметр("Партнер",Партнер);
		Результат = Запрос.Выполнить();
		
		Если НЕ Результат.Пустой() Тогда
			
			// На самом деле тут может быть многоа кода
			// очень много кода
			// более размера одного экрана
			// ...
			// ...
			
			Выборка.Следующий();
			СтруктураВозврата = новый Структура(Выборка.СреднийЧек,"Все успешно");
		Иначе
			СтруктураВозврата = новый Структура(Неопределено,"Результат пустой");
		КонецЕсли;
	Иначе
		СтруктураВозврата = новый Структура(Неопределено,"Данные пустые");
	КонецЕсли;
	
	Возврат СтруктураВозврата;
	
КонецФункции

 

 

 

Какие выводы мы можем сделать из двух вышеуказанных примеров?

  • Во втором примере мы теряем локальность — при достаточно длинном тексте процедуры нужно еще посмотреть, не выполняются ли какие-то действия после условного оператора. Да и не совсем понятно, зачем добавлять лишний уровень вложенности. Теперь представьте, что вы проводите анализ кода (code-review), то вам придется время от времени скролить вверх и вниз всю эту простыню кода, чтобы вернуться к оператору условий.
  • Дополнительно во втором примере нам пришлось вводить переменную, в которой хранится результат выполненных операций. Вспоминаем о «Бритве Оккама» и понятии «Не плоди лишних сущностей».
  • Как вы уже догадались, то проблему большого куска кода в обоих случаях мы можем подвергнуть (в принципе должны) рефакторингу и заключить в отдельную функцию.


     
  • В первом случае мы свами можем попасть на никогда не выполняемый код. Обычно про такое должен выдавать предупреждение компилятор.
     
     Пример кода, который никогда не выполняется
    Функция ЭтоТипБулево(Значение) Экспорт
    	
    	Если ТипЗнч(Значение)=Тип("Булево") Тогда
    		Возврат Истина;
    	Иначе
    		Возврат Ложь;
    	КонецЕсли;
    	
    	// сюда мы никогда доходить не будем
    	Сообщить("А сердечник можно делать из дерева! 
    	| Все равно этот код никогда не выполнится...");
    	Возврат Неопределено;
    	
    КонецФункции
  • Удобно использовать оператор "Возврат" в начале функции при выполнении обязательных проверок на корректность входных параметров. В этом случае легко отвязывается задача проверки параметров от всего куска кода процедуры.
     
     Пример обработки выходных параметров

     

    Функция ПолучитьСреднийЧек(Партнер) Экспорт 
    	
    	// I) Проверяем входные параметры
    
    	// уходим если ошибка, обрабатывать не стоит
    	Если НЕ ЗначениеЗаполнено(Партнер) Тогда
    		Возврат новый Структура(Неопределено,"Данные пустые");
    	КонецЕсли;
    
    	// II) Выполняем основную задачу
    	// ...
    	// ...
    	// ...
    
    КонецФункции
    

     

     

3. Оператор Прервать (Break)


Один из самых востребованных операторов, если рассмотреть программирование на C++. В свое время я часто его использовал в связке с Switch и Операторах цикла (For, While). Обратите внимание, что оператор "Прервать" может использоваться и для выхода из бесконечного цикла.
Рассмотрим вариацию типового примера для подключения к клиенту тестирования механизма автоматизированного тестирования от 1С.

 
 Используем оператор прервать 

 

Подключен = Ложь;
ОписаниеОшибкиСоединения = "";
ТестовоеПриложение = Новый ТестируемоеПриложение(,НомерПорта,);

ВремяОкончанияОжидания = ТекущаяДата() + 70;  // 70 секунд ожидаем подключение
Пока Истина Цикл
	
	Попытка
		ТестовоеПриложение.УстановитьСоединение();
		Подключен = Истина;
		Прервать;
	Исключение
		ОписаниеОшибкиСоединения = ОписаниеОшибки();
	КонецПопытки;
	
	Если ТекущаяДата() >= ВремяОкончанияОжидания Тогда		
		Прервать;
	КонецЕсли;
	
КонецЦикла;

 

 

 
 Не используем оператор прервать

 

Подключен = Ложь;
ОписаниеОшибкиСоединения = "";
ТестовоеПриложение = Новый ТестируемоеПриложение(,НомерПорта,);

ВремяОкончанияОжидания = ТекущаяДата() + 70;  // 70 секунд ожидаем подключение
Пока (ТекущаяДата() <= ВремяОкончанияОжидания) И (Подключен=Ложь) Цикл
	
	Попытка
		ТестовоеПриложение.УстановитьСоединение();
		Подключен = Истина;
	Исключение
		ОписаниеОшибкиСоединения = ОписаниеОшибки();
	КонецПопытки;
	
КонецЦикла;

 

Какие отличия мы видим?

  • в первом случае мы последовательно встречаемся с условиями, так проводить анализ значительно проще на мой взгляд
  • во втором случае код внутри процедуры получился значительно меньше и сразу видно условие выхода из цикла
  • Использование "вечных" условий в операторах цикла - это дурной тон для языка 1С Предприятие. 

 

4. Оператор Продолжить (Continue)

 

Оператор "Продолжить" (continue) позволяет сразу перейти в конец тела цикла, пропуская весь код, который находится под ним. Это полезно в тех случаях, когда мы хотим завершить текущую итерацию раньше времени. 

Будьте осторожны при использовании оператора "Продолжить" с циклом "Пока" (while). Поскольку в этих циклах инкремент счетчиков выполняется непосредственно в теле цикла, то использование "Продолжить" может привести к тому, что цикл станет бесконечным!

Рассмотрим задачу - Требуется выполнить предварительную обработку таблицы данных загруженную из Excel.

В таблице хранится наименование контрагента и некоторые дополнительные данные (сумма и т.п.). В рамках обработки будем искать ссылку на контрагента в базе данных, если данные битые, то будем пропускать поиск.

 
 Необдуманное использование оператора продолжить

 

ш=0;

Пока ш<ТаблицаДанных.Количество()-1 Цикл
	
	стр = ТаблицаДанных[ш];
	
	// такая ошибка сделает наш цикл бесконечным
	Если ЭтоБитыеДанные(стр) Тогда
		Продолжить;
	КонецЕсли;
	
	// Обрабатываем данные во внешней процедуре
	НайтиСсылкуКонтрагентаПоНаименованию(стр);

	// Еще много кода пост обработки
	// ...
	// ...
	// ...
	// ...
	
	ш=ш+1;
	
КонецЦикла;

Процедура "НайтиСсылкуПоНаименованию" ищет ссылку контрагента в базе 1С.

Функция "ЭтоБитыеДанные" проверяет наличие "кривой" информации в полях Сумма, КонтрагентНаименование.

 

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

 
 Более правильный вариант

 

ш=0;

Для ш=0 по ш<ТаблицаДанных.Количество()-1 Цикл
	
	стр = ТаблицаДанных[ш];
	
	// такая ошибка сделает наш цикл бесконечным
	Если ЭтоБитыеДанные(стр) Тогда
		Продолжить;
	КонецЕсли;
	
	// Обрабатываем данные во внешней процедуре
	НайтиСсылкуКонтрагентаПоНаименованию(стр);

	// Еще много кода пост обработки
	// ...
	// ...
	// ...
	// ...
	
КонецЦикла;

 

 

Теперь рассмотрим вариант без использования оператора "Продолжить".

 
 Не используем оператор продолжить

 

ш=0;

Пока ш<ТаблицаДанных.Количество()-1 Цикл
	
	стр = ТаблицаДанных[ш];
	
	// такая ошибка сделает наш цикл бесконечным
	Если НЕ ЭтоБитыеДанные(стр) Тогда
	
		// Обрабатываем данные во внешней процедуре
		НайтиСсылкуКонтрагентаПоНаименованию(стр);
		// Еще много кода пост обработки
		// ...
		// ...
		// ...
		// ...
		
	КонецЕсли;
	
	ш=ш+1;
	
КонецЦикла;

 

 

Выводы:

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

 

5. Операторы прервать и продолжить

 

Многие учебники рекомендуют не использовать операторы "Прервать" (break) и "Продолжить" (continue), поскольку они приводят к произвольному перемещению точки выполнения программы по всему коду, что усложняет понимание и следование логике выполнения такого кода.

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

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

 
 Используем операторы прервать и продолжить

 

Функция ПолучимБаланс(ТаблицаДанных) Экспорт

	Баланс = 0;
	
	// 1. Обрабатываем массив данных с типами элементов: Позиция(Число) ,Выбрана (булево), Контрагент (Справочник), Сумма (число).
	// 2. Количество записей 1 000 000 элементов
	Для каждого стр из ТаблицаДанных Цикл
		
		Если НЕ стр.Выбрана Тогда
			Продолжить;
		КонецЕсли;
		
		// если битая ссылка, то нужно выдать ошибку
		Если ЭтоБитыеДанные(стр)=Истина Тогда
			Баланс=Неопределено;
			Сообщить("Позиция "+стр.Позиция+" битые данные!");
			Прервать;
		КонецЕсли;		
		
		Баланс = Баланс+стр.Сумма;		
			
	КонецЦикла;
	
	Возврат Баланс; 
КонецФункции

Функция "ЭтоБитыеДанные" проверяет наличие "кривой" информации в полях Сумма, Контрагент.

 
 Не используем операторы прервать и продолжить

 

Функция ПолучимБаланс(ТаблицаДанных) Экспорт
	
	Баланс = 0;
	БитыеДанные = Ложь;
	
	// 1. Обрабатываем массив данных с типами элементов: Позиция(Число) ,Выбрана (булево), Контрагент (Справочник), Сумма (число).
	// 2. Количество записей 1 000 000 элементов
	Для каждого стр из ТаблицаДанных Цикл
		
		Если стр.Выбрана Тогда			
			БитыеДанные = ЭтоБитыеДанные(стр);
			Если БитыеДанные =Ложь Тогда
				Баланс = Баланс+стр.Сумма;
			Иначе
				БитыеДанные =Истина;
				Баланс = Неопределено;
				Сообщить("Позиция "+стр.Позиция+" битые данные!");
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Баланс;
КонецФункции

 

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

 
 Не используем операторы прервать и продолжить вариант 2

 

Функция ПолучимБаланс(ТаблицаДанных) Экспорт
	
	Баланс = 0;
	ш=0;
	
	// 1. Обрабатываем массив данных с типами элементов: выбрана (булево), Сумма (число).
	// 2. Количество записей 1 000 000 элементов
	Пока ш<ТаблицаДанных.Количество()-1 И ЭтоБитыеДанные(ТаблицаДанных[ш])=Ложь Цикл
		
		Если ТаблицаДанных[ш].Выбрана Тогда
			Баланс = Баланс+ТаблицаДанных[ш].Сумма;
		КонецЕсли;
		
	КонецЦикла;
	
	// если ш меньше размера таблицы, значит мы не дошли до конца без ошибок
	Если ш<ТаблицаДанных.Количество()-1 Тогда
		
		Баланс = Неопределено;
		Сообщить("Позиция "+стр.Позиция+" битые данные!");
		
	КонецЕсли;
	
	Возврат Баланс;
КонецФункции

 

 

Рассмотрим результат сравнения:

  • Не желание использовать операторы переходов вынудило нас во втором случае полностью переписать код
  • Во втором случае потребовалось заводить лишние переменные
  • Во втором случае потребовалось вынести часть логики из цикла в конец функции, что увеличивает объем кода выполняющий решения поставленной задачи
  • В циклах "Для" и "Для каждого" удобно использовать оператор "Продолжить" для быстрого перехода к следующей итерации по результатам условий, если текущая строка не требует обработки.
     
     Пример перехода к следующей итерации в цикле, если не требуется обработка на текущем шаге

     

    // ...
    
    Для каждого стр из ТаблицаДанных Цикл
    		
    	Если НЕ стр.Выбрана Тогда // Переходим сразу к следующей итерации
    		Продолжить;
    	КонецЕсли;
    
        // Далее обрабатываем данные
        // ...
    
    КонецЦикла;
    
    // ...

     

     

Заключение

 

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

  • Операторы "Продолжить" и "Прервать" удобно использовать в циклах "Для" и "Для каждого"
  • Если речь идет про оператор цикла "Пока", то тут лучше стараться не использовать "Продолжить", т.к. в некоторых комбинациях возможно создание бесконечного цикла.
  • Дурной тон в операторах циклов использовать "вечные" условия по типу " Пока Истина Цикл".
  • При использовании оператора "Возврат" надо следить, чтобы не оставалось недостижимого кода.
  • Также возможны случаи написания недостижимого кода с операторами "Продолжить" и "Прервать".
  • Оператор "Возврат" удобно использовать в начале функций при выполнении проверок на консистентность (корректность) входных параметров.
  • Оператор "Перейти" запрещено использовать.
  • Если придерживаться структурного подхода, то следует себя ограничивать в создании вложенности (или "матрешек") с условиями "Если Тогда", так как это затрудняет понимание кода и увеличивает критерий цикломатичности.
  • В процессе разработки (кодирования) всегда выполняем рефакторинг кода и выносим большие блоки в отдельные функции.
  • Используйте в процессе работы анализ качества кода (код-ревью) (По следам код-ревью, Как завести у себя в команде код-ревью. Отвечаем на вопросы)
  • Используйте тестирование и автоматизированное тестирование (Автоматизация тестированияПример создания сценарного UI теста для платформы 1С)

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Steelvan 281 16.11.20 11:04 Сейчас в теме
Во втором примере всегда делаю ЗначениеВозврата в начале функции.
Плюсом это сразу дает понимание, что возвращается из функции.
Плюсом сразу определяешь ЗначениеВозврата по умолчанию, которое всегда вернется, если даже одно условие с кодом изменения не сработает.

Крутку в любом случае по коду делаешь.
Мне для того и дано колесико мышки, чтобы крутку можно было делать удобно, это не аргумент.
PLAstic; user1464234; +2 Ответить
2. ivanov660 3878 16.11.20 11:12 Сейчас в теме
(1) На счет скролла кода:
1. С психологической точки зрения при постоянном переключении туда-сюда больше устаешь и соответственно теряется эффективность.
2. По некоторым рекомендациям проведения код ревью: чем меньше код и более компактный, тем проще проводить эту процедуру.
3. С точки зрения эффективности анализа кода, гораздо проще понять в чем суть:
//..
ВыполнитьДействие1();
ВыполнитьДействие2();
ВыполнитьДействие3();
//..
Процедура ВыполнитьДействие1()
// какая-то обработка
Для каждого ...
КонецПроцедуры
Показать

чем
//..
Для каждого .....
//Условия
// ...
Для каждого ...
//
Для каждого ...
//
Показать


т.е. чем компактней код тем лучше, но не всегда такого можно добиться.
3. PLAstic 290 16.11.20 12:50 Сейчас в теме
(2) Сначала отвечу на это сообщение. Тут нужен здравый смысл. Если процедура длинная, но при выделении её частей в отдельные процедуры приходится передавать целую портянку параметров, то логично, что нужно оставить эту процедуру в покое - на протяжении всего её контекста задействовано множество взаимосвязанных параметров и следование правилу "не более N строк" в данном случае наоборот, затруднит понимание алгоритма.
По поводу же статьи, тут тоже всё логично. Я 15 лет назад первый раз сходил на несколько курсов Арутюнова Сергея из 1УЦ (он и сейчас их ведёт), который помог понять логику разработчиков и увидеть смысл. Конечно, лишние уровни вложенности затрудняют чтение, поэтому и встречаются проверки с возвратом в начале типовых процедур/функций. Полностью согласен с (1), тоже оформляю структуру возврата в начале и использую во всех возвратах. Формат ответа любой функции/процедуры всегда д.б. един. Следует избегать случаев, когда при каких-то условиях мы возвращаем Неопределено, а когда-то структуру. Или один раз у нас структура пустая, а в другой - с набором реквизитов.
4. bulpi 209 16.11.20 14:15 Сейчас в теме
"Оператор "Перейти" запрещено использовать."
Если бы все было именно так, то этого оператора не было в синтаксисе.
Dementor; 1v7; starik-2005; Vlad_2008; Perfolenta; brr; +6 1 Ответить
5. ivanov660 3878 16.11.20 14:25 Сейчас в теме
(4) Это правило хорошего тона. Однако, мне встречались реализации на 1С, где довольно часто использовался этот оператор. И выглядел этот кода довольно уныло.
С другой стороны, если взять Ассемблер (или машинные коды), то там как раз в большинстве своем использования операторов перехода и особенно "перейти" (jmp)
6. alexey.kutya 291 16.11.20 14:33 Сейчас в теме
Ни разу не было желания использовать Перейти (GOTO).
Все остальные использую, если это эффективно.
IgorS; Stylo; +2 Ответить
19. teller 23.11.20 06:55 Сейчас в теме
(6) при программировании конечных автоматов логичнее использовать goto,
если вы чего-то не ... то это не значит что это не ... .
Статья из серии "Дейкстру и Вирта не читал , но имею собственное мнение "
7. FesenkoA 57 16.11.20 14:33 Сейчас в теме
Пфффф, у меня по арифметике было "5"!

ш=-1;
Пока ш<ТаблицаДанных.Количество()-1 Цикл

	ш=ш+1;

	стр = ТаблицаДанных[ш];
	
	Если ЭтоБитыеДанные(стр) Тогда
		Продолжить;
	КонецЕсли;

	НайтиСсылкуКонтрагентаПоНаименованию(стр);
КонецЦикла;
Показать
mussolene; +1 Ответить
8. potoyalo 17.11.20 07:17 Сейчас в теме
Выводы гениальны, конечно.. <ОператорName> удобно использовать там, где он уместен.
Не понял, откуда у вас получился вывод, что Оператор "Перейти" использовать запрещено?
Perfolenta; brr; +2 Ответить
9. mussolene 17 17.11.20 07:26 Сейчас в теме
Прочитал статью по диагонали. НЕ увидел аргументированного вывода по переходу. Он здесь в принципе не раскрыт. Его можно и нужно использовать в условиях когда например тебе нужно выполнить код через Выполнить() и не хочешь чтобы выполнялась громоздкая конструкция в случае когда какая то проверка не выполнилась. По поводу примеров написанных выше скажу только одно. второй пример супер не оптимальный и можно сократить как миниму несколько возвратов, так же разность возвращаемых данных это просто жесть. Когда попробуешь потом возврат обработать еще такую же простыню получишь
brr; Dementor; +2 1 Ответить
10. mussolene 17 17.11.20 07:33 Сейчас в теме
Функция ПолучитьСреднийЧек(Партнер) Экспорт
	
	СтруктураВозврата = Новый Структура("СреднийЧек,Ошибка",0,"");
	
	Если Не ЗначениеЗаполнено(Партнер) Тогда
		СтруктураВозврата.Ошибка = "Не заполнены данные!!!";
		Возврат СтруктураВозврата;
	КонецЕсли;

	Запрос = новый Запрос;
	Запрос.Текст="ВЫБРАТЬ
	|	СРЕДНЕЕ(РасчетыСКлиентами.Сумма) КАК СреднийЧек
	|ИЗ
	|	РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
	|ГДЕ
	|	РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер = &Партнер
	|	И РасчетыСКлиентами.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
	|	И РасчетыСКлиентами.Сумма <> 0
	|
	|ИМЕЮЩИЕ
	|	НЕ СРЕДНЕЕ(РасчетыСКлиентами.Сумма) ЕСТЬ NULL";
	Запрос.УстановитьПараметр("Партнер",Партнер);
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать();
	
	Если Выборка.Следующий() Тогда
		ЗаполнитьЗначенияСвойств(СтруктураВозврата,Выборка);	
	Иначе
		СтруктураВозврата.Ошибка = "Данные не получены!!!";
	КонецЕсли;
	
	Возврат СтруктураВозврата;
	
КонецФункции
Показать
11. mussolene 17 17.11.20 07:48 Сейчас в теме
(9) Так же остается вопрос в инициализации переменных постоянно. Вы вкурсе что инициализация переменной это новая ячейка памяти. Представьте что у вас 1 кк пользователей запустили код в котором инициализируется несколько десятков переменных. Вам не хватит памяти нормально обрабатывать данные.

И вообще в чем проблема при использовании операторов не понимаю. Как можно все это говорить??? При определенных условия операторы условного перехода ограничивают потребление памяти и время выполнения определенного кода. Это касается не только 1С.

По поводу выводов в конце статьи. Согласен только с тем что код нужно писать оптимально по некоторым пунктам.
12. Rais96 17.11.20 07:50 Сейчас в теме
Всегда использую оператор Перейти, если нужен выход из сложного или вложенного цикла. Код чище и главное понятнее. Мнимый запрет на goto, сформирован вначале распространения структурного программирования, потом ввели break, continue, которые по сути те же goto. А методика преподавания не поменялась, потому и в промышленное программирование приходят с аксиомой что goto запрещено. Мы программируем не для красоты, а чтобы было понятнее и проще разобраться в коде, а что при этом нарушаются какие-то понятия программирования, так пусть теоретики подстраивают свои теории под практику.
Award; starik-2005; romanpl777; Drivingblind; itoptimum; brr; Perfolenta; Dementor; mussolene; +9 1 Ответить
14. Perfolenta 202 17.11.20 13:52 Сейчас в теме
(12) поддерживаю, оператор Перейти вполне полезен в некоторых ситуациях и ни чем не хуже любых других операторов...
Он был назначен виновником всех бед тогда, когда блочных операторов ещё не было и даже процедур в современном понимании еще не было... тогда использование Goto было безальтернативным и превращало код во "взрыв на макаронной фабрике"...
но те времена давным-давно прошли...
Сегодня, если в методе есть один-два оператора Перейти код не превращается в сложный для чтения и не повышает вероятность ошибок...
Если у вас стоит цель запутать код, то вы и без оператора Перейти справитесь на отлично, а если мозги на месте, то и оператор Перейти будет полезен...
starik-2005; itoptimum; +2 Ответить
15. ivanov660 3878 17.11.20 17:12 Сейчас в теме
(14) Если ВЫ действительно говорите что использование оператора Goto оправдано в текущий момент и вы его используете, то для меня это звучи ужасно.
Если про использование других операторов прервать, возврат, то нормальная практика.
16. Perfolenta 202 17.11.20 23:17 Сейчас в теме
(15) есть яды, которыми лечат... молотком не надо стучать по голове...
неужели вы пугаетесь увидев оператор Перейти, не понимаете, что происходит и вынуждены тратить лишнее время?
мне кажется, что нет...
Производительность кода он тоже не снижает, к ошибкам не приводит... в чем проблема?
Зато он удобен при выходе из нескольких вложенных циклов,
годится для перехода в конец метода для выполнения завершающих действий...
Такие случаи сами по себе редки, но в них он смотрится хорошо и удобно, так чего его не использовать? Только из-за чьих-то предубеждений (смысл которых потерялся в прошлом веке)?
Zevzm; Dementor; starik-2005; romanpl777; pm74; Award; +6 Ответить
17. nporrep 50 18.11.20 22:21 Сейчас в теме
(15) Рекомендации по ограничению (не запрету!) использования безусловного перехода (jmp) в пользу передачи управления (call/ret) стали актуальным при смещении парадигмы от "линейного" программирования к блочному, дабы не запутывать спагетти.

Но сейчас, в эпоху асинхронной многопоточности, goto используется даже в ультрасовременном golang (микросервисы-каналы-горутины-ралли и вот это вот всё), а использование приема перехода к метке особенно актуально при кодогенерации, когда исполняемый код программно создается по широкому набору условий, и неизвестен заранее...
18. makfromkz 33 19.11.20 07:31 Сейчас в теме
(12) Также поддерживаю, в Фортан4 был оператор вычисляемый Goto
Попробуйте его реализовать по методике структурного программирования, если все метки находятся в линейном алгоритме.

Я когда писал на Си программу эмуляции мультиплексного канала, тоже хотел следовать "структурности", но увидев накладные расходы "структурности", плюнул и вернулся к goto
13. mussolene 17 17.11.20 08:06 Сейчас в теме
В примерах про продолжить (4) просто гениальное использование циклов от аля ХЗ кого. Почему нельзя нормально итератором пройти и цикл не будет бесконечным

Для Каждого Стр Из ТаблицаДанных Цикл
     Если ЭтоБИтыеДанные(Стр) Тогда
           Продолжжить
     КонецЕсли;
     //Обработка вашего кода

КонецЦикла


Очень сложная конструкция я вам скажу(нет)
20. Hans 2 01.12.20 20:50 Сейчас в теме
Написал бы в примерах кода "Правильно", "Неправильно". Я так предполагаю что использование оператора Возврат посреди функции это плохо. Возврат должен быть только в начале или конце.
21. ivanov660 3878 02.12.20 12:10 Сейчас в теме
(20)
1. Там где не правильно и могут быть ошибки я отметил
2. Оба подхода можно применять. Это две "методологии": структурный (без операторов перехода) и "прогрессивный" (используем операторы перехода там где удобно).
3. Вопрос родился из-за существующих двух разных школ при разработке кода на 1С.
22. Hans 2 02.12.20 13:09 Сейчас в теме
(21) Про школы отдельную статью. Что за школы?
23. user636866_pismopriwlo 27.10.21 13:09 Сейчас в теме
Обработка конвертации данных V8Exchan83.epf написана с активным использованием оператора goto
EMelihoff; +1 Ответить
Оставьте свое сообщение

См. также

Ревьювер. Инструмент для проведения code review

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

16.05.2023    2415    leobrn    11    

45

Применение cтандартов и методик разработки конфигураций на практике

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

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

15.05.2023    3366    improg    35    

54

SonarQube: про объемы, ветки, покрытие кода и интеграцию с Gitlab

DevOps и автоматизация разработки Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Опыт применения SonarQube в нескольких командах. Плюс некоторые тонкости: уменьшение объемов базы SQ, интеграция, покрытие кода.

26.02.2023    2497    kraynev-navi    10    

47

Зачем и как читать чужой код? Какой результат ожидаем получить? Основные подходы

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Данная статья является кратким содержанием статей цикла "Как читать чужой код". Цель такой публикации: создать чек-лист различных подходов для чтения непонятного кода. Более подробно каждый из методов можно прочитать в исходной статьей. Последовательность изложения материала полностью совпадает с исходными статьями, и разделена на 4 части.

06.02.2023    2991    biimmap    9    

29

Как проверять код на языке 1С с помощью BSL Language Server

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Некоторые разработчики на платформе 1С не проверяют свой код ни на соответствие стандартам 1С, ни на самые распространённые ошибки кодирования. И если раньше они могли оправдываться отсутствием инструментов для этого, то с появлением BSL Language Server оправданий больше нет.

13.01.2023    3807    aleksei_adamov    10    

45

Без комментариев!

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

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

05.01.2023    5370    ardn    161    

39

Правила работы с транзакциями 1С

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Список правил при работе с транзакциями из BSL Language Server и SonarQube 1C (BSL) Plugin. Переработка и осмысление материала.

01.12.2022    4794    kuzyara    42    

78

Как избавиться от большого количества комментариев в коде с использованием EDT + Git

Рефакторинг и качество кода DevOps и автоматизация разработки Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Публикация освещает вопрос улучшения качества и читабельности кода путем отказа от излишних комментариев. Рассматривается пример из опыта работы команды разработки на EDT + Git. Команда работает в EDT меньше года. Конфигурация сильно доработана и не обновляется типовыми релизами.

15.11.2022    1135    shastin87    5    

9

Рефакторинг и реинжиниринг в повседневной практике

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В этой статье будут затронуты многие темы. Использование WS ссылок, HTTP запросов, асинхронных запросов к внешним сервисам, работа с XML, методики интеграции. Но лишь попутно. Для наглядности. На технических вопросах реализации останавливаться не буду. Все примеры работы с этими объектами есть в коде. Файлы обработки и расширения доступны. Главная цель - рассмотреть рефакторинг и реинжиниринг как инструменты для достижения вполне конкретных практических целей.

20.06.2022    1295    user1374747    0    

7

Модульность в 1С – как следовать принципам DRY в реалиях 1С: Предприятие 8.3

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Принцип DRY – Don't repeat yourself (не повторяйся) – один из классических принципов программирования. Краеугольным камнем реализации этого принципа является модульная архитектура, которую можно реализовать в 1С с помощью расширений. Но экосистемы модулей общего назначения, сравнимой с существующими в других языках, в 1С пока что нет. О том, как спроектировать архитектуру таких модулей и управлять ими с помощью менеджера пакетов, на митапе «Путь к идеальному коду» рассказал технический директор компании «А1» Арсений Геращенко.

03.06.2022    3130    Enigma    3    

22

Красота разработки в 1С, или художественная верстка кода

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рекомендации по верстке и организации кода в 1С, которые я вывел для себя. P.S. Нет, это не про комментарии и номера версий.

02.06.2022    7551    TimofeySin    67    

65

Как выжить, если у тебя в базе 1С 50+ расширений

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Расширения – это простой способ делать доработки на лету. Но администрировать большое количество расширений и не допустить бардак – очень сложно. О том, как выжить в такой ситуации, реализовать управление доработками и установкой актуальных версий расширений, на митапе «Путь к идеальному коду» рассказал Юрий Былинкин – архитектор 1С в компании Аскона.

16.05.2022    6104    ardn    44    

56

Про простой и понятный код

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Внимание! Данная публикация с большой долей вероятности не добавит ничего нового к Вашим знаниям и Вашему опыту, поэтому если Вы читаете Инфостарт исключительно для целей "прокачки" своих навыков, не тратьте на её чтение своё время и перейдите сразу к следующей!

03.12.2021    5511    q_i    161    

71

Как читать чужой код? Часть 1. Общие вопросы. Доработка чужого кода. Code review

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Во всех вакансиях есть требование - умение читать чужой код. Но ни на одних курсах специально этому не учат. Чтобы устранить это противоречие, пишу данную статью. Рассмотрю случаи, в которых нам необходимо разбирать чужой код, поймём, чей код мы пытаемся разобрать, зачем и, главное, как. В статье описан личный опыт длиною в 18 лет начиная с версии платформы 7.7. Статья будет большой, набираемся терпения). Статья содержит в себе описание сценариев разбора кода, т.е. набор шагов. В статье не получится показать это на практике. Для этого планирую сделать онлайн или оффлайн курс, где на примерах будет показан разбор незнакомого кода. Статья разбита на 4 публикации для удобства изучения.

20.09.2021    13265    biimmap    55    

137

Распространенные ошибки разработчиков, приводящие к проблемам производительности

HighLoad оптимизация Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Рассмотрим примеры ошибок, анализ, исправление и мероприятия по недопущению подобного в будущем. Всего будет 18 примеров.

02.08.2021    16503    ivanov660    77    

142

Антипаттерны программирования в 1С

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Поговорим про плохой стиль программирования и рассмотрим 17 часто встречающихся антипаттернов.

19.07.2021    13087    ivanov660    121    

69

Чек-листы для проведения Code Review

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Бесплатно (free)

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

17.05.2021    11649    Shining_ninja    99    

129

Эффективные приемы разработки

Математика и алгоритмы Рефакторинг и качество кода СКД Платформа 1С v8.3 Бесплатно (free)

На Infostart Meetup Ekaterinburg.Online выступил Сергей Наумов – руководитель центра аналитики и консалтинга WiseAdvice. Сергей поделился с коллегами приемами разработки, которые помогут избежать потенциальных проблем при реализации сложных проектов.

07.04.2021    5325    SergeyN    13    

39

Ускорение расчета себестоимости УПП 1.3 в несколько раз

Рефакторинг и качество кода Закрытие периода Платформа 1С v8.3 1С:Управление производственным предприятием Бухгалтерский учет Управленческий учет Бесплатно (free)

Как определить причину медленного расчёта себестоимости в УПП 1.3, один из вариантов поиска проблем производительности с помощью инструментов 1С и ускорения расчёта средствами встроенного языка

02.02.2021    5723    RPGrigorev    23    

40

Практика применения DevOps. Работа с SonarQube

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Во второй части мастер-класса «Практика применения DevOps» на конференции Infostart Event 2019 Inception выступил Виталий Подымников – он рассказал про процесс проверки качества кода и использование SonarQube для работы с ним.

07.12.2020    16374    arcius_7012    21    

84

Чистый кот (Clean cat)

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

От автора легендарного бестселлера "Совершенный кот".

04.11.2020    2467    vasilev2015    25    

5

Доработайте это "немедленно", или как уменьшить доработки конфигурации

Рефакторинг и качество кода Платформа 1С v8.3 Россия Бесплатно (free)

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

25.09.2020    5035    Богатырев Артур    24    

14

Как найти неиспользуемый код

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Описание нескольких способов поиска и определения неиспользуемого кода

03.08.2020    6072    Infostart    29    

71

Как поставить качество кода на поток и при этом не разориться? Какие шаги стоит сделать уже завтра, чтобы повысить планку качества?

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Наличие в 1С-решениях некачественного кода мешает их поддержке и эффективному развитию. Как добиться соблюдения стандартов разработки при написании кода и внедрить бюджетный Code Review с помощью инструментария на основе АПК (Автоматизированной проверки конфигураций) на конференции Infostart Event 2019 Inception рассказал технический руководитель компании Бизнес Лоджик Иван Козлов.

22.06.2020    5192    kozlov.alians    1    

23

Молчание "best practices": тестовые и эталонные данные, структура и связность, падения и новая функциональность, и другие неудобные вопросы к сценарному тестированию

Рефакторинг и качество кода Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Непонимание некоторых базовых вопросов мешает программистам начать применять инструменты тестирования в процессе разработки для 1С. Как разобраться в терминологии и интегрировать процесс тестирования в разработку 1С-решений на конференции Infostart Event 2019 Inception рассказал руководитель отдела разработки компании C.T.Consultants Решитко Дмитрий.

29.05.2020    6935    grumagargler    14    

49

Рефакторинг в редакторе модулей

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Для тех, кто не пользуется Ctrl+Alt+R. “Контролируемый процесс улучшения кода без написания новой функциональности”, “Равносильное преобразование алгоритмов” и т.п в данной статье НЕ рассматриваются. Тема статьи: замечательные команды из подменю Рефакторинг контекстного меню редактора модулей в конфигураторе. В статье описано, как команды из подменю Рефакторинг помогают при написании кода

10.03.2020    6105    pparshin    6    

52

Качество кода: Поведенческие паттерны проектирования

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Поговорим про применение паттернов проектирования в разработке на 1С.

03.03.2020    12721    ivanov660    0    

83

Боремся с запросами в циклах. Мой опыт рефакторинга запросов

Рефакторинг и качество кода Запросы Конфигурации 1cv8 Бесплатно (free)

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

02.03.2020    14458    aximo    55    

72

Код разработчика в зависимости от опыта работы

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Пятничный пост! Как меняется код разработчика в зависимости от опыта работы.

14.02.2020    13671    Infostart    229    

106

Стабильность превыше всего

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Странная заметка о поддержании стабильности в условиях интенсивного изменения конфигурации.

07.11.2019    11007    Infostart    41    

75

Оценка скорости кода. Сложность алгоритма

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта тема одной из первых всплывает на собеседовании программистов языков вроде Java и C, но она почти неизвестна в "мире 1С". Поговорим о вычислительной сложности алгоритмов.

07.10.2019    7709    m-rv    12    

16

Управление качеством кода

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

О SonarQube, АПК, EDT. Какие преимущества дает их использование. Для каких команд подходит.

22.07.2019    23130    Stepa86    40    

179

По следам код-ревью

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Приведу примеры с картинками и небольшим пояснением по вопросам, связанным с код-ревью (обзором кода).

09.07.2019    16322    ivanov660    112    

117

Совершенный коТ (Cat complete)

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Стандарты программирования в картинках. Самоирония прилагается.

03.06.2019    11285    vasilev2015    150    

69

Даем названия переменным: как префиксы экономят наше время

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Понятные названия переменных экономят время и силы разработчика : в начале, когда мы даём названия переменным, в процессе развития разработки, когда мы "на лету" понимаем назначение той или иной переменной, в конце, когда мы передаём разработку на поддержку других программистов, сами переходя к новым разработкам

06.05.2019    11629    Designer1C    86    

13

Логические выражения и красивый код

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

В данной статье я хочу поделиться своей практикой применения логических выражений при написании кода. Учитывая тот факт, что платформа 1С 8.х использует сокращенный цикл вычисления логических выражений, можно заменить громоздкие конструкции “Если Тогда ИначеЕсли КонецЕсли” на красивую и лаконичную запись, похожую на список операций.

20.04.2019    37680    Vortigaunt    88    

58

Антидот

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Необходимое лекарство для тех, кто случайно передозировал чтение статей о хорошем-плохом программировании на 1С.

22.01.2019    8019    mkalimulin    183    

23

Быстрый способ разобраться в чужом коде

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Добрый день! Хочу рассказать о способе, который позволит быстро разобраться в чужом коде. Я, конечно, думаю, что это жесткий баян, но не видел, чтобы кто-то пользовался этим способом. По крайней мере, новичкам точно будет интересно.

29.12.2018    13114    wizard.ilmir02    22    

78