Делай как надо, а как не надо - не делай. Личный ТОП-10 ошибок в коде 1С, от которых дергается глаз

31.01.26

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

Открываешь код и глаз начинает дёргается? Я собрал личный список ТОП-10 самых раздражающих и опасных ошибок в 1С, с примерами, юмором и практическими рекомендациями, как писать так, чтобы потом не было мучительно больно.

Пятница, 17:55, открываешь чужой модуль (а иногда и свой, написанный много лет назад) и глаз начинает нервно подергиваться. Что это? Как так можно было написать?

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

Делюсь тем, как я НЕ пишу код сегодня, чтобы спустя время не хотелось оторвать себе руки. В основе личные правила и немного стандартов разработки 1С.

 

📝 1. Про личные дневники в коде

Видел в одном модуле… Человек, видимо, очень сильно переживал, когда писал.

Каждая его процедура была с предисловием:

// Сюда я вчера дописал до трёх ночи, вроде работает, но если сломается — я не виноват
// (Сергей, тут блин всё сложно!)
Процедура ЧтотоСделать()
КонецПроцедуры

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

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

🎭 2. Про языковой барьер

Я много раз видел смесь языков: Result = Новый Массив. Такое ощущение, что человек, который это написал, будто забыл, на каком языке думает и пишет.

Если уж пишем на 1С в России - давай писать по-русски, для международных проектов пишем на английском. 

МассивРезультатов - звучит более корректно и глаз не режет, не правда ли? 
 

🔎 3. Про НайтиПоНаименованию - костыльный костыль

Есть отдельная категория боли - это когда в коде встречаешь:

НайтиПоНаименованию("Название элемента справочника")

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

  • опечатки,
  • переименования,
  • и просто плохого настроения пользователя.

Это не код, это лотерея.

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

Если нужна настройка, нормальный путь только один: не искать по строке, а хранить ссылку. Лучше всего завести новую константу или отдельный регистр сведений.

Например, сделать регистр РегистрКонстант с измерением ИмяКонстанты (Строка), и ресурсом Значение (ЛюбаяСсылка, Булево, Строка, Дата, Число).

Однако, как верно заметил коллега gybson в комментариях, более верным и контролируемым архитектурным решением будет использование Плана видов характеристик (ПВХ) с предопределёнными элементами. Так вы полностью исключите риск опечаток в именах настроек. В коде вы будете работать со ссылками на элементы ПВХ, а не со строками.

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

 

📁 4. Про жёстко прошитые пути к файлам - мина замедленного действия

Есть ещё одна категория кода, от которого хочется сразу закрыть модуль и пойти пить "чай":

ИмяФайла = "\\FileServer01\\Share\\Reports\\Отчет.xlsx"

На первый взгляд - работает. А потом:

  • переименовали файловый сервер,
  • поменяли шары в домене,
  • изменили структуру папок или перенесли файлы,
  • или просто сменили среду.

И всё. Программа больше не работает.

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

Любые пути к файлам должны быть вынесены в настройки или храниться в константах/регистре или определяться динамически.

Жёстко прошитый путь в коде - это не удобство, это технический долг с очень коротким сроком погашения.
 

🧬 5. Про дублирование процедур - когда копипаст становится архитектурой

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

Почему так происходит? Да потому, что:

  • проще скопировать, чем аккуратно вынести
  • сейчас работает, потом разберёмся
  • страшно трогать рабочий код

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

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

Копипаст - это не ускорение разработки. Это рассрочка на баги, проценты по которой платит уже не тот, кто копировал.
 

📏 6. Про строчки, которые не помещаются

Это вообще моя любимая история. Открываешь модуль, а там условие на всю ширину экрана плюс ещё надо долго вправо скроллить. Типа такого:

Если (Не Документ.Проведен И (Документ.Дата >= НачалоМесяца(ТекущаяДата()) И Документ.Контрагент.ИНН = "1234567890")) Тогда

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

💀 7. Про код-призрак

Это, наверное, самое грустное. Открываешь модуль, а там наслоение истории и эпох, как археологический раскоп:

// Версия от 2015 (не удалять! Мария сказала может пригодиться)
// Процедура СтарыйРасчет()
// КонецПроцедуры

// Доработка от 2017 (работало не всегда)
// Процедура НовыйРасчет()
// КонецПроцедуры

// Текущая, вроде стабильная
Процедура РасчетПоПоследнимТребованиям()
КонецПроцедуры

Спрашиваю: "А зачем всё это?". "А вдруг понадобится или нужно будет откатиться". Но "вдруг" никогда не наступает, а читать и понимать код втрое дольше. Система контроля версий или хранилище конфигураций может хранить историю, правда? Храните историю там и не засоряйте настоящее.
 

🎪 8. Про области-матрёшки

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

#Область Основное
#Область Расчеты
#Область ВспомогательныеРасчеты
#Область ОченьВспомогательные
#КонецОбласти
#КонецОбласти
#КонецОбласти
#КонецОбласти

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

🩺 9. Про пробелы и табы

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

Таб, он как волшебная кнопка. Нажал и получил идеальный отступ. У каждого он может выглядеть по-своему (2, 4, 8 пробелов), но структура остаётся.

Tab он и в Африке Tab.


🚨 10. Про отсутствие обработки ошибок - "авось не упадёт"

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

А потом, в логах пусто, в интерфейсе "ничего не происходит" и тут начинается магия настоящих шаманов: "Странно, а у меня все работает...".

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

🎻 Вместо заключения

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

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

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

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

P.S. Если в этом тексте узнали не только чужие, но и свои ошибки - welcome to the club.

Думаю, мы все здесь немного такие. Главное это замечать и становиться немного лучше.

Хотя бы ради себя будущего, который будет тебе благодарен в 3 часа ночи перед релизом.

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

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

Маркировка в "древней" УТ 10.3 (10.3.6.8) и полноценный ТСД (Online) или как обойтись без перехода на УТ 11.5
Как подключить маркировку в древней УТ 10.3 без перехода на УТ 11.5 - все необходимые объекты, модули и доработки
Автоматическое обновление токенов Честного Знака в 1С
Автоматическое обновление токенов Честного Знака в 1С - готовое решение для УТ, КА, ERP, УНФ, Розницы и Бухгалтерии, которое избавляет от ручных обновлений и остановки процессов.
Дубликатор кодов маркировки (КИЗ) DataMatrix: Расширение 1С с проверкой в Честном Знаке (копирует ЛЮБЫЕ КИЗы!)
Автоматическое обновление токенов Честного Знака в 1С - готовое решение для УТ, КА, ERP, УНФ, Розницы и Бухгалтерии, которое избавляет от ручных обновлений и остановки процессов.
Маркировка остатков товаров на складе: Как сделать все быстро и без ошибок (мой практический опыт)
Маркировка остатков 10 000+ товаров без ошибок — готовое решение, которое исключает человеческий фактор, автоматизирует процесс и работает напрямую с 1С. Пошаговый опыт и готовое расширение внутри.
Маркировка остатков в распределенной рознице: Как промаркировать более 100 тыс. товаров в нескольких десятках магазинов без хаоса и ошибок
Маркировка остатков 100 000+ товаров в рознице без хаоса и ошибок — клиент-серверное решение, где сканируешь ШК в магазине и сразу получаешь КМ на принтере, независимо от кассового ПО. Практический опыт, регламент и готовый комплект кода внутри.

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

См. также

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

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

19.12.2025    1762    GarriSoft    14    

17

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

История о легендарном отчете на 11 000 строк, копеечном расхождении и костыле 2014 года, который пережил все обновления. О том, как Василий спас квартальное закрытие, не тронув ни единой строчки кода монолита

15.12.2025    1396    GarriSoft    21    

20

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

ИИ для код-ревью – не просто модный тренд, а реальный инструмент, который уже помогает разработчикам экономить время и повышать качество кода. В статье разбираемся, как запустить локальную LLM на базе Ollama, подключить ее к Git через Webhook и Python-скрипт, а также какие параметры модели отвечают за точность и галлюцинации. Делимся схемой работы, настройками и результатами тестирования, доказывая, что автоматизированное код-ревью действительно может работать – даже без космического бюджета.

30.10.2025    4592    user2100900    4    

17

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

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

28.10.2025    5456    vaillant    35    

16

Нейросети Рефакторинг и качество кода Обновление 1С Программист Бесплатно (free)

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

24.10.2025    3235    1c-izh    6    

9

Обновление 1С Рефакторинг и качество кода Механизмы платформы 1С 1С 8.3 Отраслевые 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 3.0 1С:Документооборот Абонемент ($m)

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

10 стартмани

17.10.2025    6263    40    Suker86    18    

21

Рефакторинг и качество кода Программист 1С:Предприятие 8 1С:Библиотека стандартных подсистем Абонемент ($m)

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

1 стартмани

06.10.2025    1614    9    Alex_Smolensky    25    

4

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

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

23.09.2025    8482    AlexeyPROSTO_1C    1    

17
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gybson 31.01.26 11:19 Сейчас в теме
Например, сделать регистр РегистрКонстант с измерением ИмяКонстанты


и ошибайтесь уже в этом имени =)))))

Сделайте лучше ПВХ с предопределенными значениями. Их правильное написание проконтролирует система.
GarriSoft; +1 Ответить
2. GarriSoft 310 31.01.26 12:23 Сейчас в теме
(1)
Коллега, спасибо за важное и очень конструктивное замечание!

Для стабильного, известного на этапе разработки набора параметров использование ПВХ с предопределёнными элементами является каноничным и самым корректным решением. Это даёт типизацию и контроль ошибок на уровне метаданных, чего не хватает простому регистру с полем-строкой.

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

Я добавил ваш вариант с ПВХ в статью как предпочтительное архитектурное решение.
Теперь у читателей будет полная картина: строгая типизация для системных настроек и гибкость для пользовательских параметров. Главная цель, это уйти от НайтиПоНаименованию() достигается обоими путями, но ваш путь более правильный и надёжный.
Для отправки сообщения требуется регистрация/авторизация