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

30.01.21

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

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

Вступление

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

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

Наш основной "манифест" - группа статей "Соглашения при написании кода" очевидно пересекается с классиками (Steve McConnell, Robert C.Martin) И дело не в общих идеях, а в мелочах: максимальная ширина строки, названия переменных, процедур, количество аргументов процедур и прочее. Уверен, что специалисты, которые ее писали, читали классиков гораздо внимательнее, чем мы. Итак, основной признак плохого кода - не использовать преимущества и тренды современного языка 1С. Что бы я еще хотел найти на ИТС ?

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

Функция - КонецФункции, Процедура - КонецПроцедуры

По количеству строк функция должна помещаться на экран, чем меньше тем лучше. О том же пишет Robert C.Martin (Clean code) глава 3, Функции, компактность.

Попытка - КонецПопытки. Не каждый код может дать исключение - зачем помещать все в попытку ?

//Некрасиво
Попытка
	НовыйДокумент = Документы.ЗаказПокупателя.СоздатьДокумент();
	ЗаполнитьЗначенияСвойств(НовыйДокумент, Источник,"Дата,Номер");
	НовыйДокумент.Записать();
Исключение
	//ЗаписьЖурналаРегистрации(...);
КонецПопытки;	

//Красиво
НовыйДокумент = Документы.ЗаказПокупателя.СоздатьДокумент();
ЗаполнитьЗначенияСвойств(НовыйДокумент, Источник,"Дата,Номер");
Попытка
	НовыйДокумент.Записать();
Исключение
	//ЗаписьЖурналаРегистрации(...);
КонецПопытки;

Пока - КонецЦикла Меньше уровней вложенности.

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

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

Если многабукв - очень большой фрагмент кода, то его можно оформить отдельной процедурой

2. Недостаток абстрактного мышления.

Например, вместо функции ЗаполнитьЗначенияСвойств() используют присваивание.

На картинке обычные формы, но на управляемых я видел похожее решение.

Возможно, одинаковые поля лучше выводить в таблицу, как это сделано в настройках СКД ?

3. Памяти Рэя Бойса и Эдгара Кодда посвящается.

Если данные нужны для одного процента документов, то это точно не реквизит документа. Добавьте его в регистр "ЗначенияСвойствОбъектов", добавьте в табличную часть "ДополнительныеСвойства", сделайте отдельный регистр сведений, отдельную табличную часть, в котором будет значение реквизита и ссылка на документ, только не в сам документ и не в общие реквизиты! Особенность современных баз данных - они гораздо эффективнее, когда растут вниз, а не вправо. В СУБД такие горе-реквизиты выглядят так:

Нравится заполнять диск нулями ?

Вопросы из зала ZOOM (после продолжительных аплодисментов):

Вопрос: - Почему такой логотип ?

Ответ: - Кот на логотипе вымытый, то есть чистый.

Вопрос: - Есть код, которым Вы гордитесь ?

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

Вопрос: - Почему бы не упомянуть про особенные требования к коду в цикле, коду внутри транзакции ?

Ответ: - Это обычные случаи, как правило все знают.

Вопрос: - Что нужно, чтобы код наших программистов был идеальным ?

Ответ: - Прежде всего, нужно договориться внутри команды, "установить правила игры", одинаковые для всех. Что-то вроде устава, в котором прописать конкретные паттерны и антипаттерны ?

Вопрос: - Что главное для программиста ?

Ответ: - Каждая бочка меда должна содержать хотя бы ложку самоиронии. Может, это то что отличает умного человека от заумного ?

Вопрос:  - Ваш любимый мем ?

Ответ:  - Наверное, это "Гарольд сдерживает боль" с подписью "Когда увидел большой кусок квазикода..."

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

Вопрос: - Ваше любимое изречение Конфуция ?

Ответ: -

"Написать красивый код может каждый.

Настоящее искусство программирования

- развивать существующий квазикод,

чтобы он давал квазирезультаты на квазиданных,

и получать за это настоящую зарплату."

 

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Нейросети Рефакторинг и качество кода Запросы Разработчик 1С 8.3 Абонемент ($m)

Нейросеть написала запрос или процедуру для вашей базы 1С, и непонятно, все ли имена в нём настоящие. Обработка компилирует текст без выполнения, сверяет его с метаданными этой базы и к каждой ошибке пишет настоящее имя, например ВНаличииОстаток вместо выдуманного КоличествоОстаток. Список ошибок с подсказками одной кнопкой копируется обратно в чат с моделью.

10 стартмани

02.11.2026    353    1    nedomolkov.ivan    1    

2

Рефакторинг и качество кода Разработчик 1С:Предприятие 8 Россия Бесплатно (free)

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

29.10.2026    374    YA_777378709    0    

4

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

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

28.10.2026    486    Pavel791    0    

2

Рефакторинг и качество кода HighLoad оптимизация Системный администратор Разработчик Стажер 1С 8.3 Абонемент ($m)

Если к HTTP-сервису 1С обращаются сразу несколько программ, сколько запросов в секунду он успеет обработать? Я опубликовала простой HTTP-сервис на нашей "подопытной" конфигурации «Нано-УТ» (файловая база, Apache, без прав администратора) и нагрузила его скриптом на Python. Ответ: около 15-16 запросов в секунду, сколько бы клиентов ни обращалось одновременно. Запросы ждут своей очереди, и при 32 клиентах ответ приходит через 2 секунды вместо 64 мс. Заодно разобрала скрипт из первого варианта статьи: он «проверял» сервер, который отвечал по одному, и считал ошибки вместе с успешными ответами. В архиве исправленный скрипт, учебный сервер, HTTP-сервис для 1С и инструкция по запуску.

1 стартмани

23.10.2026    518    Ninel_S    3    

2

Рефакторинг и качество кода Разработчик 1С 8.3 Абонемент ($m)

Запустили Analyzer 1C 2.7.65 на промышленной конфигурации (596 модулей, 13 669 функций) и исследовали перегруженные функции (до 1887 строк), циклические зависимости и экран «Циклы» (кольцо из 64 модулей). Разобрали, почему популярные метрики (McCabe, связность) не представлены в продукте вендора, и составили пошаговый план разделения модуля. Привели проверенный платформой 8.3.27 пример до и после рефакторинга и выявили скрытую ловушку загрузки модулей с точкой в имени.

9 стартмани

19.10.2026    455    Ninel_S    2    

2

Рефакторинг и качество кода EDT СКД Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)

Одиннадцать граблей схем компоновки, которые не видно в конструкторе и не ловит EDT, на реальных отчетах БП КОРП. Формат числа задается в двух местах, и условное оформление варианта перебивает формат поля. Ресурс складывает штуки с часами, и помогает выражение «только когда единица одна». Ресурс пуст в детальных записях, параметр не появляется в шапке без userSettingID, valueListAllowed ломает границы периода, Остатки и СрезПоследних с параметром периода падают с «Несоответствием типов», title без xsi:type дает «Исключение XDTO» при загрузке. В конце код проверки схемы из файла до обновления базы, сводная таблица и чеклист.

16.10.2026    529    Konstmax13    2    

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    3472    Konstmax13    11    

11

Рефакторинг и качество кода Тестирование QA Разработчик 1С 8.3 Абонемент ($m)

Инженерный анализ влияния (Impact Analysis) при изменении общего метода в 1С:Предприятии: почему штатный поиск ссылок скрывает 99% зависимостей и как обратный обход графа вызовов выявляет 370 скрытых потребителей на глубине 3 уровней. В статье — верификация сквозной цепочки обмена с маркетплейсом; в архиве-компаньоне — автономный BFS-анализатор на Python, слепки графа и план регрессионного тестирования.

1 стартмани

12.10.2026    325    Ninel_S    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kolya_tlt 92 04.11.20 15:43 Сейчас в теме
Добрый день.
1ый пункт даже в стандартах описан
2ой кажется вы правильно поняли Роберта Мартина, либо метод ЗаполнитьЗначенияСвойств принятую "за уши". Бывают случае на проектах, когда пользователям по какой-то не понятной религии ну очень не удобно пользоваться таблицами вместо полей ввода
3 где ж вы были 10 лет назад? ранее работа в компании с огромным количеством докуметов ЧекККМ и на каждый проект добавляли 3-5 реквизита, потом целых 2 года разносили по разным регистрам ...
2. vasilev2015 2862 04.11.20 16:54 Сейчас в теме
(1) Спасибо за комментарий.

1) Пришлите ссылку, буду внимательнее ?

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

3) Зато все при деле, зарплата капает :-))
3. aspirator23 343 04.11.20 18:04 Сейчас в теме
(1) Есть один франчайзи, который разрабатывает продукт 1с для страховщиков. Когда я увидел их документ - договор, у меня выпали предпоследние волосы. С тех пор я не причесываюсь. В этом документе было все. И при всем том, этот продукт был сертифицирован. Может тогда все были добрее?
4. CheBurator 3235 04.11.20 19:41 Сейчас в теме
(3) тогда было больше программистов 1С. они порождали больше кода и больше доставляли.
сейчас программистов гораздо меньше, всё больше раставлятели галочек. Поэтому разннообразия - гораздо меньше.. ;-)
FatPanzer; +1 – Ответить
5. vasilev2015 2862 04.11.20 20:01 Сейчас в теме
6. FatPanzer 04.11.20 20:13 Сейчас в теме
(3) Я видел заказ клиента в котором рассчитывались и хранились(!) всякие складские оборачиваемости товаров по складам на момент заказа с учетом количества из заказа (в деньгах и килограммах), исполнения планов продаж по товарам, а также всякие себестоимости и рентабельности... В табличной части, да.
rudnitskij; user1464234; +2 – Ответить
7. protexprotex 142 04.11.20 20:49 Сейчас в теме
А я видел когда программисты одной известной фирмы данные по табличной части хранили в файлах типа txt. Правда, это была еще 1С 7.7. - и там надо было хранить подчиненные таблицы другу другу. На мой вопрос - "а почему не хранить в справочниках с id строки строки - владельца" - на меня очень долго смотрели и далее выдали - "а как это?"
user1464234; +1 – Ответить
8. FatPanzer 04.11.20 20:56 Сейчас в теме
(7) Ну незнают люди про старые добрые реляционные БД типа dBase и FoxPro...
9. protexprotex 142 04.11.20 22:40 Сейчас в теме
(8) Современные программисты на слово DOS - говорят - "Вы имеете ввиду? dDOS - атака?" :-)
rudnitskij; sanytch; alex-l19041; user1464234; +4 – Ответить
10. user1464234 04.11.20 22:46 Сейчас в теме
Кстати да. А зачем прописывать статические ip адреса в сети, если принтеры по вайфай подключаются? И еще у нас в базе когда то был справочник принтеры, где пользователь выбирал на что печатать без предварительного просмотра.
Как в этот справочник добавить принтеры по вайфай подключенные - мак адрес использовать?
Или имени-отчества достаточно?
11. ivanov660 4989 04.11.20 22:53 Сейчас в теме
1. Написать код сразу идеально - это не жизненная позиция, логично требовать отсутствие "г*вно кода". И для выполнения этого требования идеальности существует процедура называемая - рефакторинг.
2. Про пример вложенности обычно я представляю ситуацию с "матрешкой если тогда". Здесь скорее всего имелов ввиду повышение прозрачности при анализе кода, выполнения код-ревью.
3. Третьему утверждению я бы также следовал не всегда. Давайте рассмотрим ситуацию, когда эти реквизиты требуется получить в запросе, то в итоге мы вместо обращения к одной таблице документа будем вынуждены добавлять левые соединения, что может уменьшить быстродействие. Особенно будет заметно на больших объемах баз данных (1% от 100 документов - это 1 документ, а 1% от 1 000 000 это уже 10 000 документов).
К тому же, как я говорил выше, когда выполняются решения о добавлении реквизитов в документ, то вряд ли, кто-то адекватно оценивает возможные объемы данных и понятие приходит постфактум. А в этом случае постфактум выполняем рефакторинг и возможно переосмысление архитектуры.
15. vasilev2015 2862 06.11.20 09:38 Сейчас в теме
(11) Здравствуйте, Владимир !

вместо обращения к одной таблице документа будем вынуждены добавлять левые соединения, что может уменьшить быстродействие


Вдумайтесь: левые соединения не самая медленная операция СУБД.
Самая медленная операция - это сканирование таблицы. Считываются не только все строки, но и все колонки.
Создавая одну большую таблицу мы провоцируем СУБД именно на скан ВСЕЙ таблицы для поиска данных конкретного реквизита.

Индексы ВСЕЙ таблицы не решают проблемы:
Индекс документа устроен так, что не может содержать два реквизита. Поэтому если в запросе нужно получить два реквизита, то СУБД выбирает между левым соединением двух индексов ВСЕЙ таблицы и сканом всей таблицы. Чаще всего это скан.

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

Поэтому нормальную архитектуру нужно планировать сразу.
19. ivanov660 4989 06.11.20 15:17 Сейчас в теме
(15)тут вопрос в полях по которым идет отбор и целях получения данных.
Если мы рассматриваем отбор по индексному полю - ссылка, а реквизит как условие был кредит или не было, который влияет на дальнейший путь логики, то никакого скана не будет и вопрос быстродействия появляется)
12. SlavaKron 05.11.20 10:30 Сейчас в теме
Возможно, одинаковые поля лучше выводить в таблицу, как это сделано в настройках СКД ?
Долго не мог понять эту фразу. Наверно, лучше сказать "одинаковые по назначению" или "схожие по назначению" вместо "одинаковые". Вот пример публикации к этому пункту https://infostart.ru/public/1312768/ – реквизиты объекта выводятся каждый в отдельный элемент формы и поиск по имени реквизита преподносится как "фишка" публикации, хотя если сделать это через таблицу значений, в которой уже реализован поиск по колонкам, "киллерфича" будет уже в комплекте.
13. Hatson 541 05.11.20 13:34 Сейчас в теме
Работая уже в N-ой конторе который раз убеждаюсь, что всё, что связано с программированием и технологичностью за рамками типового кода типовых решений 1С лежит исключительно в плоскости перфекционизма. А перфекционизм - это прямое следствие низкой самооценки, и как известно, своими корнями уходит в детские психо-травмы, а это уже область психиатрии. И ЗП программиста при текущей ситуации на рынке труда не зависит от умения писать хороший код. Вы будете удивлены, но она зависит только от качества и здоровья личной самооценки.

Коллеги, если вам кажется, что чей-то код недостаточно хорош, то это отличный повод начать разбираться со своими психо-травмами - скорее всего вы страдаете "синдромом самозванца", или перфекционизмом. И то и другое - заниженная самооценка.
zzzzz; kMidas; kuzyara; +3 –1 Ответить
14. ImHunter 351 06.11.20 06:52 Сейчас в теме
(13) Вот так вот))) Нафига всякие DRY, KISS и проч лабуда. Всем к психологу!
rabid_otter; +1 – Ответить
16. Hatson 541 06.11.20 11:46 Сейчас в теме
(14) за DRY, KISS и пр лучше идти в Java и др true-языки программирования, но сдается мне и там перфекционисты счастья не найдут ))
23. rabid_otter 134 30.01.21 18:31 Сейчас в теме
(16)
отличный повод начать разбираться со своими психо-травмами

воу воу воу, в ветке появился диванный психиатр?
почему вы считаете нормально написанный код - результатом психо-травм? или так модно сейчас?
за DRY, KISS и пр лучше идти в Java и др true-языки программирования

KISS: в 1С нельзя спроектировать систему проще?
DRY: в 1С нельзя упаковать код в общий модуль или функцию?
имхо, какая-то дичь.
PS: оттираю себя с пола (ведь у меня комплексы и низкая самооценка).
17. vasilev2015 2862 06.11.20 12:06 Сейчас в теме
Чтобы все правильно понимали: я сейчас сижу на месте Василия (Hatson) и вижу его код.
Поверьте, с кодированием у него все в порядке, он _хороший_ инженер.
А в последних комментариях он показывает себя с положительной стороны и как менеджер.
Так что талантливый человек - талантлив во всем :-)))
18. Hatson 541 06.11.20 14:36 Сейчас в теме
Теперь по существу

1) Есть хорошая статья - там не только про операторные скобки.
Вы не умеете работать с транзакциями

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

3) С картинкой с нулями - вообще красота!!! У нас корпоративный стандарт добавить в справочник номенклатура 50 дополнительных реквизитов и столько же табличных частей, а потом в коде написать Номенклатура.Артикул .... и конечно же в цикле!))))
TerveRus; FatPanzer; +2 – Ответить
20. Hatson 541 12.11.20 15:22 Сейчас в теме
Еще один способ получения среза последних. И кто бы мог подумать! Гениально!
PS
Наша ERP пронизана такими паттернами
Прикрепленные файлы:
21. bugagashenka 206 09.12.20 22:19 Сейчас в теме
//Красиво
Пока ВыборкаДетальная.Следующий() Цикл

Если НЕ ПроверитьУсловие() Тогда

Продолжить;
КонецЕсли;

//многабукв
КонецЦикла;


А мне нравится
ДействияВыполнены = ПроверитьУсловие() И ДействияПриИстина();
Функция ДействияПриИстина()
    //многабукв
КонецФункции 


Всегда предпочитаю //многабукв утащить в отдельную функцию. Если она не летит с клиента на сервер, конечно=)
22. rabid_otter 134 30.01.21 18:25 Сейчас в теме
1. у дяди Стива было про определение переменных как можно ближе к месту использования и многое чего другое. как бы само собой разумеется, что легче, когда в голове не надо держать условие оператора if при изучении кода.
2. абстракции - это было про ООП, а не про "ЗаполнитьЗначенияСвойств".
3. это для типовых подходит, а для нетиповых так не получится.
и да, надо уметь правильно декомпозировать задачу.

ради этих трех пунктов надо было городить статью? зачем?
24. vasilev2015 2862 30.01.21 18:48 Сейчас в теме
(22) Проблема не в том, что статья короткая, а в том, что никто не старается программировать.

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

Правила Кодда-Бойса нужно соблюдать и для нетиповых конфигураций тоже.

Верьте в себя, начинайте программировать лучше - все у Вас получится.
25. rabid_otter 134 30.01.21 19:26 Сейчас в теме
(24) бывает так, что при использовании ЗаполнитьЗначенияСвойств не пишется, что нужно заполнить. и вот это не очень хорошо, я для наглядности всегда пишу список свойств, которые мне надо заполнить.
да и так бывает что если базу писали плохо, имена свойств в разных таблицах различаются, и тут тоже указанная выше функция не подходит.
может быть у меня проблемы с логикой, но "избегайте копипаста" != наличие или отсутствие абстрактного мышления.
"Верьте в себя, начинайте программировать лучше - все у Вас получится."
спасибо, желаю и вам того же.
Для отправки сообщения требуется регистрация/авторизация