Антипаттерны программирования в 1С
Разработка - Рефакторинг и качество кода
Давайте сначала дадим трактовку понятию антипаттерн.
Антипаттерны программного кода - это шаблоны "плохих" практик, ошибок написания исходного кода, которые совершаются при решении различных задач. Это конкретные проблемы, с которыми сталкивается каждый из нас практически каждый день. Эти ошибочные практики затрудняют понимание, анализ и сопровождение конфигураций.
"Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку." - Мартин Фаулер.
Теперь рассмотрим некоторые самые вредные советы по разработке программного обеспечения, которые мне удалось собрать погрузившись в чудный мир программирования на языке платформы 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 и др.
- поступайте наоборот по всем пунктам выше
- учтите что для части примеров хорошее решение будет зависеть от конкретной ситуации и окружения, поэтому варианты решения на ваше усмотрение
Ссылки на полезные статьи:
- По следам код-ревью
- Как завести у себя в команде код-ревью. Отвечаем на вопросы
- Качество кода: слабое связывание и высокая сопряженность (Low coupling and High Cohesion)
- Качество кода: Поведенческие паттерны проектирования
- Типичные ошибки, некоторые вопросы качества и эффективности работы при разработке в 1С
- Обзор полезных методов БСП 3.1.4
- Работа со схемой запроса
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Нейросети Рефакторинг и качество кода Запросы Разработчик 1С 8.3 Абонемент ($m)
Нейросеть написала запрос или процедуру для вашей базы 1С, и непонятно, все ли имена в нём настоящие. Обработка компилирует текст без выполнения, сверяет его с метаданными этой базы и к каждой ошибке пишет настоящее имя, например ВНаличииОстаток вместо выдуманного КоличествоОстаток. Список ошибок с подсказками одной кнопкой копируется обратно в чат с моделью.
10 стартмани
02.11.2026 362 2 nedomolkov.ivan 1
Рефакторинг и качество кода Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
Одна проверка в обработчике кнопки может выглядеть достаточной, пока ту же операцию не вызовут из другого места. На примере управляемой формы разберём, почему так происходит, как разместить проверку в общей серверной функции и чем отличается удобная проверка ввода от обязательного условия выполнения операции.
29.10.2026 379 YA_777378709 0
Рефакторинг и качество кода Разработчик Бесплатно (free)
Рассказываем, почему качественный код – это не техническая прихоть, а актив, который помогает бизнесу быстрее адаптироваться к изменениям и запускать новые фичи без бесконечного преодоления техдолга. Показываем, как объяснить бизнесу ценность рефакторинга через понятные признаки: замедление разработки, неточные оценки, страх перед legacy и хрупкость системы. Разбираем, почему неправильный рефакторинг может быть дороже его отсутствия, какие анти-паттерны ломают процесс и как не превратить улучшения в бесконечную переделку ради переделки. Объясняем, как сделать рефакторинг частью культуры команды: договориться с бизнесом, научить разработчиков видеть проблемные места, закрепить правила и поддерживать улучшения на уровне тимлидов, архитекторов и всей команды.
28.10.2026 495 Pavel791 0
Рефакторинг и качество кода HighLoad оптимизация Системный администратор Разработчик Стажер 1С 8.3 Абонемент ($m)
Если к HTTP-сервису 1С обращаются сразу несколько программ, сколько запросов в секунду он успеет обработать? Я опубликовала простой HTTP-сервис на нашей "подопытной" конфигурации «Нано-УТ» (файловая база, Apache, без прав администратора) и нагрузила его скриптом на Python. Ответ: около 15-16 запросов в секунду, сколько бы клиентов ни обращалось одновременно. Запросы ждут своей очереди, и при 32 клиентах ответ приходит через 2 секунды вместо 64 мс. Заодно разобрала скрипт из первого варианта статьи: он «проверял» сервер, который отвечал по одному, и считал ошибки вместе с успешными ответами. В архиве исправленный скрипт, учебный сервер, HTTP-сервис для 1С и инструкция по запуску.
1 стартмани
23.10.2026 529 Ninel_S 3
Рефакторинг и качество кода Разработчик 1С 8.3 Абонемент ($m)
Запустили Analyzer 1C 2.7.65 на промышленной конфигурации (596 модулей, 13 669 функций) и исследовали перегруженные функции (до 1887 строк), циклические зависимости и экран «Циклы» (кольцо из 64 модулей). Разобрали, почему популярные метрики (McCabe, связность) не представлены в продукте вендора, и составили пошаговый план разделения модуля. Привели проверенный платформой 8.3.27 пример до и после рефакторинга и выявили скрытую ловушку загрузки модулей с точкой в имени.
9 стартмани
19.10.2026 468 Ninel_S 2
Рефакторинг и качество кода EDT СКД Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)
Одиннадцать граблей схем компоновки, которые не видно в конструкторе и не ловит EDT, на реальных отчетах БП КОРП. Формат числа задается в двух местах, и условное оформление варианта перебивает формат поля. Ресурс складывает штуки с часами, и помогает выражение «только когда единица одна». Ресурс пуст в детальных записях, параметр не появляется в шапке без userSettingID, valueListAllowed ломает границы периода, Остатки и СрезПоследних с параметром периода падают с «Несоответствием типов», title без xsi:type дает «Исключение XDTO» при загрузке. В конце код проверки схемы из файла до обновления базы, сводная таблица и чеклист.
16.10.2026 540 Konstmax13 2
Инструментарий разработчика Нейросети Рефакторинг и качество кода EDT Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)
Как ИИ-агент (Claude Code) работает в живом EDT-проекте 1С:Бухгалтерии КОРП 3.0: из чего собрать стенд с MCP-сервером для EDT, как ставить задачи агенту, где он ломает проект и какие проверки это ловят. Реальные случаи: рукописные метаданные, ронявшие конфигуратор; четыре дня зависшего обновления из-за порядка блоков в Rights.rights; ошибки, которые EDT пропускает, а платформа нет; сплошная сверка вместо «вроде работает». В приложении шаблон CLAUDE.md, шаблон правила, чеклист перед обновлением базы и скрипты проверки ролей и схем СКД.
15.10.2026 3499 Konstmax13 11
Рефакторинг и качество кода Тестирование QA Разработчик 1С 8.3 Абонемент ($m)
Инженерный анализ влияния (Impact Analysis) при изменении общего метода в 1С:Предприятии: почему штатный поиск ссылок скрывает 99% зависимостей и как обратный обход графа вызовов выявляет 370 скрытых потребителей на глубине 3 уровней. В статье — верификация сквозной цепочки обмена с маркетплейсом; в архиве-компаньоне — автономный BFS-анализатор на Python, слепки графа и план регрессионного тестирования.
1 стартмани
12.10.2026 328 Ninel_S 0
Как-то доходилось разбираться в запросе на 6 тыс строк, УТ 10.3, парнишка был просто волшебник, сама процедура на 10 тыс строк, что там за муть творилась, в целом понял, а вот по деталям терпения не хватило разобраться )
Так и было, но проблема была в том, что алгоритм походу уже был рудинментом, в таких случаях легче было свой написать. По сути с таким часто и сталкиваешься и как правило такие волшебники, а чаще волшебницы хорошо ладят с всякими бухгалтерами и прочими и воспоминания о них у пользователей хорошие в большинстве ))))
Сами по себе запросы на 80 уровней очень даже читаемы, если на каждом уровне нет избытка логики. Но вот такое... это просто мрак.
- здесь читатели кода типовых ржут или плачут...?
- спасибо, поржал.
у них времени не хватает ошибки выявлеямые фиксить. куда тут до рефакторинга
На самом деле фигня, ибо про код только ленивый не писал. А вот разобрать аналогичным образом интерфейс, архитектуру (метаданные), да хоть рукодельные отчёты либо встроенную справку, итд - вот это было б куда как оригинальнее.
Нечто в духе:
1. Назовите ваш реквизит формы "РеквизитФормы" или "СписокЗначений". Тогда коллеги точно поймут, что это за фигня, ну и пусть, что при очередном обновлении платформы компилятор начнёт выдавать чудеса, а сторонние программы парсинга кода затупят - ничо!
2. Обязательно вкладывайте области в области, старайтесь выдерживать единообразие имён. Называйте области одинаково - тогда тот, кто попробует рефакторить, остро поймёт, что от перестановки фрагментов кода сумма (т.е. результат) весьма меняется!
3. Накрутите побольше групп-в-группах-в-группах, намутите декораций. Любое вмешательство в такую УФ резко исказит её и добавит здорового интереса даже при попытке подравнять кривое выравнивание. Используйте всю ширь монитора - у кого ноуты, пусть сами разбираются. Юзайте имена своих групп "Группа1" итд. в коде, массово программно меняйте всё, что можно - тогда никто не соскучится!
4. Запилите 90 ресурсов в регистре сведений, 50 реквизитов в таб.части документа, и побольше параметров сеанса да ролей. Много не мало, сразу будет ощутим масштаб, замах и глобальность! Назовите реквизит справочника "Ресурс" или "ТипЗначения". Обязательно сделайте несколько разделителей учёта, разделяйте и властвуйте!
5. Забабахайте ПФ из одноячейных секций, собирайте "по кирпичикам". Гибкость и шикарный внешний вид! А, и тоже меняйте программно после вывода в таб.документ, пост-обработкой. Можно насовать картинок. Смело юзайте объединённые ячейки, копируйте из эксельчиков, как оно там - вам быстрее, другим прикольнее!
6. Обязательно пишите справочную информацию. Фразы "Приход денег - это документ, отражающий денежный приход" или "Себестоимость должна рассчитываться согласно алгоритму расчёта себестоимости" - обязательные мантры для просветления, вас и всех соучастников.
Так вот, коллеги, каждый из нас в таком духе может нагнать пурги на стопицот килограммов. Но зачем?..
1. Сеньоры, конечно могут нагнать подобной "пурги" и должны знать все это. Но вот начинающие точно нет и мидлы не уверен что все.
2. Вот возьмите и напишите статью, тезис у вас уже заготовлен. Судя по плюсам она хорошо "выстрелит", от меня точно будет звезда.
"Где антипатерн использования процедур и функций размером больше 2-3х экранов."
и продолжается
"Дай посмотреть обработки что бы определить, бывают ли такие случаи, а то я не верю, что в некоторых случаях надо делать функции большими."
что явно говорит о его процедурном/"функционном" контексте. Но в любом случае, удачи Вам с Вашими процедурами/обработками на 6000 строк
А ещё есть функциональные опции "ИспользоватьМеханизм" и "НеИспользоватьМеханизм", строго по заветам БСП
Ну и понятное дело, самые нужные переключатели надо запихнуть на такую форму, найти которую на просторах интерфейса - мегаквест)
4. Возможно будет меньше потребления памяти для выполнения процедуры/функции
6. Не вижу сложности, если конструкция небольшая. Также вроде как быстрее выполняется код.
6. Непонятна нелюбовь к ?. Вполне себе рабочая функция
11. Зависит от задачи. Возможно так сделать оптимальнее. Но есть еще определенные хаки, упрощающие жизнь.
12. Как бы да, но не смертельно.
15. В БСП может и есть нужный функционал, но не факт что он выполняется быстро и не факт что через пару релизов этот функционал будет работать. Поэтому тут все зависит от задачи.
16. Зависит от запроса и опыта
4. Копейки. Больше памяти будет отнято у разработчика, читающего код.
6. Сложно анализировать изменения такого кода. Сложно выцеплять из всего листинга программы привычные конструкции. Быстрее будет работать только под отладкой.
7. Нелюбовь не столько к оператору, сколько к монструозным конструкциям, которые с помощью него пишут.
12. Ни один из 17-ти приведенных пунктов не является смертельным. :-)
15. Если быстродействия действительно не хватает, то может и стоит писать свое. С другой стороны не факт, что и Ваш код будет выполняться быстро. Что касается неработающего функционала, то не стоит так переживать сильно, если Вы, во-первых, используете только публичные методы, и во-вторых, используете инструменты стат. анализа, либо читаете документацию по переходу на новые релизы. В конце концов устаревшие методы в БСП живут очень долго.
16. О чем и речь. Более опытных разработчиков призывают писать запросы, перевариваемые даже менее опытными коллегами.
4. Все зависит от требований. Хотя я также придерживаюсь такой рекомендации, т.к. сложнее отлаживать.
6. Кому как
7. Когда большая конструкция, то да. Когда нет - то нет(если, конечно, оплата не по строкам кода)).
15. Я уже более 10 лет пишу различные решения для типовых конфигураций и подстав от БСП словил массу, поэтому, конечно, БСП использую, но аккуратно. Основная проблема - клиент установил и настроил интеграцию с сайтом/облаком. А затем обновил конфигурацию. обновилась БСП, где пропал/переименовался метод. В итоге клиенту нужно заново ставить интеграцию(если такая есть).А это время/деньги/ресурсы.
16. Опытные разработчики по определению должны писать сложные запросы простым языком.
4. Не представляю, какие требования могут здесь повлиять на принятие решения. Я понимаю, когда мы с большими коллекциями работаем. Но вот наличие переменных аукнуться может ну разве что при глубокой рекурсии.
6. Допустим, что Вы действительно с легкостью читаете листинг вне зависимости от того, "лесенкой" там циклы или в одну строку. Но изменения то? Вот при обновлении сравниваете два модуля. И видите изменение лишь в одной строке. Соответственно надо чуть больше сосредоточить внимание, дабы понять, что именно там поменялось: условие цикла или условного оператора, какой-либо из операторов тела или вообще пробел/точку с запятой удалили. Неужели такой подход не будет раздражать все больше и больше с ростом количества подобных конструкций?
15. Я в профессии раза в 1.5 меньше. И считаю, что да, БСП следует использовать аккуратно - в моем понимании это значит стараться использовать только публичный интерфейс. И да, при обновлении конфигурации логично ожидать изменений в ее библиотеках, то бишь обновление конфигурации должно повлечь за собой проверку и обновление интеграций. Ну и как я сказал, устаревшие методы долго живут. Проблемы вдруг всплывают, если делать очень большой шаг в обновлении, либо в промежуточные не проверять использование устаревших методов и не читать документацию по обновлению библиотеки. Странно ожидать от библиотеки сохранения API пятилетней давности в неизменном виде.
16. Ну вот статья как раз и осуждает чрезмерную сложность, созданную искусственно. Значит здесь мы вовсе не спорим. :-)
Если Условие Тогда Продолжить; КонецЕсли;Зачем растягивать это на три строки? Вполне читаемо, тут перегнули палку.
На своем примере: я использую шаблоны текста в конфигураторе. Они мне сразу после ввода "Если" расставляют "Тогда" и "КонецЕсли" на нужных позициях плюс отступ для тела условного оператора. Стало быть, если я захочу вписать все в одну строку, мне потребуется выполнить дополнительные телодвижения, дабы удалить лишние отступы и переносы строк.
Если же шаблоны не используются, будет чуть проще. Я предполагаю, что при наборе "Если ... Тогда.." уже на уровне мышечной памяти мизинец хочет ударить по клавише "Enter" :-) И его нужно вовремя остановить, в противном случае также придется удалять лишние пробельные символы.
Вот эти дополнительные мысли и действия я имел ввиду, когда писал про "толику усилий". :-)
Это что касалось картинки. Что касается объяснения: "лаконично" - безусловно, "быстрее читается" - не представляю даже, как это померить или хотя бы обосновать.
как жаль, что в 1С не завезли кортежей, поэтому и пихают в хеш-таблицу или недокласс результат работы функции.
это имхо гораздо лучше, чем в один параметр забубенить все
А что? Хорошая привычка. Попробуйте, вам понравится)
Если вдруг понадобится расширить функционал - не надо говнокодить, возвращая результат через параметры. Не надо искать все места вызова функции и переписывать их.
Если функция вызывается из другой функции, то банально, кроме результата, нужно передавать из неё сообщения об ошибках. Тут хорошим тоном считается выводить информацию для пользователя, в т.ч. об ошибках, на уровне интерфейса, а не кидать сообщения где попало.
Когнитивная и цикломатическая сложность? О чем вы, это же БСП :)
Длина строки 120 символов? Ага, счас! у наших разработчиков большие мониторы, можем себе позволить!
Писать код в блоке Исключение? Зачем? Ошибку экранировали, и этого довольно!
Вместо ЭтаФорма нужно писать ЭтотОбъект? Кто это сказал? Может, это и наши рекомендации, но мы их соблюдать не обязаны!
И так по очень многим пунктам тех самых Стандартов и Методик, на которые все кивают при размещении вакансий :)
ЗУП с непрозрачным "API", как они это называют, так и вовсе рептилоиды писали. Цепочки вызовов по 10-15 штук - ну а что, зато модульно!
Так что тут никаких статей даже не надо, достаточно просто пару лет поплеваться от типового кода, чтобы выработался рефлекс самому так не писать :)
Мои антипаттерны ближе будут коллегам выполняющим в команде обзор кода.
А пишут совсем другие люди и порой совсем с разными мыслями об этом.
Такое ощущение, что им 1с в целом неинтересно соблюдение стандартов, ибо надо быстрее шпарить новые релизы и фитчи, а культура кода и проектировании это на потом на рефакторинг, который может случится а может нет))
Вопрос к наличию кодревь, и вроде как пишут о новинках автотестирования и всяких прелестях жизни качественного продукта. А на деле неочевидно что применяется.
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Сники его в типовых часто сами применяют.
когда сначала пишется механизм, на него завязываются другие механизмы, а потом в основном находят ошибку и правят, а в зависимых местах иногда не правят.
1. Читайте стандарты - не так информативно, да и никто не полезет читать ИТС (скучно). Я разложил на конкретные ситуации с примерами и описанием. Эта информация позволит упростить код-ревью и повысить внутреннюю культуру разработчика (не у всех конечно).
2. Все примеры относительно простые и банальные (кроме обобщенных последних) ,поэтому легко запоминаются и легко исправляются. Стандартные антипаттерны для других языков не всегда применимы, иногда через какое-то обобщение и абстракцию.
3. Про 1С-ников из корпорации "зла" я уже говорил, что не стоит равняться на плохой стиль. "Единственный путь стать умнее — играть с более сильным противником" - Эмануэль Ласкер.
Мы в команде стараемся придерживаться стандартов и хорошего стиля. Как раз - эта статья результат нашего вебинара по качеству кода, которым мы решили поделиться с сообществом.
не решайте за всех и иногда надо читать что-то скучное, это нормально.
в вашей статье тоже много букв, но ведь ее прочитали.
ок.
какие противники, вы о чем? я вам бизнес-кейс, а вы мне мотивации. ладно, я тоже помотивирую - "выбирай выбирать, не выбирай не выбирать"...
классная у вас команда, время есть на вебинары и статьи на инфорстарте. иногда времени на рефакторинг не очень много.
1. Про поток лавы 1С спасибо, сейчас перечитал (много комментариев перегрузился).
2. Вебинар на 40-60 минут, приносит достаточно много пользы и поддерживает команду в тонусе. Но они не такие частые, к сожалению, не чаще 1 раза в неделю и может 1-2 раза в месяц. Это нормальная много где использующаяся практика, которая согласована с руководством. А статьи для сообщества я пишу в обычно свободное время, поэтому довольно большие интервалы.
Время на рефакторинг или технический долг тоже надо выбивать у руководства, к сожалению это также идет со скрипом, поэтому стараемся пресекать превентивно - код-ревью, архитект-ревью.
1. Сотни подписок на события.
2. Куча невидимых реквизитов объекта формы.
Что здесь не так? Вполне норм.
15. БСП не всегда логично работает, в частности, приходилось свое распределение числа на массив писать, БСП-вариант плохо относит погрешность округления...
и "классику"...
очень полезна книга Роберта Мартина "Чистая архитектура. Искусство разработки программного обеспечения"
Чистый код - больше для программистов на Java (и всех Си-подобных языков)
кто не хочет читать - посмотрите видео...
например от Немчинского - про правильные названия
Принцип DRY - (очень часто нарушается в 1С ! )
дублирование кода прям везде даже в типовых конфигурациях
Принцип KISS
а так же про составные принципы SOLID
Вот я не нашел статьи про то, как читать код. Как писать и как не стоит писать - да, а вот как читать?
Если серьёзно, то чтение кода упрощает только большой опыт, знание инструментов (т.е. объектов метаданных), знание стандартов разработки и много много написанного тобою лично кода.
Если через слово смотреть в синтаксис-помощник, то читать код конечно будет трудновато.
Надо задуматься... может правда статью написать про это
Рванные запросы любят использовать 1Сники, причем иногда ссылаются на логичность, банальный пример: проверять в запросе пустой параметр или добавить строку в условие запроса если параметр не пустой. Сами 1Сники используют второй вариант.
14 пункт тоже странный. Если путь на 100% определен и не будет меняться, то что в этом неправильного? Это с точки некой этики конечно неправильно, но ничего "анти" в этом нет.
Практических советов крупицы, количество полезной информации на общий объем текста стремится к нулю. Я уже не говорю что с паттернами тут вообще никакой связи нет.
(47)
Ну отсюда следует пункт, что если видишь неправильное написание кода то не нужно его придерживаться. Однострочный ввод используют только когда он удобен (сэкономил 2 секунды и т.д.), но осознано усложнять себе жизнь никто не будет.
(47)
К сожалению да. Видел древнейшие базы которые при начале работы системы обращались во внешние обработки. Конкретно с этим проблем никогда не случалось. Если кто-то в коде указывает путь до обработки на рабочем столе, то это скорее говорит о слабых навыках, а не о том что он все знает, но делает именно вот так.
Это все тянет на какие-то рекомендации оформления кода (местами спорные), но паттернами тут даже не пахнет.
Сначала бы хотелось увидеть руководство по паттернам проектирования от вендора, а то, судя по типовому коду, в самой желтой цитадели нет единого понимания, что такое шаблоны проектирования в 1С.
1. anti-pattern также устоявшееся понятие .
2. Согласен без обид, но название статьи отражает информацию, которая в ней изложена. Возьмите определения. Для некоторых антипаттернов есть устоявшиеся выражения, для некоторых нет.
3. Кроме приемов успешного кода, также нужно смотреть как не нужно делать. Это также важная информация, но с другой стороны баррикад. Использовать правильные практики одно, а вот найти у себя анти хорошую практику - другое. Т.е. вы можете использовать десять правильных подходов, но не замечать пару плохих.
19. Чем больше параметров в процедуре - тем лучше. Забудьте про СообщитьПользователю(Текст, Отказ, ПараметрыВывода). Гораздо лучше смотрится СообщитьПользователю(Текст, КлючДанных, Поле, ПутьКДанным, Отказ). Наиболее часто используемый параметр - Отказ - ставьте последним. Поверьте, другим программистам очень приятно считать запятые при написании вызова вашей функции.
О да, куда лучше тащить по всему стеку вызовов недокументированные структуры, чрезвычайно описательно названные типа "ДанныеДляПроведения", наполненные всякими полями.
Создайте пакеты запросов из 20 и более частей. Знайте, что понять такой пакетный запрос в процессе обзора и проверки кода практически невозможно не погрузившись полностью в тему
Это цитата из старой инструкции для команды разработчиков ЗУП 2.5?
Хорошей альтернативой является сборка в общий МенеджерВременныхТаблиц 20 временных таблиц с похожими, друг на друга, названиями, через кучу вызовов к функциям общих модулей, а потом сделать еще два-три запроса на 10 страниц, в котором их соединить. Текст запроса лучше собрать из кусков специальной функцией, размещенной в каком-нибудь отдаленном модуле менеджера. Желательно, все это делать в фоновых заданиях, чтобы веселее было отлаживать.
Особенно этим грешит ЗУП 3.1 :-)
А если серьезно - неплохо было бы добавить к статье многократное повторение запроса в цикле, обращение к целой ссылке ради одного поля (вместо использования ЗначениеРеквизитаОбъекта и т.п.), множественные серверные вызовы с формы ради каждого получаемого реквизита, и т.п.
1. Вы описали 16 т.н. антипаттернов, иронично пошутили над теми, кто до сих пор разрабатывает с использованием их.
2. На мой вкус, в каждой конкретной ситуации нужно использовать оптимальный паттерн, даже если он противоречит описанному в публикации. Спид кодинг, разовые скрипты и т.п.
3. В данном жанре вы не оригинальны, и т.н. "АнтиСоветы" дает каждый третий. Не думаю, что этот жанр способствует развитию профессиональных качеств у участников сообщества.
4. Должен признать, за проделанный вами труд, вы заслуживаете +.
Я считаю, что даже сеньору нарушать правила не следует. Приведенные примеры затрудняют выполнение проверки кода в команде (это из практики, а обычно команды состоят из набора уровней компетенции). Т.е. вы молодец запилите хтрый и крутой код и передадите в историю. А потом (как в комментарии выше, когда сотрудник уволился), то это решение будет упразднено.
2. Правильно - надо использовать хороший паттрен, но не антипаттерн. Однако, каждый кодит как считает нужным. Мы в команде решили по опыту придерживаться подобных правил.
3. В кулуарах, в чате возможно даже каждый второй, особенно вырастающие джуны в мидлов. По статистике на этом ресурсе не так часто поднимаются подобные вопросы, а они очень злободневны. И если почитать комментарии, то есть отзывы в которых видна благодарность - вот для этих людей в первую очередь и приведена эта статья. Сеньоров скорее всего мало чем можно удивить.
4. Спасибо.
ТекстСобщения = "В строке №" + НомерСтроки + " не заполнена колонка " + ИмяКолонки.
должно быть:
ТектСообщения = СтрШаблон("В строке №%1 не заполнена колонка %2", НомерСтроки, ИмяКолонки);
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1477792
Создание 19.07.21 09:45
Обновление 19.07.21 09:45
Просмотры 22367
Загрузки 0
Рейтинг
74
Комментарии 121
Код открыт Да
Рубрики Рефакторинг и качество кода
Кому
Разработчик
,
Стажер
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)