"Чистый код в 1С" или как прокачать свой код? Пошаговая инструкция, часть №1

16.09.24

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

В последнее время термин «чистый код» стал очень популярным. Появились даже курсы по данной тематике. Так что же это такое?

1. Введение. Зачем нам чистый код?

«Чистый код» - это код, написанный с соблюдением стандартов и рекомендаций от компании «1С», который при этом легко читать и поддерживать. Иными словами, практика написания «чистого кода» позволяет нам быстро исправлять, дорабатывать или даже искать ошибки в своем или чужом коде. Однако программисты приходят к этому далеко не сразу. Я был не исключением.

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

В 1С термин «Чистый код» появился относительно недавно. Однако термин "Чистый код" (или "Clean Code") в не «1С-ной среде» стал популярным благодаря одноимённой книге Роберта Мартинa, вышедшей в 2008 году. Книга и концепция в целом рассматривают принципы написания кода, который будет простым, понятным и поддерживаемым.

 

 

2. Структура модуля

Каждый модуль, согласно стандарту 455, должен иметь определенную структура, которая формируется с помощью областей. Области в модулях прописываются с помощью ключевых слов #Область<ИмяОбласти> и #КонецОбласти. При создании нового модуля необходимо следовать данному стандарту, а при добавлении методов необходимо размещать их в соответствующей области.

Данная техника структурирует методы (процедуры и функции) и позволяет максимально быстро находить нужные данные в коде. Кстати, при  использовании комбинации клавиш Ctrl+Shift+минус (-), текст модуля будет свернут до заголовков областей.

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

Набор областей различается в зависимости от типа модуля. Стандартом предусмотрены следующие виды областей:

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

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

Раздел "Служебные процедуры и функции" содержит процедуры и функции, составляющие внутреннюю реализацию модуля.

Раздел "Обработчики событий" содержит обработчики событий соответствующего модуля.

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

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

Раздел "Обработчики команд формы" содержит процедуры-обработчики команд формы (имена которых указаны в свойстве "Действие команд формы").

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

Если по началу у Вас будут сложности с тем, в какую область поместить тот или иной метод – можно открыть любую типовую конфигурацию и проанализировать код в аналогичном модуле. То есть если вы разрабатываете форму нового документа, откройте модуль формы типового документа. Я уверен, что уже после первого прочтения вам станет понятна логика, которую закладывали разработчики типовых конфигураций.

 

 

3. Общие требования к текстам модулей

Общие требования к текстам модулей изложены в стандарте 456.

Все тексты модулей должны быть написаны на русском языке.

Исключением из этого правила являются веб-сервисы, для которых имена методов и параметры рекомендуется задавать на английском языке. Например, в УТ 11.5 есть  веб. сервис «CustomerOrdersExchange», который имеет множество функций на английском языке. Это выглядит так:

Функция GetCatalogs(MobileDeviceID)
	
	Возврат МобильноеПриложениеЗаказыКлиентов.ВыгрузитьСправочники(MobileDeviceID);
	
КонецФункции


Функция GetPriceList(MobileDeviceID, AllPrices = Ложь, Address = "")
	
	Возврат МобильноеПриложениеЗаказыКлиентов.ВыгрузитьПрайсЛист(MobileDeviceID, AllPrices, Address);
	
КонецФункции

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

Программные модули не должны содержать неиспользуемые методы. Наличие таких методов отвлекает разработчика и заставляет его тратить время на выяснение их назначения (Однако в типовых конфигурациях часто можно встретить подобное. Находили подобные методы?).

В программных модулях не должно быть закомментированных фрагментов кода, а также ссылки на конкретного разработчика, который вносил правки. Если при разработке используется «хранилище», поиск автора доработки не должно составить проблему.

Тексты модулей должны оформляться по принципу «один оператор на одну строку».

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

  • На крайней левой позиции должны располагаться только:
  • операторы Процедура, КонецПроцедуры, Функция, КонецФункции;
  • заголовки (описания) процедур и функций;
  • объявления переменных модуля;
  • операторы основного раздела программы (с учетом синтаксических отступов);
  • директивы компилятора, такие как &НаКлиенте, &НаСервере и т.д.;
  • инструкции препроцессора (включая #Область и #КонецОбласти).

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

 

4. Переменные

Имена переменных

Правила формирования имен переменных определяются стандартом 454.

Имена переменных следует составлять на основе терминов из предметной области. Это необходимо для того, чтобы из названия переменной было понятно её назначение.

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

Кстати, стилистика формирования имен переменных в «1С» настолько сильно влилась в мою жизнь, что даже, папки на своем пк я называю в подобной стилистике;)

Примеры корректных имен переменных:

Перем ОтветНаВопрос; //Ответ на вопрос

Перем ПараметрыТовара; //Параметры товара

Перем СтраницаКоманднойПанели; //Страница командной панели

Перем КоличествоСтрок; //Количество строк

Некорректные имена переменных:

Перем стрТов; 

Перем Пер1; 

Перем тов;

Перем мас_рез;

Исключением из правил при нейминге переменных может быть только счетчик в цикле. В таком случае переменная может состоять из 1 символа, однако я всегда стараюсь находить более осознанные имена для таких случаев. Пример:

ВсеДопустимыеСимволы = Новый Соответствие;
Для Позиция = 1 По СтрДлина(ДопустимыеСимволы) Цикл
	ВсеДопустимыеСимволы[Сред(ДопустимыеСимволы, Позиция, 1)] = Истина;
КонецЦикла;

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

Перем ЕстьСтрокаКонвертации;

Перем ЕстьОшибки;

Перем ЭтоУслуга; 

При выборе имени переменной необходимо стремиться к тому, чтобы оно как можно точнее отражало смысл её создания.

 

5. Процедуры и функции

5.1. Имена процедур и функций

Работа с именами процедур и функций регламентирована стандартом 647.

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

 

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

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

Рассмотрим несколько примеров неудачных имен функций:

Функция ВыполнитьКоманду(Идентификатор, ОбъектыНазначения)

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

Рассмотрим еще несколько примеров:

Функция ОбработатьРезультатТЗ_Заказ(РезультатТЗ)

Исходя из названия данной функции можно предположить, что она обрабатывает какую-то таблицу значения, вероятнее всего данные таблицы значений каким-то образом связанным с «Заказом клиента» или «Заказом поставщика». Однако абсолютно не понятно почему параметр функции называется РезультатТЗ. В названии используется знак «_» (подчеркивание), что является недопустимым в нейминге процедур и функций.

Функция EmailValid(Адрес)

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

Теперь приведу примеры правильного наименования функций и параметров:

Функция ПолучитьРеквизитФормыПоПути(Форма, ПутьРеквизита) 

С такой функцией сразу понятно, для чего она предназначена и какие параметры нужно ей передать. Рассмотрим еще пример:

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

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

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

Примеры неправильного наименования:

Функция  ПолучитьМассивНомеровСтрок(ТабличнаяЧасть)

Функция  ПолучитьСтруктуруРеквизитовПартии()

Корректный вариант:

Функция  НомераВыбранныхСтрок(ТабличнаяЧасть)

Функция  РеквизитыПартии()

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

Например, в следующей функции:

Функция ТаблицаЗначенийВМассив(ТаблицаЗначений)

Функция СтруктураВСтрокуJSON(Значение)

Функция МассивВТаблицуЗначений(МассивСтруктур)

без указания типов параметров и возвращаемого значения становится трудно описать суть функции.

Имена процедур, как правило, следует формировать от неопределенной формы глагола, отражающего суть выполняемого действия.

Пример неправильного наименования:

Процедура ЗагрузкаНоменклатуры(Параметры)

Корректное наименование:

Процедура ЗагрузитьНоменклатуру(Параметры)

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

Неправильные примеры:

Функция ПолучитьНастройкуДляТекущегоПользователя()

Функция ПолучитьТекстЗапросаЗаказыСИстекающимСрокомВыдачи()

Функция ПолучитьСтатусЗаказа(Ссылка) 

Правильные варианты:

Функция НастройкуДляТекущегоПользователя()

Функция ТекстЗапросаЗаказыСИстекающимСрокомВыдачи()

Функция СтатусЗаказа(Ссылка)

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

Первое исключение касается случаев, когда понимание назначения функции требует знания способа, которым было получено возвращаемое значение. Например:

Функция ВыбратьСсылкиДляОбработки(Очередь, ПолноеИмяОбъекта, ДополнительныеПараметры = Неопределено)

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

Функция РазрешитьРаботуПользователей()

Если функция предназначена для создания какого-либо объекта, рекомендуется использовать слово «Новый» в ее названии. Например:

Функция НоваяПодпись()

Функция НовыеНастройкиКонтрагента() 

Функция НовыйДокументСверкаВзаиморасчетовПоОборотам(ПараметрыЗаполнения)

Если функция проверяет какое-либо условие, то ее название лучше начинать со слова «Это» или использовать причастия. Такой подход позволяет ясно обозначить, какое значение (Истина или Ложь) будет возвращаться функцией. Например:

Функция ЭтоНоваяОчередь(Претензия, Статус) 

Функция ЭтоАдминистративноТерриториальныйАдрес(ТипАдреса)

Функция ЭтоГородФедеральногоЗначения(Город)

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

Неправильный пример:

Функция НайтиТоварыИСоздатьПеремещения(ПараметрыЗаказа)

Правильные примеры:

Функция НайтиТовары(ПараметрыЗаказа)
Функция СоздатьПеремещения(ПараметрыЗаказа)

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

Приведу еще несколько примеров не корректных имен процедур и функций:

Функция ВыполнитьМетодИОбработатьДанные(пДанные = Неопределено, пФорма = Неопределено, ИмяМетода) 

Процедура СформироватьИОтправитьПисьмоСОшибкой(стрПараметры, РезультатЗапроса)

Как вы думаете, какие здесь основные проблемы? Если знаете ответ – напишите его в комментариях.

 

5.2. Параметры процедур и функций

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

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

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

Примеры неправильного расположения параметров:

Процедура ПроверитьЗаполнениеДатыПроизводстваСрокаГодности(ИмяТЧ, Отказ, ДокументОбъект) Экспорт

Процедура ПриИзмененииСтатусаДокумента(НовыйСтатус, ПредыдущийСтатус, ДокументСсылка ПараметрыОбновленияСтатуса = Неопределено) Экспорт

Правильное расположение:

Сначала следует указывать основные параметры — ДокументОбъект и ДокументСсылка:

Процедура ПроверитьЗаполнениеДатыПроизводстваСрокаГодности(ДокументОбъект, ИмяТЧ, Отказ) Экспорт

Процедура ПриИзмененииСтатусаДокумента(ДокументСсылка, ПредыдущийСтатус, НовыйСтатус, ПараметрыОбновленияСтатуса = Неопределено) Экспорт

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

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

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

Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт

Эта процедура взята из общего модуля БСП УправлениеДоступом. Если мы посмотри описание Процедуры, то в комментариях мы увидим следующее описание:

//  ПараметрыОбновления - Структура:
//   * ОбновлятьИзмененныеПрофили - Булево - начальное значение Истина.
//   * ЗапретитьИзменениеПрофилей - Булево - начальное значение Истина.
//       Если установить Ложь, тогда поставляемые профили можно не только просматривать, но и редактировать.
//   * ОбновлятьГруппыДоступа     - Булево - начальное значение Истина.
//   * ОбновлятьГруппыДоступаСУстаревшимиНастройками - Булево - начальное значение Ложь.
//       Если установить Истина, то настройки значений, выполненные администратором для
//       вида доступа, который был удален из профиля, будут также удалены из групп доступа.

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

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

 

Заключение

В следующей статье мы продолжим разбирать практики «чистого кода», а также стандарты разработки от компании «1С».

Стандарты 1С БСП Чистый код clean code рефакторинг

См. также

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

В статье рассматривается отказ от использования процедур и унификация формата ответа функций. Способ описывается на примере развития абстрактной информационной системы, работающей с PDF файлами.

10.09.2024    735    acces969    4    

6

Рефакторинг и качество кода Бесплатно (free)

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

28.08.2024    873    Chernazem    2    

6

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

SOLID – принципы проектирования программных структур (модулей). Акроним S.O.L.I.D. образован из первой буквы пяти принципов. Эти принципы делают код более гибким, упрощают разработку. Принято считать, что принципы SOLID применимы только в объектно-ориентированном программировании. Но их можно успешно использовать и в 1С. Расскажем о том, как разобраться в принципах SOLID и начать применять их при работе в 1С.

22.08.2024    8684    alex_sayan    41    

48

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

Рассмотрим основные принципы шаблона проектирования "Стратегия" на простом примере.

25.06.2024    3703    MadRave    34    

27

Рефакторинг и качество кода Программист Платформа 1С v8.3 Абонемент ($m)

В статье расскажу и покажу процесс проведения Code-review на примере обработки с GitHub.

1 стартмани

04.06.2024    5898    mrXoxot    55    

41

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

Поделюсь своим опытом аудита кода авторских продуктов с Infostart.ru как одним из элементов применения DevOps-практик внутри Инфостарт. Будет настоящий код, боевые скриншоты, внутренние мемы от команды ИТ-лаборатории Инфостарт и прочее мясо – все, что любят разработчики.

10.04.2024    12598    artbear    85    

108

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

Предлагаю вашему вниманию советы мастеров древности. Программисты прошлого использовали их, чтобы заострить разум тех, кто после них будет поддерживать код. Гуру разработки при найме старательно ищут их применение в тестовых заданиях. Новички иногда используют их ещё лучше, чем матёрые ниндзя. Прочитайте их и решите, кто вы: ниндзя, новичок или, может быть, гуру? (Адаптация статьи "Ниндзя-код" из учебника JavaScript)

01.04.2024    3893    DrAku1a    15    

39

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

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

01.04.2024    1165    Prepod2003    6    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bayselonarrend 2029 16.09.24 10:47 Сейчас в теме
В 1С термин «Чистый код» появился относительно недавно. Однако термин "Чистый код" (или "Clean Code") в не «1С-ной среде» стал популярным благодаря одноимённой книге Роберта Мартинa, вышедшей в 2008 году. Книга и концепция в целом рассматривают принципы написания кода, который будет простым, понятным и поддерживаемым.


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

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

Гораздо продуктивнее реально было бы опереться на книгу и потыкать в наиболее частые болячки, актуальные для 1Сного кода, которые в ней как раз критикуются. Например любовь 1Сников к функциям на несколько экранов или к бешеному количеству параметров в них
kalyaka; maxa0n; zhkonst; nixel; embarcadero; wolfalan; user1035175; Артано; AlexeyChernyev; sandr13; MegasXXX; zqzq; ktb; pavlov_dv; +14 Ответить
4. markbraer 74 16.09.24 12:02 Сейчас в теме
(1) Спасибо за комментарий, учту ваши пожелания
bayselonarrend; MegasXXX; +2 Ответить
11. Jokemas 192 18.09.24 10:26 Сейчас в теме
(1) тема для джунов. Берёшь эту или подобную статейку, и как вводную кидаешь им в чат. Они читают, начинают потихоньку втягиваться в процесс. Человек только начинает щупать конфигуратор, уже должен начинать изучать, как этим инструментом правильно пользоваться. Или ты предлагаешь учить наизусть ИТС, БСП и т.д., до того, как человек получит сертификат "Введение в конфигурирование в системе 1С предприятие 8. Основные объекты"?

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

Чтобы джуну вырасти в мидла, надо с чего-то начать. Пусть щупают подобную статью. Здесь есть ссылка на книгу, которую ВОЗМОЖНО кто-то потом почитает. Но начинать учить математику не с арифметики, а с высшей математики - странное предложение.
12. bayselonarrend 2029 18.09.24 10:40 Сейчас в теме
(11) Я предлагаю подарить джуну Чистый код Мартина

Или ты предлагаешь учить наизусть ИТС, БСП и т.д., до того, как человек получит сертификат "Введение в конфигурирование в системе 1С предприятие 8. Основные объекты"? Очень забавно наблюдать, когда "гуру" приходят в тему для новичков и начинают всем вокруг показывать, кто здесь "папка"


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

Так и сказал, да
2. acces969 360 16.09.24 11:59 Сейчас в теме
По сути, выжимка из стандартов разработки ИТС. Вроде статья полезна, но в то же время каждый должен это прочитать на первоисточнике, и эта статья не имеет смысла. Но это в идеальном мире, конечно.

Вот бы что-то новое почитать - приемы, построение архитектуры, паттерны 1С, не адаптированные из ООП.
3. markbraer 74 16.09.24 12:02 Сейчас в теме
(2) Спасибо за комментарий.. Работаю над второй частью. Буду учитывать ваши пожелания
5. strelec13 21 16.09.24 18:19 Сейчас в теме
Многие начинающие не читают первоисточник, поэтому для многих начинающих эта статья очень полезна!
Olenevod; MegasXXX; user2047389; t278; ImHunter; +5 Ответить
6. SerVer1C 794 17.09.24 09:41 Сейчас в теме
Статью надо было назвать "Стандартный код в 1С" или как прокачать свой код.
т.к. все эти "стандарты" от 1С, мягко говоря, далеки от чистого кода.
7. kuzyara 2077 17.09.24 09:50 Сейчас в теме
Ещё ссылок на эту тему:
1) Разработчикам » Правила кода - https://nullarity.com/code/codestyle/
2) 1С: Руководство по стилю оформления - https://github.com/skyksandr/1c-styleguide
3) Соглашения по стилю кода 1С - https://github.com/kuzyara/CodeStyle1C
4) Онлайн-курс "Пиши код грамотно" - https://uc1.1c.ru/course/pishi-kod-gramotno/
5) Диагностики BSL-LS - https://1c-syntax.github.io/bsl-language-server/diagnostics/
6) Статьи из секции "Рефакторинг и качество кода" в базе знаний инфостарта:
- Красота разработки в 1С, или художественная верстка кода
- По следам код-ревью
- Чек-листы для проведения Code Review
- Антипаттерны программирования в 1С
- Без комментариев!
MaQo; speaker_system; koltunov.sp; maxa0n; Antoska; WarAn; ivanov660; artbear; Gesperid; Viktor_Ermakov; 0ct0ber; MegasXXX; ktb; +13 Ответить
14. 0ct0ber 18.09.24 20:40 Сейчас в теме
(7) Тот случай, когда комментарий реально полезнее статьи
24. strelec13 21 20.09.24 13:53 Сейчас в теме
(14) Не будь этой статьи, не было бы этого полезного для начинающих комментария (7).
8. AndreyCh75 17.09.24 10:13 Сейчас в теме
Чисто поворчать: )

1. "Теперь приведу примеры правильного наименования функций и параметров:

Функция ПолучитьРеквизитФормыПоПути(Форма, ПутьРеквизита)
С такой функцией сразу понятно, для чего она предназначена и какие параметры нужно ей передать. "

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

Неправильные примеры:
Функция ПолучитьНастройкуДляТекущегоПользователя()
...

Правильные варианты:

Функция НастройкуДляТекущегоПользователя()"
Артано; +1 Ответить
9. BackinSoda 17.09.24 11:37 Сейчас в теме
Функция ПолучитьРеквизитФормыПоПути(Форма, ПутьРеквизита)

Как раз слово "Получить" в данном случае нужно пропустить
(6.1. Имена функций в общем случае следует образовывать от описания возвращаемого значения.)
10. cheshirshik 70 18.09.24 10:17 Сейчас в теме
Без обид, но мне кажется статью можно было закончить опубликовав ссылку на стандарты разработки. Ту ту ту ду ду... Все!
20. kuzyara 2077 20.09.24 07:18 Сейчас в теме
(10) здесь более подготовленный для стороннего читателя материал, от подачи тоже многое зависит.
ИТС без пол-литра читать невозможно. Поставил +
strelec13; +1 Ответить
23. cheshirshik 70 20.09.24 10:13 Сейчас в теме
(20) На самом деле так называемый чистый код написанный по стандартам 1С гарантирует только его читабельность и то не всегда. За чистым кодом может быть написан вообще такой бред, что мама моя родная, но я за стандарты разработки, чем за их отсутсвие. Ну и мое имхо. Надо читать скучные оригиналы, а не верхушки в статьях, даже если они хорошо написаны.
zhkonst; starik-2005; +2 Ответить
26. Артано 786 21.09.24 20:49 Сейчас в теме
(23) Читаемый код содержащий ошибки в логике, это далеко не то же самое, что нечитаемый код содержащий ошибки в логике, не так ли? ))
29. cheshirshik 70 23.09.24 13:13 Сейчас в теме
(26) И ведь не поспоришь. :-)))
13. MegasXXX 3 18.09.24 17:01 Сейчас в теме
Отличная статья.
Читал ИТС и постоянно забываю о правильном именовании Функций - коллеги же даже не догадываются.
Будем стремиться к совершенству.
strelec13; +1 Ответить
15. Alexeydap 19.09.24 09:22 Сейчас в теме
Вот вы все пишите в имени функции не рекомендуется писать слово "Получить". но практически в каждой конфигурации типовой встречаю Запрос.Текст = ПолучитьТекстЗапроса(), где собственно ПолучитьТекстЗапроса - и есть имя функции.
strelec13; +1 Ответить
19. maxa0n 19.09.24 11:00 Сейчас в теме
(15) "Строгость законов компенсируется необязательностью их исполнения".
Разработчики тоже люди. И это сотрудники также разных компетенций. В 1С тоже есть менее опытные разработчики. Если коротко - так получилось. И это всего лишь нужно поправить.
Вот только как сообщать о таких ошибках вендору - не вполне ясно. Можно писать на партнерском форуме. Но создавать тред на каждую такую "мелочь" - странно, да и заморочно.
Вот и висят такие нюансы десятки релизов, пока их не заметят...
27. Артано 786 21.09.24 20:50 Сейчас в теме
(15) Это калька от англоязычных аналогов, где Get вполне употребимо. В русском языке это избыточно
16. maxa0n 19.09.24 10:03 Сейчас в теме
Автору спасибо за статью.
А я вспомнил свои боли по этим стандартам. Приведу примеры и прокомментирую в целом:

Все тексты модулей должны быть написаны на русском языке.

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

Программные модули не должны содержать неиспользуемые методы <...> Однако в типовых конфигурациях часто можно встретить подобное. Находили подобные методы?

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

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

Это самая большая боль. Многие разработчики (не только 1С и не только в России), не задумываются о различии между отступами (indentation) и выравниванием (alignment). Очень важно их различать. В стандарте сказано, что табами нужно делать отступы. Но я вас всех прошу, пожалуйста, не делайте выравнивание табами, только пробелами.
И тогда другой пункт стандарта, что "ширина табуляции ДОЛЖНА поставлять 4 символа" нужно переписать на "ширина табуляции ПО УМОЛЧАНИЮ составляет 4 символа". Не надо запрещать менять ширину табуляции. Возможно я хочу её изменить и хочу, чтобы у меня изменились только отступы, но не выравнивание.
Например, как делать не надо. Таб 4 символа:
	ДанныеДляОтправки = Новый Структура;
	ДанныеДляОтправки.Вставить("id",							Выборка.Код);
    ДанныеДляОтправки.Вставить("field_having_very_long_name",	Выборка.Наименование);

P.S. Блок для кода на Infostart что-то криво отображает...
выглядит нормально? Да, ничего необычного. Меняем ширину таба на 8 пробелов:
        ДанныеДляОтправки = Новый Структура;
        ДанныеДляОтправки.Вставить("id",                                                        Выборка.Код);
    ДанныеДляОтправки.Вставить("field_having_very_long_name",        Выборка.Наименование);

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

Согласно стандарту, если длина строки превышает 120 символов, рекомендуется использовать переносы.

К сожалению, нет уточнения - табуляция это 1 символ, или 4? Здравый смысл подсказывает что 4 (помним прошлый пункт). А синтаксические анализаторы считают, что 1. И оба правы.

В программных модулях не должно быть закомментированных фрагментов кода, а также ссылки на конкретного разработчика, который вносил правки. Если при разработке используется «хранилище», поиск автора доработки не должно составить проблему.

Для тиражного продукта - это абсолютно верно, так и нужно делать. Но если вы дорабатываете конфигурацию, добавленные или измененные участки кода лучше все-таки отмечать, даже при использовании хранилища или git. Глядя на код, нужно сразу понимать, это типовой код или добавленный/измененный. Автора кода действительно можно не указывать, но поставить метку организации, или хотя бы просто "// Добавлено". Особенно это важно при обновлении. Тем более, если было выполнено "частичное обновление", то есть добавлены участки кода из новой типовой, но само обновление не было выполнено. Кстати, удаляемый типовой код нужно комментировать, по той же причине.
И еще лучное мнение - не надо ставить это комментарий в конце строки, только перед измененной строкой. Если строка длинная, то комментарий в конце строки не видно при "сравнении и объединении". Сколько доработок было потеряно из-за такой оплошности...

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

Чтобы лучше понимать, зачем вообще все эти стандарты нужны и почему они именно такие, нужно помнить всего одну простую мысль: Программы пишутся не для компьютера. Они пишутся для программиста. Для вашего коллеги, который делает доработку (или исправляет ошибку). Для вас из будущего, который эту программу читает. Вы пробовали посмотреть свой старый код? Как быстро вы вспомнили поняли, что он делает, и почему так?
zhkonst; WarAn; +2 Ответить
28. Артано 786 21.09.24 20:53 Сейчас в теме
(16)
Программы пишутся не для компьютера. Они пишутся для программиста. Для вашего коллеги, который делает доработку (или исправляет ошибку). Для вас из будущего, который эту программу читает. Вы пробовали посмотреть свой старый код? Как быстро вы вспомнили поняли, что он делает, и почему так?


Бальзам на душу!
30. cheshirshik 70 23.09.24 13:29 Сейчас в теме
(28)

А вот тут не соглашусь. Программы пишутся не для программиста, а для заказчика. Для бухгалтреии, для кадровиков, для менедежеров. Не заблуждаемся коллеги. Не заблуждаемся. :-)))
32. Артано 786 23.09.24 14:47 Сейчас в теме
(30) Я говорил ранее и писал в статьях, и продолжаю так считать по сей день. Написать работоспособную программу, то есть программу которая соответствует требованиям заказчика, вообще не проблема. Любой человек, умеющий читать и писать после простых курсов сможет сделать это. А вот написание сопровождаемых программ, это как раз работа для программиста.
kalyaka; WarAn; +2 Ответить
33. cheshirshik 70 23.09.24 14:50 Сейчас в теме
(32)

Простите коллега, но вы путаете. Программы пишутся не для программистов. Программы пишутся для пользователей и не важно типовой это проект или проект написанный на коленке. Большинству пользователей все равно, что у вас под капотом. Это ваша внутренняя кухня. Для пользователей важен результат вашей пработы, а не процесс.
34. Артано 786 23.09.24 14:53 Сейчас в теме
(33) Ничего не путаю. Просто я смотрю чуть дальше, чем после закрытия очередного тикета. Вы сможете объяснить пользователям, почему трудоёмкость внесения изменений в программу растёт по экспоненте? Или так и скажете им: "я создал монстра, потому что вы хотели, а я мог?"
35. cheshirshik 70 23.09.24 14:57 Сейчас в теме
(34)

А вот для этого и существует тимлид и кодревью. Чтобы вся команда придерживалась единого стандарта разработки, но так бывает, что у команды нет тим лида и каждый вояет как хочет или как может. :-D И так жить можно очень долго на самом деле, пока говнокод не вылезет ввиде взимных блокировок или не понятной хрени с базой. Но опять таки. Вернусь к сути. Результат работы программиста - это не код. Это работающая программа, которой пользуются простые люди. Им ваш "красивый" код не интересен.
36. Артано 786 23.09.24 15:03 Сейчас в теме
(35) А вы опять не поняли главный посыл. Выделю жЫрным шрифтом: чтобы не суметь написать работоспособную программу на 1с, нужно быть в медицинском смысле дебилом.

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

Дело не в красивости кода, а в том, сколько времени будет потрачено на его чтение и осмысление.

UDP. А если его ещё будет не слишком сложно дорабатывать, то это будет вообще идеал

UPD2 Утверждение не относится к высоконагруженным системам. Там недостаточно быть чуть умнее дебила, иногда даже недостаточно быть толковым миддлом.
37. cheshirshik 70 23.09.24 15:19 Сейчас в теме
(36)

Еще раз прочитал ваш комментарий вдумчиво. Ну если честно, то с моей скромной точки зрения это все спорные суждения.

Во-первых далеко не каждый сможет написать работоспособную программу на 1С, если речь о простой форме и о паре справочников, то это не в счет. Я такие программы не считаю работоспособными. Они не нужны заказчикам.

Во-вторых, то о чем Вы пишите (подчеркнутым), это ваша внутренняя кухня. СЕО компании далеко пофиг, как там написан ваш код и на сколько быстро он работает. Главное, чтобы скорость его работы устраивала СЕО.

Пишите красивый и читабельный код? Так это ж хорошо. :-D Пишите дальше. Повторюсь еще раз. Я ЗА соблюдение стандартов разработки.
38. Артано 786 23.09.24 15:25 Сейчас в теме
(37)
СЕО компании далеко пофиг, как там написан ваш код и на сколько быстро он работает.

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

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

разумеется, на разного масштаба проектах стандарты будут более или менее жёсткими, в реальной разработке всегда приходится идти на компромиссы, копя технический долг, но общая логика именно такова. Просто работоспособная программа/выполненная задача, это при прочих равных недостаточно хорошо выполненная работа.
42. ut11 2 02.10.24 10:41 Сейчас в теме
(30) пользователи не пользуются текстом программы на языке 1С. Собственно, они вообще никаким текстом программы не пользуются. В их контексте "программа" - исполняемый файл.
Не надо смешивать разные сущности, пусть даже они одинаково называются.
46. kalyaka 1099 02.10.24 12:19 Сейчас в теме
(16)
Но я вас всех прошу, пожалуйста, не делайте выравнивание табами, только пробелами
Выравнивание это красиво, но чревато фантомными изменениями в гите :) Популярные линтеры (на языках JS, Python и т.д.) выравнивание не любят
47. maxa0n 02.10.24 14:09 Сейчас в теме
(46) Возможно это проблема линтера? Вообще выравнивание на самом деле часто приносит сложности. Моё утверждение лишь о том, что если вам нужно сделать выравнивание - делайте его пробелами. Это, кстати, как раз из других языков.
48. kalyaka 1099 02.10.24 19:42 Сейчас в теме
(47) нет, линтер работает по правилам, которые разрабатывают сообщества. Например вот такое https://www.flake8rules.com/rules/E225.html - и все, никаких лишних пробелов :)
А вот любопытный опрос по теме колоночного выравнивания кода
49. maxa0n 03.10.24 02:44 Сейчас в теме
(48) согласно вашей же ссылке, в комментариях пишут, что в Python выравнивания запрещены по PEP8. Так что не нужно ожидать, что линтеры это будут поддерживать.
Но а других языках это не запрещено, и линтеры должны учитывать такие случаи.
И про фантомные изменения тоже там написано - используйте git blame -w.
Вообще опрос любопытный, спасибо.
Там же в комментариях есть мнение, с которым соглашусь: когда заполняется структура на пол экрана - тогда выравниваем, в остальных случаях смысла нет.
Применительно к 1С, например в УТ в модуле Обработка табличных частей есть любопытная функция, а также в местах её вызова, выравнивание действительно помогает.
50. kalyaka 1099 03.10.24 10:31 Сейчас в теме
(49)
Но а других языках это не запрещено
В JS также не любят выравнивания. Мне кажется большинство все-таки против выравнивания и это отражается в популярных правилах по стилю в ЯП. Я в свое время выравнивание активно использовал. Особенно мне нравилось это делать с помощью Снегопата. Однако когда Снегопат отключился, а гит все больше стал входит в повседневную рутину - я "сдался" и решил следовать общему форватору :)
Обобщенно для себя вывел следующие За и Против:
За выравнивание - легкое восприятие кода.
Против - требуется дополнительное усилие по поддержанию: если исправляется одна строка кода, то вероятно и еще 10 тоже нужно будет выровнять. Фантомные изменения в системе версионирования.
(49)
про фантомные изменения тоже там написано - используйте git blame -w
Ну да, это требует доп возможностей среды. Скажем в EDT или в конфигураторе как это сделать?

В общем это вопрос вкуса, как договоритесь в своей команде так и оформляйте выравнивание.

Отдельный вопрос с отступами. Здесь очень много специфики каждого конкретного ЯП. Я имею в виду не синтаксические отступы для блоков внутри операторов, а, например, отступ при оформлении многострочного запроса. Или отступы при многострочном перечислении параметров функции или в текучем интерфейсе. Тут для сообщества 1С еще предстоит выработать какие-то стандарты стиля.
51. maxa0n 03.10.24 10:47 Сейчас в теме
(50) да я же и говорю, что да, выравнивание скорее плохо. Мой призыв был - если вы все-таки выравниваете - выравнивайте пробелами. Вот и все.

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

git blame -w


Скажем в EDT или в конфигураторе как это сделать?


В конфигураторе, понятное дело, никак.

А в EDT вот так (в вашей же ссылке на Хабр в комментариях есть):
Прикрепленные файлы:
52. kalyaka 1099 03.10.24 11:08 Сейчас в теме
(51)
А в EDT вот так
Действительно, это ж пост про "наш eclipse" :) Интересно даже, как это можно использовать при разработке на 1С - учитывает ли редактор EDT этот параметр git blame revision при сравнении/объединении.
В текущей версии этот параметр расширен до всех непечатаемых символов, т.е. можно проигнорировать какие-то скрытые символы случайно.
53. kalyaka 1099 03.10.24 11:22 Сейчас в теме
(51)
да я же и говорю, что да, выравнивание скорее плохо. Мой призыв был - если вы все-таки выравниваете - выравнивайте пробелами. Вот и все
Согласен :) Не хватает описания мотивации. Наверное дело в том, что табы могут иметь разную настройку в разных редакторах и есть вероятность прохождения выравнивания по границе табуляции, что может приводить в некоторых вариантах к искажению отображения выравнивания.
17. Olenevod 33 19.09.24 10:41 Сейчас в теме
Считаю что такие статьи лучше чем ИТС. Никто не замечал, что на ИТС все сложнее читать? И запоминается хуже. На ИС статьи можно сказать "живые". И их комментируют. И лишний раз подчеркивается актуальность. Причем наиболее ценных аспектов. И разбираются какие то дополнительные нюансы и противоречия. И само собой ассоциативная память срабатывает лучше и эти статьи запоминаются лучше.
strelec13; kuzyara; +2 Ответить
18. maxa0n 19.09.24 10:56 Сейчас в теме
(17) Стандарт нужен, и читать его нужно именно в первоисточнике. Не такой уж он и сложный.
Тут проблема в другом, в том, что он диктуется вендором без учета мнения сообщества и без возможности на него повлиять. Я бы предложил сделать "стандарт от сообщества", где будут разобраны спорные моменты, а также применимость пунктов в разных ситуациях.
21. kuzyara 2077 20.09.24 07:28 Сейчас в теме
(18) пишите сюда или в ЛС кто готов поработать над таким стандартом или у кого есть свои наработки.

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

Как только появится критическая масса контента - опубликуем.

https://t.me/+2gzuimtzzwM1ZThi
22. Hitcher 178 20.09.24 09:08 Сейчас в теме
В названии используется знак «_» (подчеркивание), что является недопустимым в нейминге процедур и функций.
Навскидку названия из типовой КА

НачатьПодключениеРасширенияПолученияИнформацииОКомпьютере_За­вершение(
ДанныеДокументовДляСчетаНаОплату_1_01(
Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(
ПриСозданииНаСервере_ФормаСписка(
ДополнитьПараметрыАвтозаполнения_ФинансовыеВложенияКраткосро­чные(

Там таких уйма
25. strelec13 21 20.09.24 14:09 Сейчас в теме
Есть призывы "Надо читать первоисточники". Слава тем, кто это делает. А сколько тех, кто не читает первоисточники (очень плохо) ? Сколько тех , кто читает на этом ресурсе статьи с полезными комментариями и не читает первоисточники? Исходя из этой статистики слава и тем кто пишет полезные статьи и комментарии.
31. starik-2005 3080 23.09.24 14:09 Сейчас в теме
(25)
"Надо читать первоисточники".
Надо обратиться к первоисточнику! К трудам Маркса... (Гендальф-Гоблин)
39. strelec13 21 23.09.24 17:22 Сейчас в теме
40. strelec13 21 23.09.24 17:27 Сейчас в теме
(31)
Гендальф-Гоблин
Передайте ему спасибо за его совет. Дай бог ему здоровья.
41. Cyberhawk 135 01.10.24 15:08 Сейчас в теме
Неправильный пример:

Функция НайтиТоварыИСоздатьПеремещения(ПараметрыЗаказа)

Правильные примеры:

Функция НайтиТовары(ПараметрыЗаказа)
Функция СоздатьПеремещения(ПараметрыЗаказа)
А как назвать метод, в теле которого друг за другом вызываются две последних "правильных" функции?
43. fakegrek 02.10.24 10:47 Сейчас в теме
(41)
Он существует только для того, чтобы вызывать эти две функции?
44. Cyberhawk 135 02.10.24 10:49 Сейчас в теме
(43) Ну да, только вызывается из разных мест (с разными значениями входных параметров)...
45. fakegrek 02.10.24 10:52 Сейчас в теме
(44)
Я не могу точно сказать, как это описано в стандарте, но мне кажется, что такой метод не нужен.
Оставьте свое сообщение