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

19.07.21

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

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

Давайте сначала дадим трактовку понятию антипаттерн.

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

"Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку." - Мартин Фаулер.

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

Все эти антипаттерны затрудняют выполнение код-ревью или обзор кода в вашей команде! 

 

1. Название функций и процедур с большим количеством сокращений и аббревиатур

Процедура Док_МСТ_для_БЛМ()

//...

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

Функция Преобр_НСТ_в_СПТР()

// ...

КонецФункции

Или так:

Процедура Док_МСТ_для_БЛМ(Отказ)

   Массив = Преобр_НСТ_в_СПТР();
   
   Для каждого элемент из Массив Цикл
       Если ПР_На_ВЗ_и_КВД(элемент) Тогда
            Сооб_ПИОВД(элемент, Отказ);
       Иначе
            Обр_ДляСТР(элемент);
       КонецЕсли;
   КонецЦикла;

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

Верно же, что – краткость – сестра таланта. Ну и что что программисты коллеги, которые после Вас будут зависать на 30 минут пытаясь понять, что это значит и зачем нужно.

Запомните! Ни в коем случае не пользуемся встроенным в конфигуратор или EDT функционалом "Рефакторинг" и не добавляем описание функции. Помните, что не стоит кликать кнопкой мыши на функции, вызывать контекстное меню и выбирать команду "Создать описание функции".

 

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

 

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

 

ПользовательXml, пользовательxml, пользовательXML, ПользовАтельXML 


3. Необоснованное сокращение названий переменных

 

Зачем писать «АвторизованныеПользователи», когда можно просто написать «Пользователи», а еще лучше просто «Массив». Пусть кто-то другой напряжет мозги и полезет читать весь код функции выше и попробует понять, что же содержит все-таки эта переменная и зачем она нужна.

К примеру, у нас может быть несколько функций, возвращающих различные массивы данных о пользователях:

Функция ПолучитьАП()
	Пользователи = Новый Массив;
	мСоединения=ПолучитьСоединенияИнформационнойБазы();
	Для каждого ЭлементМассива Из мСоединения Цикл
		Пользователь = ЭлементМассива.Пользователь; 
		Пользователи.Добавить(Пользователь);
	КонецЦикла;
	Возврат Пользователи;
КонецФункции

Функция ПолучитьПБ()
	
	Пользователи = Новый Массив;
	Выборка = ПользователиИнформационнойБазы.ПолучитьПользователей(); 
	Для Каждого ЭлементМассива Из Выборка Цикл 
		ИмяПользователя = ЭлементМассива.Имя; 
		Пользователи.Добавить(ИмяПользователя);
	КонецЦикла;
	Возврат Пользователи;	
КонецФункции

И далее где-то будет следующий код: 

//..
// много кода
//..
// где-то тут получаем данные о пользователях

Пользователи = ....

//..
// много кода
//..

Для каждого ЭлементМассива из Пользователи Цикл // ? что тут ищем вверху по коду
	//..	
КонецЦикла;

//..

 

4. Использование одной и той же переменной для всех действий в коде и присвоение им ничего не значащих имен

 

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


Для каждого тмп из ТаблицаТовары Цикл
    Если тмп.Цена=0 Тогда
        Сообщить("Внимание в таблице не заполнена цена!");
    КонецЕсли;
КонецЦикла;

Если ТаблицаТовары.Количество()=1 Тогда
    тмп = "Всего одна строка";
КонецЕсли;

Если НЕ тмп="" Тогда
     Сообщить(тмп);
КонецЕсли;

 

Или так:

Процедура ПрограммноеСозданиеТаблицы(Таблица)
    Для Каждого тмп из Таблица Цикл
       // создаем группу
       Перем1 = СозатьПрограммноЭлементФормы(тмп, Тип("ОбычнаяГруппаФормы"));
       // создаем поле надписи внутри группы родителя
       Элемент1 = СозатьПрограммноЭлементФормы(тмп, Тип("ПолеФормы"), Тип("ПолеНадписи"), Перем1);
       // создаем декораци внутри группы родителя
       Элемент2 = СозатьПрограммноЭлементФормы(тмп, Тип("ПолеДекорации"),,Перем1);
       Элемент2.Заголовок = "декорация";
       // создаем кнопку внутри группы родителя за декорацией
       Элемент =  СозатьПрограммноКомандуФормы(тмп,Перем1,Элемент2);
    КонецЦикла;
КонецПроцедуры

 

5. Нет форматирования. Разработчик никогда не использует авто форматирование, не знает про комбинацию "Shift+Alt+F"

 

Авто-форматирование кода убивает любую индивидуальность кода. Стремитесь к неповторимости. Так и только так можно стать великими разработчиками, которых будут помнить и всегда вспоминать "хорошим" словом коллеги программисты.

//...
МассивСтрок = Новый Массив;
Если ЗначениеЗаполнено(Организация) Тогда
Для Каждого тмп из ТаблицаТовары Цикл
    Если НЕ тмп.Организация=Организация Тогда
МассивСтрок.Добавить(Новый Структура("стр",тмп));
КонецЕсли;
    КонецЦикла;
КонецЕсли;
//...


6. Кодирование в одну строчку кода

 

Длина не важна, главное, чтобы текст помещался на экране и желательно в одну строчку. Кто-то будет отлаживать код? Зачем? Он же идеальный)

Попытка Объект.Записать(); тмп = истина; Исключение Сообщить(ОписаниеОшибки())  КонецПопытки;

Или так:

Если НЕ ЗначениеЗаполнено(Организация) Тогда Организация=ПолучитьОрганизациюПоУмолчанию(); КонецЕсли;

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


ТаблицаДанных = ПолучитьТаблицуДанных(ИсходнаяТаблицаУсловий, Параметры, Организация, Партнер, ИспользоватьДоговоры, Итина, СписокЗначений);

 

7. Ненужная усложненность, однострочные вложенные сокращения и оператор «?» вместо использования условий

 

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

Запрос = Новый Запрос(ПолучитьТекстЗапроса());
ИспользоватьКонтроль = ?(ЗначениеЗаполнено(Партнер),?(ЗначениеЗаполнено(Договор),?(Договор.Контроль=Истина,Истина,Ложь),Ложь),Истина)
Запрос.УстановитьПараметр("ИспользоватьКонтроль", ИспользоватьКонтроль);

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

 МассивСтрок = Новый Массив;

Для каждого стр из ТаблицаТовары Цикл

    Если стр.Количество<>0 Тогда
        // добавим в массив строки по условию...
        МассивСтрок.Добавить(Новый Структура("стр,ключ",стр, Новый Структура(Новый УникальныйИдентификатор()))));
    КонецЕсли;

КонецЦила;

 

8. Большое количество параметров в функции 

 

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

Не стоит использовать структуру для свертки параметров или использовать хранилище данных.

Функция ПолучитьДанныеПоЗадаче(МассивВходныхДанных, Организация, Контрагент, Соглашение=Неопределено, Договор=Неопределено, Валюта=Неопределено, ТипОтношений=Неопределено .... )
//...
// что-то делает
//...
КонецФункции

 

9. Использование вложенных вызовов большой глубины или слоеный пирог

 

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

//...
// вызываем для получения параметров функции, в которых также вызываем вложенные
// хорошо, что еще не в одну строчку записали)
РезультатОбработки = ПолучитьДанныеПоЗадаче(
          МассивВходныхДанных,
          ПолучитьОрганизациюИзДокумента(ДокСсылка, ПолучитьОрганизациюПоУмолчанию()),
          ПолучитьКонтрагентаИзДокумента(ДокСсылка),
          ПолучитьСоглашение(ДокСсылка,ПолучитьСоглашениеПоУмолчанию(ПолучитьОрганизациюПоУмолчанию())));
//...


10. Повсеместное дублирование кода 

 

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

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

 

11. Использование стиля "Рваный запрос" или "Рваная строка"

 

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

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

В этом случае не стоит как-либо продумывать структуру запроса, использовать "Схему Запроса" или специальные функции из БСП для установки параметров динамических списков (из общего модуля "ОбщегоНазначенияКлиентСервер" функции "УстановитьЭлементОтбораДинамическогоСписка") и т.п.

Также, если вам надо составить какое-либо сообщение для пользователя пишите именно так как есть соединяя все в одной строчке:

ТекстСобщения = "В строке №" + НомерСтроки + " не заполнена колонка " + ИмяКолонки.

И не в коем случае не пользуйтесь функцией "СтрШаблон" - предавая шаблонизированную строку ("В строке №%1 не заполнена колонка %2") и параметры. 

 

12. Возврат разных типов данных для функций

 

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

Функция ПолучитьРезультатОбработкиДанных(Ключ, Данные)
	
	РезультатФункции = Неопределено;
	
	Если Ключ=42 Тогда
		// вернем массив
		РезультатФункции = Новый Массив;
		Для каждого стр из Данные Цикл
			РезультатФункции.Добавить(стр);
		КонецЦикла;
	ИначеЕсли Ключ=Неопределено Тогда
		// вернем тип первого элемента данных
		РезультатФункции = Данные[0];
	Иначе
		// вернем строку
		РезультатФункции = "Не поддерживается обработка!";
	КонецЕсли;
	
	Возврат РезультатФункции;
	
КонецФункции

 

13. Использование магических цифр

 

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

ДеньКонтроля = ТекущаяДата()+60*60*24;

Или так:

Если Количество=42 Тогда
     Цена=Цена*2;
КонецЕсли;

 

14. Использование жесткого кодирования

 

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

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

    //Помещаем обработку во временном хранилище
    АдресХранилища = "";
    Результат = ПоместитьФайл(АдресХранилища, "C:\Temp\ВнешняяОбработка.epf", , Ложь);           
    ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
    
    // Откроем форму подключенной внешней обработки
    ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма");

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

&НаСервере
Функция ПодключитьВнешнююОбработку(АдресХранилища)

    Возврат ВнешниеОбработки.Подключить(АдресХранилища);

КонецФункции 

 

15. Всегда все делаем свое или изобретаем велосипеды 

 

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

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

Эта методика позволит максимально запутать Ваш программный код и тогда кроме вас поддерживать его уже никто не сможет.

 

16. Синдром 80-го уровня или чрезмерная сложность

 

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

"Для полноценной конфигурации достаточно 1-го справочника, 1-го документа и 1-го регистра" - автор неизвестен.

 

17. Не будем ничего удалять, а вдруг пригодиться

 

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

 

 

P.S. А если серьезно, то:

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

 

Ссылки на полезные статьи:

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

См. также

Когда понадобился новый оператор

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

Когда понадобился новый оператор, но его нет в синтакс-помощнике, что делать?

18.03.2024    1164    ZhokhovM    2    

4

Когда разработчик платформы не добавил проверку препроцессоров

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

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

18.03.2024    2702    ZhokhovM    4    

9

Реструктуризация - бесконечная история

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

При разработке программ требуемый функционал ставят на первое место, но есть еще и архитектура программы. На горизонте 5-10 лет она становится важнее функционала, который должен работать при масштабировании и росте данных. Реструктуризация 5 терабайтной базы 1С 8.2 в формат 1С 8.3, складывает весь пазл архитектурных просчетов, которые сделали ради функционала. Как это исправить? - для разработки правильной архитектуры, нужно всего лишь сместить фокус с функционала и подумать о «вечном».

29.09.2023    1910    1CUnlimited    15    

22

Чистый код. Мой взгляд на жизнь в макаронных джунглях. Часть 2

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

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

27.09.2023    6973    Lemmonbri    136    

36

Чистый код. Мой взгляд на жизнь в макаронных джунглях. Часть 1

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

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

19.09.2023    4355    Lemmonbri    16    

31

5 подходов при доработке конфигурации 1С, чтобы в будущем не было мучительно больно её обновлять

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

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

10.08.2023    9595    0    1c-izhtc    37    

21

Задача на ошибки и неоптимальности при проведении приходной накладной

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

Задачу эту дают на собеседованиях, видимо, те франчи, которые не в состоянии оценить человека по резюме и в ходе беседы. По идее задачи, подобные этой, должны давать начинающим студентам. Но дают всем подряд. Итак: мои 5 копеек. Критика приветствуется.

11.07.2023    2218    magic1s    32    

11
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. a_a_burlakov 285 19.07.21 10:04 Сейчас в теме
Просто хочу оставить комментарий светлой памяти людям, которые работали с запросом из п.16, земля вам пухом.
nekit_rdx; Рамзес; user798534; maksa2005; rovenko.n; Artios; user1211160; VladimirMelnychenko; ProgrammistC; +9 Ответить
5. lunjio 66 19.07.21 13:37 Сейчас в теме
(1)
которые работали с запросом из п.16, земля вам пухом.

Как-то доходилось разбираться в запросе на 6 тыс строк, УТ 10.3, парнишка был просто волшебник, сама процедура на 10 тыс строк, что там за муть творилась, в целом понял, а вот по деталям терпения не хватило разобраться )
TerveRus; +1 Ответить
10. ivanov660 4332 19.07.21 14:04 Сейчас в теме
(5)А что будет если придет задачка от бизнеса поправить алгоритм (очень надо), а парень уволился?
16. lunjio 66 19.07.21 14:39 Сейчас в теме
(10)
парень уволился?

Так и было, но проблема была в том, что алгоритм походу уже был рудинментом, в таких случаях легче было свой написать. По сути с таким часто и сталкиваешься и как правило такие волшебники, а чаще волшебницы хорошо ладят с всякими бухгалтерами и прочими и воспоминания о них у пользователей хорошие в большинстве ))))
JohnConnor; Рамзес; t278; +3 Ответить
73. TimkoNzt 21.07.21 00:27 Сейчас в теме
(5) Аналогично, 3000 строк. Работы - всего ничего - изменить алгоритмы некоторых полей и добавить новых на основе старых. Внезапно захотелось уволиться.

Сами по себе запросы на 80 уровней очень даже читаемы, если на каждом уровне нет избытка логики. Но вот такое... это просто мрак.
Прикрепленные файлы:
Capitullo; TerveRus; svetanik; Рамзес; triviumfan; DJ_Codebase; +6 Ответить
79. zawal 15 21.07.21 14:46 Сейчас в теме
(73)ООО это 18 пункт, делать расчеты и вычисления в запросе!!!
20. rpgshnik 3633 19.07.21 15:43 Сейчас в теме
(1) главное чтобы в этом запросе временные таблицы хотя бы имели смысл какой-то, а не просто Т из Т... и Т1 из Т1 погоняет. А так обычное дело зависит от задачи и портянки, которую хочет собрать ПЭО в одном окне. Они такое любят. Мне потом ещё подходил и говорил, а можно в каждой ячейке ещё диаграммы вывести?)) А так самое страшное был отчёт с запросом, который написал и назвал в честь АК-47 : )))
eLeMeNtaLe; +1 Ответить
33. eLeMeNtaLe 19.07.21 17:37 Сейчас в теме
(20)А ещё очень нравится когда в таких пакетных запросах создают кучу временных таблиц, дают им имена красивые. А потом когда их в следующих пакетах используют, то там им уже дают не менее красивые псевдонимы. И ты как дурак ищешь в списке эту таблицу, а её там нет, и начинаешь тыкать по ним правой кнопкой мыши -> исправить, чтоб понять откуда данные. Спрашивается зачем, чем тебя не устроило назначенное тобой же имя временной таблицы? Х))
JohnConnor; Рамзес; TimkoNzt; comptr; +4 Ответить
86. rpgshnik 3633 22.07.21 08:39 Сейчас в теме
(33) Привет, Олег :) Тут уже нужен опыт читать запросы без конструктора, раньше тоже смотрел через правую кнопку изменить таблицу)
88. eLeMeNtaLe 22.07.21 09:12 Сейчас в теме
(86)Дак я и не спорю, если запрос пакетов пять, то не проблема прочесть без конструктора и понять что он делает. А если в нем пакетов так десять? Уже сложно держать в голове что откуда пришло и как используется, приходится идти в конструктор, чтоб пошагово пробежать по запросу. Да и опять же, в чем сакральный смысл использовать псевдонимы виртуальных таблиц? Назови её изначально как нужно и используй, а тут такое ощущение что автор запроса страдает неуверенностью. ))
ivanov660; +1 Ответить
63. olololeg 20.07.21 13:35 Сейчас в теме
(1)Типичный запрос из ЗУПа)
Alexsh_kz; Сто27001; shalupov61; +3 Ответить
108. DVP 23.07.21 15:34 Сейчас в теме
2. rpgshnik 3633 19.07.21 11:46 Сейчас в теме
Коричневый код :) было кстати подобное тут у же не раз) топ конечно был https://infostart.ru/1c/articles/966234/
for_sale; +1 Ответить
3. ivanov660 4332 19.07.21 11:52 Сейчас в теме
(2) Что-то было, чего-то не было.
Но освежать в памяти подобные вещи требуется обязательно, т.к. к сожалению подобные приемы продолжают встречаться повсеместно.
rpgshnik; +1 Ответить
4. ildary 21 19.07.21 13:20 Сейчас в теме
Самое неприятное - находить антипаттерны в своём старом коде, когда уже давно исправился и пишешь правильно - лицо становится как у капитана на иконке статьи.
nekit_rdx; Рамзес; maksa2005; rabota.v8.1c; zawal; olololeg; rabid_otter; rpgshnik; ivanov660; Климов Сергей; +10 Ответить
7. CheBurator 3119 19.07.21 13:59 Сейчас в теме
(4) ну ведь работало пару лет? и никто не приставал с вопросами по операторам кода?
rpgshnik; +1 Ответить
9. ivanov660 4332 19.07.21 14:01 Сейчас в теме
(4)Если совсем правильно, то создаем задачу на рефакторинг и избавляемся от технического долга. Мы так стараемся делать)
6. CheBurator 3119 19.07.21 13:58 Сейчас в теме
"Использование вложенных вызовов большой глубины или слоеный пирог"
- здесь читатели кода типовых ржут или плачут...?
4erv; nekit_rdx; pm74; Aggressorak; svetanik; Рамзес; so-quest; GatoDelgado; Сто27001; v3rter; DJ_Codebase; lmm; maksa2005; semagin@gmail.com; unknown181538; Trucker; user1485342; dusha0020; bulpi; Birby; hamka; zhuntovda; kembrik; rabid_otter; axelerleo; Ta_Da; user1346935; Yashazz; +28 Ответить
8. ivanov660 4332 19.07.21 14:00 Сейчас в теме
(6)Я верю, что взойдет она.... Что когда-нибудь они причешут свой код.
По факту лучше так стараться не делать на своих проектах и в своем коде.
15. CheBurator 3119 19.07.21 14:39 Сейчас в теме
(8) "когда-нибудь они..."
- спасибо, поржал.
у них времени не хватает ошибки выявлеямые фиксить. куда тут до рефакторинга
rabid_otter; Ta_Da; +2 Ответить
11. Yashazz 4709 19.07.21 14:09 Сейчас в теме
Самоочевидный баян, сто раз уж было. А половина, как минимум, перечисленного - является постоянной практикой БСП, и ничего, всем норм.

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

Нечто в духе:
1. Назовите ваш реквизит формы "РеквизитФормы" или "СписокЗначений". Тогда коллеги точно поймут, что это за фигня, ну и пусть, что при очередном обновлении платформы компилятор начнёт выдавать чудеса, а сторонние программы парсинга кода затупят - ничо!
2. Обязательно вкладывайте области в области, старайтесь выдерживать единообразие имён. Называйте области одинаково - тогда тот, кто попробует рефакторить, остро поймёт, что от перестановки фрагментов кода сумма (т.е. результат) весьма меняется!
3. Накрутите побольше групп-в-группах-в-группах, намутите декораций. Любое вмешательство в такую УФ резко исказит её и добавит здорового интереса даже при попытке подравнять кривое выравнивание. Используйте всю ширь монитора - у кого ноуты, пусть сами разбираются. Юзайте имена своих групп "Группа1" итд. в коде, массово программно меняйте всё, что можно - тогда никто не соскучится!
4. Запилите 90 ресурсов в регистре сведений, 50 реквизитов в таб.части документа, и побольше параметров сеанса да ролей. Много не мало, сразу будет ощутим масштаб, замах и глобальность! Назовите реквизит справочника "Ресурс" или "ТипЗначения". Обязательно сделайте несколько разделителей учёта, разделяйте и властвуйте!
5. Забабахайте ПФ из одноячейных секций, собирайте "по кирпичикам". Гибкость и шикарный внешний вид! А, и тоже меняйте программно после вывода в таб.документ, пост-обработкой. Можно насовать картинок. Смело юзайте объединённые ячейки, копируйте из эксельчиков, как оно там - вам быстрее, другим прикольнее!
6. Обязательно пишите справочную информацию. Фразы "Приход денег - это документ, отражающий денежный приход" или "Себестоимость должна рассчитываться согласно алгоритму расчёта себестоимости" - обязательные мантры для просветления, вас и всех соучастников.

Так вот, коллеги, каждый из нас в таком духе может нагнать пурги на стопицот килограммов. Но зачем?..
TerveRus; nekit_rdx; Dementor; sulfur17; papami; rovenko.n; semagin@gmail.com; pogroleg; Dorosh; vano-ekt; bulpi; dhurricane; lunjio; Ygich; rabid_otter; rpgshnik; +16 2 Ответить
13. brr 182 19.07.21 14:19 Сейчас в теме
(11) К п.5. всю логику разместите в одном методе, ну и что что в нём 10000 строк.
46. dhurricane 20.07.21 08:54 Сейчас в теме
(11) А что за боль с областями модулей и печатными формами? Я, видимо, с таким не сталкивался, потому не смог прочувствовать, но стало любопытно.
78. biimmap 1835 21.07.21 14:38 Сейчас в теме
(11) Оно может и баян, но количество говнокодеров не уменьшается почему-то... Значит надо включать принцип "повторение - мать заикания". Доводить говнокодеров до этого состояния, чтоб они боялись писать такой код. А повторять после 3 раза лучше матом! Так будет страшнее.
Рамзес; zqzq; ivanov660; +3 Ответить
83. Yashazz 4709 21.07.21 17:09 Сейчас в теме
(78) эти статьи, скорее, крик души после наблюдения очередных килотонн говнокода и говноархитектуры... Но да, согласен.
87. zqzq 23 22.07.21 08:47 Сейчас в теме
(78) Это вечный процесс... Новички лучше всего учатся на собственных граблях...

Также, напомнило:
https://weblogs.sqlteam.com/jeffs/2006/03/30/9471/
https://habr.com/ru/post/347166/
111. ivanov660 4332 23.07.21 18:10 Сейчас в теме
(11)
1. Сеньоры, конечно могут нагнать подобной "пурги" и должны знать все это. Но вот начинающие точно нет и мидлы не уверен что все.
2. Вот возьмите и напишите статью, тезис у вас уже заготовлен. Судя по плюсам она хорошо "выстрелит", от меня точно будет звезда.
112. Yashazz 4709 23.07.21 18:19 Сейчас в теме
(111) Статьи такого рода - трепотня "за жисть" и вода, я предпочитаю более по делу публиковать.
113. ivanov660 4332 23.07.21 18:23 Сейчас в теме
(112)Позиция ясна, чисто практически подход тоже хороший вариант.
12. brr 182 19.07.21 14:16 Сейчас в теме
Забыли про методы на многие тысячи строк, с цикломатической сложностью около 300.
14. Hans 2 19.07.21 14:26 Сейчас в теме
Где антипатерн использования процедур и функций размером больше 2-3х экранов.
for_sale; +1 Ответить
84. biimmap 1835 21.07.21 17:35 Сейчас в теме
(14) в сложных доработках этого нельзя избежать. Точнее код будет трудно читабельным.
89. Hans 2 22.07.21 09:28 Сейчас в теме
(84) Есть пример сложной процедуры которую нельзя разбить на более мелкие?
for_sale; +1 Ответить
93. biimmap 1835 22.07.21 10:03 Сейчас в теме
(89) У меня есть 2 огромные обработки по 6000 строк кода. Одна - это конструктор выгрузки данных из ЗУП, вторая преобразование управленческих табелей в регламентированные. и там и там есть по несколько процедур, из которых часть кода если убрать то станет нечитабельно. Одна из процедур например получается кадровые данные. Казалось бы чё сложного))) Но даже с использованием программных интерфейсов, потом запросами данные обрабатываются и получается много кода.
95. Hans 2 22.07.21 11:41 Сейчас в теме
(93) Дай посмотреть обработки что бы определить, бывают ли такие случаи, а то я не верю, что в некоторых случаях надо делать функции большими.
for_sale; +1 Ответить
99. Areal 14 22.07.21 21:46 Сейчас в теме
(93) Вообще, любую задачу, имеющую более одной логически обособленной строки кода, можно декомпозировать. Просто, иногда, задачи(функции) слишком маленькие и теряется смысл разбивки. Боюсь, что если программист убежден, что функция на 6000 строк это нормально - нужно декомпозировать уже его.
TerveRus; ubnkfl; v3rter; +3 1 Ответить
100. biimmap 1835 22.07.21 21:55 Сейчас в теме
(99) Вы не внимательно читаете. Написано не про функцию, а про обработку. аргументы приведены. Выпендрёжь не к месту.
114. Areal 14 25.07.21 01:37 Сейчас в теме
(100) "Выпендрёж", как Вы выразились - фраза, свидетельствующая о грубости оппонента. Во первых - вся статья о кодинге, а не обработках, во вторых - тред начинается с

"Где антипатерн использования процедур и функций размером больше 2-3х экранов."

и продолжается

"Дай посмотреть обработки что бы определить, бывают ли такие случаи, а то я не верю, что в некоторых случаях надо делать функции большими."

что явно говорит о его процедурном/"функционном" контексте. Но в любом случае, удачи Вам с Вашими процедурами/обработками на 6000 строк
TerveRus; ubnkfl; biimmap; +3 Ответить
17. Aftee 19.07.21 14:52 Сейчас в теме
п. 16 - типичный отчет в ЗУП 3.1
75. Sardukar 58 21.07.21 08:50 Сейчас в теме
18. Yashazz 4709 19.07.21 14:54 Сейчас в теме
А ещё есть отличные переменные, "МояУправляющаяПеременнаяДляОднократногоХраненияВременногоЗн­аченияИмениНуралиеваБГ"

А ещё есть функциональные опции "ИспользоватьМеханизм" и "НеИспользоватьМеханизм", строго по заветам БСП

Ну и понятное дело, самые нужные переключатели надо запихнуть на такую форму, найти которую на просторах интерфейса - мегаквест)
TerveRus; +1 Ответить
32. brr 182 19.07.21 17:36 Сейчас в теме
(18)Ахах, точно НовыйМеханизмКонтроляОстатков, НовыйОтчетПоОстаткам, НовыйОтчетПоОстаткам_NEW.
TimkoNzt; +1 Ответить
19. rpgshnik 3633 19.07.21 15:33 Сейчас в теме
Я бы пожалуй ещё добавил обязательно пункт писать то на латинице, то на русском. Вот реально бесит когда видишь, что человек не вынужденно использует латиницу, это №18.
ivanov660; +1 Ответить
21. amd1986 19.07.21 15:43 Сейчас в теме
Некоторые пункты спорные.

4. Возможно будет меньше потребления памяти для выполнения процедуры/функции
6. Не вижу сложности, если конструкция небольшая. Также вроде как быстрее выполняется код.
6. Непонятна нелюбовь к ?. Вполне себе рабочая функция
11. Зависит от задачи. Возможно так сделать оптимальнее. Но есть еще определенные хаки, упрощающие жизнь.
12. Как бы да, но не смертельно.
15. В БСП может и есть нужный функционал, но не факт что он выполняется быстро и не факт что через пару релизов этот функционал будет работать. Поэтому тут все зависит от задачи.
16. Зависит от запроса и опыта
Alex1c; v3rter; Sardukar; zhuntovda; +4 Ответить
29. dhurricane 19.07.21 17:10 Сейчас в теме
(21) Давайте попробуем поспорить. :-)

4. Копейки. Больше памяти будет отнято у разработчика, читающего код.
6. Сложно анализировать изменения такого кода. Сложно выцеплять из всего листинга программы привычные конструкции. Быстрее будет работать только под отладкой.
7. Нелюбовь не столько к оператору, сколько к монструозным конструкциям, которые с помощью него пишут.
12. Ни один из 17-ти приведенных пунктов не является смертельным. :-)
15. Если быстродействия действительно не хватает, то может и стоит писать свое. С другой стороны не факт, что и Ваш код будет выполняться быстро. Что касается неработающего функционала, то не стоит так переживать сильно, если Вы, во-первых, используете только публичные методы, и во-вторых, используете инструменты стат. анализа, либо читаете документацию по переходу на новые релизы. В конце концов устаревшие методы в БСП живут очень долго.
16. О чем и речь. Более опытных разработчиков призывают писать запросы, перевариваемые даже менее опытными коллегами.
v3rter; dvissarov5; ivanov660; +3 Ответить
40. amd1986 19.07.21 18:57 Сейчас в теме
(29)
4. Все зависит от требований. Хотя я также придерживаюсь такой рекомендации, т.к. сложнее отлаживать.
6. Кому как
7. Когда большая конструкция, то да. Когда нет - то нет(если, конечно, оплата не по строкам кода)).
15. Я уже более 10 лет пишу различные решения для типовых конфигураций и подстав от БСП словил массу, поэтому, конечно, БСП использую, но аккуратно. Основная проблема - клиент установил и настроил интеграцию с сайтом/облаком. А затем обновил конфигурацию. обновилась БСП, где пропал/переименовался метод. В итоге клиенту нужно заново ставить интеграцию(если такая есть).А это время/деньги/ресурсы.
16. Опытные разработчики по определению должны писать сложные запросы простым языком.
44. dhurricane 20.07.21 00:22 Сейчас в теме
(40) Ну вот. Почти во всем договорились. :-)

4. Не представляю, какие требования могут здесь повлиять на принятие решения. Я понимаю, когда мы с большими коллекциями работаем. Но вот наличие переменных аукнуться может ну разве что при глубокой рекурсии.
6. Допустим, что Вы действительно с легкостью читаете листинг вне зависимости от того, "лесенкой" там циклы или в одну строку. Но изменения то? Вот при обновлении сравниваете два модуля. И видите изменение лишь в одной строке. Соответственно надо чуть больше сосредоточить внимание, дабы понять, что именно там поменялось: условие цикла или условного оператора, какой-либо из операторов тела или вообще пробел/точку с запятой удалили. Неужели такой подход не будет раздражать все больше и больше с ростом количества подобных конструкций?
15. Я в профессии раза в 1.5 меньше. И считаю, что да, БСП следует использовать аккуратно - в моем понимании это значит стараться использовать только публичный интерфейс. И да, при обновлении конфигурации логично ожидать изменений в ее библиотеках, то бишь обновление конфигурации должно повлечь за собой проверку и обновление интеграций. Ну и как я сказал, устаревшие методы долго живут. Проблемы вдруг всплывают, если делать очень большой шаг в обновлении, либо в промежуточные не проверять использование устаревших методов и не читать документацию по обновлению библиотеки. Странно ожидать от библиотеки сохранения API пятилетней давности в неизменном виде.
16. Ну вот статья как раз и осуждает чрезмерную сложность, созданную искусственно. Значит здесь мы вовсе не спорим. :-)
115. triviumfan 93 26.07.21 11:08 Сейчас в теме
(44) Постоянно пишу
Если Условие Тогда Продолжить; КонецЕсли;

Зачем растягивать это на три строки? Вполне читаемо, тут перегнули палку.
ya.Avoronov; +1 Ответить
116. dhurricane 26.07.21 11:15 Сейчас в теме
(115) Правильно ли я понял, что Вы так пишете исключительно для сжатия листинга кода? Просто в моем представлении, написать в одну строку на толику усилий больше, нежели писать как обычно. Потому и возникает вопрос "зачем?"
117. triviumfan 93 26.07.21 11:37 Сейчас в теме
(116) Лаконично + быстрее читается.
усилий больше, нежели писать как обычно
Прикрепленные файлы:
119. dhurricane 26.07.21 12:14 Сейчас в теме
(117) Ну что непонятного то? :-)

На своем примере: я использую шаблоны текста в конфигураторе. Они мне сразу после ввода "Если" расставляют "Тогда" и "КонецЕсли" на нужных позициях плюс отступ для тела условного оператора. Стало быть, если я захочу вписать все в одну строку, мне потребуется выполнить дополнительные телодвижения, дабы удалить лишние отступы и переносы строк.

Если же шаблоны не используются, будет чуть проще. Я предполагаю, что при наборе "Если ... Тогда.." уже на уровне мышечной памяти мизинец хочет ударить по клавише "Enter" :-) И его нужно вовремя остановить, в противном случае также придется удалять лишние пробельные символы.

Вот эти дополнительные мысли и действия я имел ввиду, когда писал про "толику усилий". :-)

Это что касалось картинки. Что касается объяснения: "лаконично" - безусловно, "быстрее читается" - не представляю даже, как это померить или хотя бы обосновать.
41. zhuntovda 1 19.07.21 19:54 Сейчас в теме
(21) Абсолютно согласен! Хотел подобное написать!
22. kser87 2438 19.07.21 15:57 Сейчас в теме
Количество различных объектов метаданных и сложность запросов определяются предметной областью все же. А в остальном хорошо сказано. Добавил бы ещё странную манеру в результат всех функций пихать структуру.
27. rabid_otter 134 19.07.21 16:50 Сейчас в теме
(22)
в результат всех функций пихать структуру

как жаль, что в 1С не завезли кортежей, поэтому и пихают в хеш-таблицу или недокласс результат работы функции.
это имхо гораздо лучше, чем в один параметр забубенить все
28. AntonProgma 46 19.07.21 17:04 Сейчас в теме
(27) они думают, что завели и назвали Фиксированный массив. Ироды.
34. brr 182 19.07.21 17:37 Сейчас в теме
(22)А как возвращать несколько значений?
42. kser87 2438 19.07.21 22:56 Сейчас в теме
(34) я же не говорю, что структуру в принципе нельзя использовать. Есть люди, которые ее всегда юзают. Типа на всякий случай
74. TimkoNzt 21.07.21 01:26 Сейчас в теме
(42)

А что? Хорошая привычка. Попробуйте, вам понравится)

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

Если функция вызывается из другой функции, то банально, кроме результата, нужно передавать из неё сообщения об ошибках. Тут хорошим тоном считается выводить информацию для пользователя, в т.ч. об ошибках, на уровне интерфейса, а не кидать сообщения где попало.
98. DJ_Codebase 22.07.21 18:31 Сейчас в теме
(74) Я именно так и делаю, но не везде, а при проектировании сложных агрегатов. Использую ключи: Успех, Результат и СписокОшибок.
56. zqzq 23 20.07.21 11:03 Сейчас в теме
(34)
А как возвращать несколько значений?
Использовать параметры функции/процедуры. По Макконелу, сначала идут выходные параметры (передавать туда пустые переменные), потом входные (можно со Знач объявлять для наглядности).
68. brr 182 20.07.21 16:34 Сейчас в теме
(56На мой взгляд это тоже антипаттерн. Процедура ничего не должна возвращать в принципе, только обрабатывать переданные параметры, функция должна возвращать только то что указано после служебного слова Возврат.
Сто27001; DJ_Codebase; +2 Ответить
23. frkbvfnjh 786 19.07.21 16:11 Сейчас в теме
Вы про Синдром 80-го уровня или чрезмерная сложность расскажите разработчикам типовых конфигурации и БСП!
v3rter; Сто27001; DJ_Codebase; papami; dvissarov5; Jestery; +6 Ответить
102. ivanov660 4332 23.07.21 10:47 Сейчас в теме
(23)Разработчики 1С сидят на этом сайте (не все конечно), т.ч. рассказал и даже призвал к рефакторингу.
24. axelerleo 339 19.07.21 16:34 Сейчас в теме
Ну вот смотрите. Развернул я Сонар Куб, выгрузил в него Документооборот, и словил over9000 более 84000 ошибок и дефектов кода.
Когнитивная и цикломатическая сложность? О чем вы, это же БСП :)
Длина строки 120 символов? Ага, счас! у наших разработчиков большие мониторы, можем себе позволить!
Писать код в блоке Исключение? Зачем? Ошибку экранировали, и этого довольно!
Вместо ЭтаФорма нужно писать ЭтотОбъект? Кто это сказал? Может, это и наши рекомендации, но мы их соблюдать не обязаны!

И так по очень многим пунктам тех самых Стандартов и Методик, на которые все кивают при размещении вакансий :)

ЗУП с непрозрачным "API", как они это называют, так и вовсе рептилоиды писали. Цепочки вызовов по 10-15 штук - ну а что, зато модульно!

Так что тут никаких статей даже не надо, достаточно просто пару лет поплеваться от типового кода, чтобы выработался рефлекс самому так не писать :)
TerveRus; Alex1c; lmm; rpgshnik; Sardukar; Dorosh; user1485342; dvissarov5; brr; +9 Ответить
35. Yashazz 4709 19.07.21 17:42 Сейчас в теме
(24) вот поэтому, когда мне пеняют на мой стиль, я напоминаю, что БСП многократнейшим и наглейшим образом плюёт на стандарты 1С и просто культуру кода, проектирования, разработки и документации.
Alex1c; papami; Sardukar; dvissarov5; bulpi; brr; rds_tomsk; +7 Ответить
36. dhurricane 19.07.21 17:47 Сейчас в теме
(35) При всем моем уважении к Вам, но это плохой аргумент. В стиле "А у них негров линчуют".
39. Yashazz 4709 19.07.21 17:55 Сейчас в теме
37. ivanov660 4332 19.07.21 17:48 Сейчас в теме
(35)Все же я считаю, что не стоит равняться на "плохо кодеров", кодеров компании 1С (у них там много новичков, которые и пилят эти перлы). Правильно стремится держать качество кода, особенно внутри своей команды.
Мои антипаттерны ближе будут коллегам выполняющим в команде обзор кода.
53. dvissarov5 11 20.07.21 11:01 Сейчас в теме
(35) Просто культуру кода когда то взяли у западных ребят, которые на этом уже много раз набили шишку и создали на основании опыта. Ее перенесли в 1с умные люди.
А пишут совсем другие люди и порой совсем с разными мыслями об этом.
Такое ощущение, что им 1с в целом неинтересно соблюдение стандартов, ибо надо быстрее шпарить новые релизы и фитчи, а культура кода и проектировании это на потом на рефакторинг, который может случится а может нет))
Вопрос к наличию кодревь, и вроде как пишут о новинках автотестирования и всяких прелестях жизни качественного продукта. А на деле неочевидно что применяется.
25. rabid_otter 134 19.07.21 16:47 Сейчас в теме
баянище... наверное будет открытием для тех, кто не читал Макконнелла или Мартина.

1, 2, 3, 5, 6 - про форматирование, можно объединить в 1, мол читай стандарты кодирования от 1С.
7 - про сложность, можно объединить с 16.
но тогда бы писанины было меньше и плюсов тоже :)
8 - когда мало параметров, ими легко манипулировать в дальнейшем коде, это же азы.
9 - тут можно было уточнить про "спагетти-код" и "лазанья-код".
10 - переиспользование кода рулит, и это тоже азы.
11 - боль в отладке.
12 - в БСП такое любят, им влом влепить структуру с флагом ошибки и возвращаемым значением.
13 - про magic numbers. ТекущаяДата() всегда возвращает секунды, неужто кто-то еще не знает, что 86400 = 1 день? а вот про Цена = 42 соглашусь.
14 - перекликается с 13. а еще есть "мягкое кодирование", когда слишком много настроек.
16 - такие запросы чаще всего являются следствием ошибок на этапе архитектуры. видел такой запрос в одной дописанной конфигурации.
17 - это у всяких паттерн-наци все всегда правильно, а иногда бизнесу надо "вернуть все взад" и закомментированный код может пригодиться.

есть такой антипаттерн, как поток лавы - 1Сники его в типовых часто сами применяют.
когда сначала пишется механизм, на него завязываются другие механизмы, а потом в основном находят ошибку и правят, а в зависимых местах иногда не правят.
dvissarov5; zqzq; +2 Ответить
103. ivanov660 4332 23.07.21 10:58 Сейчас в теме
(25)
1. Читайте стандарты - не так информативно, да и никто не полезет читать ИТС (скучно). Я разложил на конкретные ситуации с примерами и описанием. Эта информация позволит упростить код-ревью и повысить внутреннюю культуру разработчика (не у всех конечно).
2. Все примеры относительно простые и банальные (кроме обобщенных последних) ,поэтому легко запоминаются и легко исправляются. Стандартные антипаттерны для других языков не всегда применимы, иногда через какое-то обобщение и абстракцию.
3. Про 1С-ников из корпорации "зла" я уже говорил, что не стоит равняться на плохой стиль. "Единственный путь стать умнее — играть с более сильным противником" - Эмануэль Ласкер.
Мы в команде стараемся придерживаться стандартов и хорошего стиля. Как раз - эта статья результат нашего вебинара по качеству кода, которым мы решили поделиться с сообществом.
TerveRus; +1 Ответить
104. rabid_otter 134 23.07.21 11:34 Сейчас в теме
(103)
1. Читайте стандарты - не так информативно, да и никто не полезет читать ИТС (скучно). Я разложил на конкретные ситуации с примерами и описанием. Эта информация позволит упростить код-ревью и повысить внутреннюю культуру разработчика (не у всех конечно).

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

ок.
3. Про 1С-ников из корпорации "зла" я уже говорил, что не стоит равняться на плохой стиль. "Единственный путь стать умнее — играть с более сильным противником" - Эмануэль Ласкер.

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

классная у вас команда, время есть на вебинары и статьи на инфорстарте. иногда времени на рефакторинг не очень много.
105. ivanov660 4332 23.07.21 12:03 Сейчас в теме
(104)
1. Про поток лавы 1С спасибо, сейчас перечитал (много комментариев перегрузился).
2. Вебинар на 40-60 минут, приносит достаточно много пользы и поддерживает команду в тонусе. Но они не такие частые, к сожалению, не чаще 1 раза в неделю и может 1-2 раза в месяц. Это нормальная много где использующаяся практика, которая согласована с руководством. А статьи для сообщества я пишу в обычно свободное время, поэтому довольно большие интервалы.
Время на рефакторинг или технический долг тоже надо выбивать у руководства, к сожалению это также идет со скрипом, поэтому стараемся пресекать превентивно - код-ревью, архитект-ревью.
26. AntonProgma 46 19.07.21 16:47 Сейчас в теме
Ну это не только к 1с можно отнести. А вот одиэсовские приколы архитектуры:
1. Сотни подписок на события.
2. Куча невидимых реквизитов объекта формы.
Yashazz; Serg O.; +2 Ответить
30. diocon 19.07.21 17:16 Сейчас в теме
Также всегда, где можете, инициализируйте переменные внутри процедур, это значительно сокращает количество строчек и количество ненужных переменных.


Что здесь не так? Вполне норм.

15. БСП не всегда логично работает, в частности, приходилось свое распределение числа на массив писать, БСП-вариант плохо относит погрешность округления...
38. ivanov660 4332 19.07.21 17:51 Сейчас в теме
(30)Они стараются, изо всех сил допиливают и улучшают БСП, хотя приходится тянуть отголоски старого плохого кода.
Кстати если все же перепишут на асинхронные вызовы, то часть жутчайшего кода можно будет выкинуть.
31. Serg O. 224 19.07.21 17:30 Сейчас в теме
поддержу (25) читайте рекомендации 1С
и "классику"...
очень полезна книга Роберта Мартина "Чистая архитектура. Искусство разработки программного обеспечения"
https://market.yandex.ru/product--martin-r-chistaia-arkhitektura-iskusstvo-razrabotki-programmnogo-obespecheniia/560253695

Чистый код - больше для программистов на Java (и всех Си-подобных языков)

кто не хочет читать - посмотрите видео...
например от Немчинского - про правильные названия
https://www.youtube.com/watch?v=5vsfYifNqzk

Принцип DRY - (очень часто нарушается в 1С ! )
дублирование кода прям везде даже в типовых конфигурациях
https://www.youtube.com/watch?v=NWemqNMCesQ

Принцип KISS
https://www.youtube.com/watch?v=rix-fkrloq4

а так же про составные принципы SOLID
sulfur17; EMelihoff; +2 Ответить
90. Hans 2 22.07.21 09:33 Сейчас в теме
(31) Немчинскому и толстому незалежная хорошо промыла мозги. Нерекомендую к просмотру ура патриотам.
43. starik-2005 3033 20.07.21 00:06 Сейчас в теме
Как не стоит делать - да, миллион статей. Как стоит делать - обычно чуть-чуть в самом конце, общие фразы.

Вот я не нашел статьи про то, как читать код. Как писать и как не стоит писать - да, а вот как читать?
vano-ekt; dvissarov5; rds_tomsk; +3 Ответить
80. biimmap 1835 21.07.21 14:48 Сейчас в теме
(43) а чего сложного? на русском же)))

Если серьёзно, то чтение кода упрощает только большой опыт, знание инструментов (т.е. объектов метаданных), знание стандартов разработки и много много написанного тобою лично кода.

Если через слово смотреть в синтаксис-помощник, то читать код конечно будет трудновато.

Надо задуматься... может правда статью написать про это
v3rter; zqzq; +2 Ответить
82. ivanov660 4332 21.07.21 14:59 Сейчас в теме
91. Hans 2 22.07.21 09:35 Сейчас в теме
(80) Пиши статью. Действительно никто не пишет как читать эффективно и быстро. Многие программисты большинство времени читают код, а не пишут, особенно в 1С на доработках каких то.
106. v3rter 23.07.21 12:08 Сейчас в теме
(80) Зачем только статью? Натренируйте нейросеть - с руками оторвут)
107. ivanov660 4332 23.07.21 13:06 Сейчас в теме
(106)Чтобы натренировать нужны мастер данные. А где их взять? Из типовых конфигураций - там средненький код. Т.е. мы зашли в тупик.
45. d.samsonov92y 20.07.21 07:09 Сейчас в теме
Очень много воды, много странных примеров для описания проблем. Например однострочный трай где в попытке Записать, а в исключения сообщить описание ошибки - никаких проблем никогда не вызывает. А вот чтобы в одну строку писали трай где вызывается 2-3 процедуры или функции я никогда не встречал за 10 лет и никто так не делает.

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

14 пункт тоже странный. Если путь на 100% определен и не будет меняться, то что в этом неправильного? Это с точки некой этики конечно неправильно, но ничего "анти" в этом нет.

Практических советов крупицы, количество полезной информации на общий объем текста стремится к нулю. Я уже не говорю что с паттернами тут вообще никакой связи нет.
serg-666; +1 Ответить
47. dhurricane 20.07.21 09:24 Сейчас в теме
(45)
никаких проблем никогда не вызывает.
До тех пор, пока не придется доработать этот кусок кода: вставить что-нибудь в дополнительные свойства, дополнить диагностику ошибки. Чтобы в первоначальном виде кто-то писал 2-3 процедуры или функции внутри блока в одну строку, я тоже никогда не видел. Но много раз видел, как дорабатывали чужой код слепо придерживаясь исходному стилю написания. Так что появление новых деталей в одной строке вполне возможно. Потом при сравнении модулей сиди, высматривай, что именно изменилось в этой строке.

Если путь на 100% определен и не будет меняться
Такое вообще бывает?
dvissarov5; +1 Ответить
48. d.samsonov92y 20.07.21 09:40 Сейчас в теме
(47) Так если нужно доработать, что сложного проставить пару переносов строк? Ты же уже дорабатываешь.

(47)
Но много раз видел, как дорабатывали чужой код слепо придерживаясь исходному стилю написания.


Ну отсюда следует пункт, что если видишь неправильное написание кода то не нужно его придерживаться. Однострочный ввод используют только когда он удобен (сэкономил 2 секунды и т.д.), но осознано усложнять себе жизнь никто не будет.


(47)
Такое вообще бывает?

К сожалению да. Видел древнейшие базы которые при начале работы системы обращались во внешние обработки. Конкретно с этим проблем никогда не случалось. Если кто-то в коде указывает путь до обработки на рабочем столе, то это скорее говорит о слабых навыках, а не о том что он все знает, но делает именно вот так.
49. dhurricane 20.07.21 10:11 Сейчас в теме
(48)
что сложного проставить пару переносов строк?
Так я о том же. :-) Почему бы сразу не написать в несколько строк? Плохо себе представляю, как ввод в одну строку может быть удобен. В моем представлении, в одну строку пишут исключительно осознанно, не на автомате.

то это скорее говорит о слабых навыках
Ну в исходной статье конкретный адресат не указан. Более того, думаю именно для разработчиков со слабыми навыками она и написана.

Видел древнейшие базы которые при начале работы системы обращались во внешние обработки. Конкретно с этим проблем никогда не случалось.
Ну да, представляю. Видимо, я слишком много работаю с постоянно меняющимися требованиями. И подобных решений пока не наблюдал.
50. bulpi 215 20.07.21 10:34 Сейчас в теме
Практически все используется в типовых конфигурациях. И эти люди запрещают мне ковыряться в носу (С) !
51. serg-666 20.07.21 10:49 Сейчас в теме
Хотелось бы спросить, а какое все написанное в этой статье имеет отношение к паттернам?
Это все тянет на какие-то рекомендации оформления кода (местами спорные), но паттернами тут даже не пахнет.
Сначала бы хотелось увидеть руководство по паттернам проектирования от вендора, а то, судя по типовому коду, в самой желтой цитадели нет единого понимания, что такое шаблоны проектирования в 1С.
52. ivanov660 4332 20.07.21 11:00 Сейчас в теме
(51) Как я писал выше паттренами называются повторяющиеся из раза в раз однотипные действия, которые можно представить как шаблон. И эти повторяющиеся действия я выделил анализируя код различных команд, конфигураций, обработок.
58. serg-666 20.07.21 11:28 Сейчас в теме
(52) На сколько я понимаю, есть вполне устоявшееся понятие - design patterns, реже programing patterns. Зачем такое громкое название Антипаттерны? Это вводит в заблуждение. Я начал читать эту статью в надежде увидеть хоть что-то о правильном проектировании в 1С, а увидел вот это... Вот, например, пункт 5. Это паттерн? Давайте дадим ему имя "паттерн Shift+Alt+F". У меня нет цели Вас обидеть. Просто название статьи не отражает содержание. Хотя, ладно, Вам виднее.
vano-ekt; +1 Ответить
61. ivanov660 4332 20.07.21 12:41 Сейчас в теме
(58)
1. anti-pattern также устоявшееся понятие en.wikipedia.org/wiki/Anti-pattern.
2. Согласен без обид, но название статьи отражает информацию, которая в ней изложена. Возьмите определения. Для некоторых антипаттернов есть устоявшиеся выражения, для некоторых нет.
3. Кроме приемов успешного кода, также нужно смотреть как не нужно делать. Это также важная информация, но с другой стороны баррикад. Использовать правильные практики одно, а вот найти у себя анти хорошую практику - другое. Т.е. вы можете использовать десять правильных подходов, но не замечать пару плохих.
55. ivanov660 4332 20.07.21 11:02 Сейчас в теме
(51)У вендора есть рекомендации на ИТС. Но судя по всему у них отсутствует или хромает процедура код-ревью или обзора кода, либо - это делают джуны.
81. biimmap 1835 21.07.21 14:53 Сейчас в теме
(55) я пока там работал мой код смотрели на предмет соблюдения стандартов. Довольно много ошибок нашли в коде. На тот момент я ещё мало знал и использовал стандарты разработки. Но там проверяют друг друга. Нет отдельной компетенции по проверке кода. В целом люди грамотные но очень занятые. Это может накладывать некоторые недочёты при проверке.
54. пользователь 20.07.21 11:02
Сообщение было скрыто модератором.
...
57. ipoloskov 162 20.07.21 11:13 Сейчас в теме
18. Пишите большие процедуры. Если в вашей процедуре меньше 1000 строк, никто не поверит, что вы крутой программист. Вот в компании 1С - крутые программисты. Особенно это доставляет, когда вы хотите изменить какую-то одну строку, и для этого приходится тащить всю такую процедуру в расширение.
19. Чем больше параметров в процедуре - тем лучше. Забудьте про СообщитьПользователю(Текст, Отказ, ПараметрыВывода). Гораздо лучше смотрится СообщитьПользователю(Текст, КлючДанных, Поле, ПутьКДанным, Отказ). Наиболее часто используемый параметр - Отказ - ставьте последним. Поверьте, другим программистам очень приятно считать запятые при написании вызова вашей функции.
67. stvorl 1040 20.07.21 16:07 Сейчас в теме
(57) Не подсказывайте. В очередной версии БСП переставят, будем всю кодовую базу править под новую сигнатуру этого, весьма часто используемого, вызова.
lmm; unknown181538; +2 Ответить
69. ipoloskov 162 20.07.21 17:12 Сейчас в теме
(67) просто это то, что сразу вспомнилось. В конфигурациях 1С не редкость процедуры с 10 параметрами. Между тем, Роберт Мартин пишет, что 3 параметра должно быть максимумом. Разработчики не читали Роберта Мартина, или сознательно игнорируют принципы чистого кода? А возвращаемые через параметры значения? О, как это помогает читать код!
Оставьте свое сообщение