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

Написание кода "на коленке" приводит к непредсказуемым доработкам в самом ближайшем будущем.
Пример 1: Решили вести учет трудозатрат в компании по проектам. Предположили, что нужно ограничить виды работ сотрудника согласно состоянию проекта. Добавили реквизит СостояниеПроекта в справочник ВидыРабот, скорректировали поведение документа ЕжедневныйОтчет и ввод трудозатрат непосредственно из формы проекта, наваяли инструкцию для пользователей, соорудили отчет, тестировщики это дело проверили и выпустили релиз.
И тут выясняется, что ограничивать нужно по нескольким статусам проекта, а не по 1-му.
Пример 2: Ограничили по нескольким статусам (как и нужно), но допустили ошибку в форме ввода трудозатрат из проекта. Ошибку выявили только пользователи.
Чувствуете разницу?
Способ следования тезису:
Тщательное продумывание требований и архитектуры.
2. Код должен читаться как книга.
Немного теории: исследования гласят, что при внесении изменений в чужой код тратится 60% на чтение и только 40% на собственно изменения.
Пример:
Представим метод ЗаполнитьТовары(ДокументОбъект, Параметр1, параметр2, ...Параметр10) с общей целью: заполнить ТЧ Товары документа.
Доработка: Нужно сделать так, чтобы при определенном условии добавлялось 2 строки товаров, а не одна.
Вроде как нет проблемы, метод найден, цель понятна. Кодер, радостно разминая пальцы, с возгласами "Ща за 15 минут сделаю и на обед :))" приступает к работе.

Через полчаса бормотаний, на 700-ой строчке единственного метода маячит долгожданный текст
ДокументОбъект.Товары.Добавить()
с расплывчатым пониманием алгоритма метода:
- анализ условий добавления строк;
- формирование дополнительных данных для заполнения строк;
- собственно добавление строк.
Шаги алгоритма настолько перепутаны, что нужно вносить дополнительные условия через каждые 50 строк "размазанного" кода.
Далее следует полчаса доработки, затем еще час на тестирование и видимое избавление от неизбежных ошибок из-за нарушенной логики.
Опять немного теории: средний человек может манипулировать в голове максимум 5-7 взаимосвязанными объектами одновременно. Под объектом понимаем любые данные, относящиеся к текущим размышлениям. Применимо к программированию, например, мы помним назначение входных и выходных параметров метода, их тип, порядок присвоения. Можно представить это как буфер (или оперативную память человека). Процесс манипулирования этими данными называется метким термином "умственное жонглирование". Есть, конечно, уникумы, способные на жонглирование более, чем 7 объектами. Такие способности можно развить. Вопрос в том, а нужно ли это?
Собственно, рассеяный взгляд и невнятное бормотание программиста как раз указывают на пребывание в состоянии жонглирования и боязнь потерять "кегли"...
А кто не слышал или сам не восклицал с чувством гордости:
"Я такой хитрый код сегодня наваял!".
Гордость должна быть за простоту и понятность кода. Хитрость часто является следствием ошибок логики.
Готовы проявить такую же хитрость в расширении этого же кода спустя полгода :) ??
Источники проблемы:
- отсутствие понимания назначения метода (подсистемы, модуля)
- кодирование для быстрой записи, но для не последующего чтения. Нужно написать быстро, лишь работало, а потом, можеть быть, разберемся.
- отсутствие комментариев или наличие слишком технических комментариев.
Способы решения задач управления сложностью известны уже лет 40. Многие их читали, но немногие используют/не хотят использовать. Перечислю только наиболее базовые:
1) Каждый метод приводит к достижению одной конкретной цели
2) Количество параметров метода не должно превышать 5-7. Превышение - не преступление, но "звоночек" для того, чтобы задуматься о правильности логики метода.
3) Метод содержит дейстия одного уровня абстракции.
Пример из реальности:
Строительство дома - это:
- подготовка фундамента
- подвод коммуникаций
- возведение стен
- настил крыши.
На таком уровне проектирования нас не интересует требуемый материал и цвет ручки двери.
Мы скрыли (выполнили инкапсуляцию) данного требования на уровне ручки, ручку на уровне двери, дверь на уровне стены.
В коде же такое сплошь и рядом, например, куча запросов в одном методе.
4) Понятные имена методов, переменных, объектов метаданных.
5) 1 метод - не более 1-го экрана текста. Рекомендация относительная, но полезная.
6) Целевые комментарии к шагам алгоритма.
Список рекомендаций можно продолжать дальше.
3. Не жалейте свой код.
В процессе реализации задачи часто возникает потребность проверить возможность реализации определенной ее части. Пишется на скорую руку обработка, выполняется проверка, затем кусок кода целиком копируется в рабочую конфигурацию. Игнорируются особенности интеграции, способы обработки ошибок, наименования параметров.

Способы следования тезису:
- рассматривать код обработки как черновик, который неизбежно станет мусором
- удалять код, который не используется, а не комментировать его на будущее.
4. Тестирование выявляет только явные ошибки.
Многие разработчики свято верят в то, что завершение тестирования (в идеале тестировщиками) является подтверждением работоспособности. Но это не так. Всегда есть скрытые ошибки, выявить, которые может только сам разработчик или компетентный читатель кода (аудитор). А иногда и пытливый заказчик.

Способы следования тезису:
- чтение и тщательный анализ своего кода.
- подход в собственном тестировании "хочу добиться ошибки", а не "подтверждаю корректность".
Общие соображения
Еще раз повторяюсь, что все вышесказанное весьма очевидно и приходит с опытом. Но не выполняется. Многие спустя 10 лет практики программирования наступают на одни и те же грабли.
Усугубляет ситуацию представление 1С как среды быстрой разработки со стремлением максимально ускорить написание кода в ущерб качеству. Да, в 1С много замечательных вещей упрощающих труд программиста, но базовые принципы объектно-ориентированного программирования никто не отменял.
Справедливости ради, отмечу, что качество многих исходных конфигураций от 1С (например, БСП) довольно высокое. Можно возмущаться насчет огромного уровня вложенности методов, неявной их связности, но при последующем разборе логика становится прозрачной.
Следствие: дефицит опытных специалистов 1С, при, казалось бы, избыточном общем предложении.
Опытному РП достаточно 5 минут, что оценить качество кода при приеме на работу.
Так что стремитесь к совершенству!
P.S. В статье только часть "правил хорошего тона". При наличии времени хочу написать еще 1-2 статейки на данную тематику.
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Нейросети Рефакторинг и качество кода Запросы Разработчик 1С 8.3 Абонемент ($m)
Нейросеть написала запрос или процедуру для вашей базы 1С, и непонятно, все ли имена в нём настоящие. Обработка компилирует текст без выполнения, сверяет его с метаданными этой базы и к каждой ошибке пишет настоящее имя, например ВНаличииОстаток вместо выдуманного КоличествоОстаток. Список ошибок с подсказками одной кнопкой копируется обратно в чат с моделью.
10 стартмани
02.11.2026 284 1 nedomolkov.ivan 1
Рефакторинг и качество кода Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
Одна проверка в обработчике кнопки может выглядеть достаточной, пока ту же операцию не вызовут из другого места. На примере управляемой формы разберём, почему так происходит, как разместить проверку в общей серверной функции и чем отличается удобная проверка ввода от обязательного условия выполнения операции.
29.10.2026 323 YA_777378709 0
Рефакторинг и качество кода Разработчик Бесплатно (free)
Рассказываем, почему качественный код – это не техническая прихоть, а актив, который помогает бизнесу быстрее адаптироваться к изменениям и запускать новые фичи без бесконечного преодоления техдолга. Показываем, как объяснить бизнесу ценность рефакторинга через понятные признаки: замедление разработки, неточные оценки, страх перед legacy и хрупкость системы. Разбираем, почему неправильный рефакторинг может быть дороже его отсутствия, какие анти-паттерны ломают процесс и как не превратить улучшения в бесконечную переделку ради переделки. Объясняем, как сделать рефакторинг частью культуры команды: договориться с бизнесом, научить разработчиков видеть проблемные места, закрепить правила и поддерживать улучшения на уровне тимлидов, архитекторов и всей команды.
28.10.2026 427 Pavel791 0
Рефакторинг и качество кода HighLoad оптимизация Системный администратор Разработчик Стажер 1С 8.3 Абонемент ($m)
Если к HTTP-сервису 1С обращаются сразу несколько программ, сколько запросов в секунду он успеет обработать? Я опубликовала простой HTTP-сервис на нашей "подопытной" конфигурации «Нано-УТ» (файловая база, Apache, без прав администратора) и нагрузила его скриптом на Python. Ответ: около 15-16 запросов в секунду, сколько бы клиентов ни обращалось одновременно. Запросы ждут своей очереди, и при 32 клиентах ответ приходит через 2 секунды вместо 64 мс. Заодно разобрала скрипт из первого варианта статьи: он «проверял» сервер, который отвечал по одному, и считал ошибки вместе с успешными ответами. В архиве исправленный скрипт, учебный сервер, HTTP-сервис для 1С и инструкция по запуску.
1 стартмани
23.10.2026 483 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 431 Ninel_S 2
Рефакторинг и качество кода EDT СКД Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)
Одиннадцать граблей схем компоновки, которые не видно в конструкторе и не ловит EDT, на реальных отчетах БП КОРП. Формат числа задается в двух местах, и условное оформление варианта перебивает формат поля. Ресурс складывает штуки с часами, и помогает выражение «только когда единица одна». Ресурс пуст в детальных записях, параметр не появляется в шапке без userSettingID, valueListAllowed ломает границы периода, Остатки и СрезПоследних с параметром периода падают с «Несоответствием типов», title без xsi:type дает «Исключение XDTO» при загрузке. В конце код проверки схемы из файла до обновления базы, сводная таблица и чеклист.
16.10.2026 461 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 3359 Konstmax13 11
Рефакторинг и качество кода Тестирование QA Разработчик 1С 8.3 Абонемент ($m)
Инженерный анализ влияния (Impact Analysis) при изменении общего метода в 1С:Предприятии: почему штатный поиск ссылок скрывает 99% зависимостей и как обратный обход графа вызовов выявляет 370 скрытых потребителей на глубине 3 уровней. В статье — верификация сквозной цепочки обмена с маркетплейсом; в архиве-компаньоне — автономный BFS-анализатор на Python, слепки графа и план регрессионного тестирования.
1 стартмани
12.10.2026 287 Ninel_S 0
Да и с тестированием в 1С довольно все грустно. Как такого его там нет. Отсюда и страшно дорабатывать... черт его знает, сломал ли чего-нибудь.
Способ организации "расширяемости" принятый в 1С - видели же "[ИмяМодуля][Сервер|Клиент]Переопределяемый" - уже в 4 раза увеличил количество модулей.. это еще до УправляемыхФорм.. а сейчас - вообще хочется застрелиться при отладке - на Зарплате 3.0 - пока доберёшься до работающего кода нужно иногда 8 таких "точек расширения" пройти.. а ведь всё это - по сути - имитация свойств ООП..
В общем, нужно фирму 1С просить язык развивать, а не новые "блоки" и "функции" в платформу фигачить..
Я полагаю, эту строку в тексте вы пропустили.
И немного информации тут
Да, вы правы. Большая часть содержимого статьи - по мотивам книги "Совершенный код". Плюс личный опыт. Могу добавить, что следование вышеописанным правилам намного упрощает работу (проверено на паре проектов). Следовал им и раньше, но после прочтения сложилась целостное представление :)
Антон Ширяев,
Да, таким советам не всегда удается следовать, особенно сидя у заказчика.
Но при добавлении, например, целой новой подсистемы во внутреннем проекте весьма полезно.
p.s.: и будем нарушать.
В ситуации когда есть возможность сделать по правильному, конечно лучше сделать так, но зачастую это ухудшит обновляемость.
К сожалению эстетическое качество кода не всегда приводит к хорошему быстродействию, да и заказчикам трудно объяснить, что нужно платить больше за качество кода, а не за конечный функционал добавленный разработкой.
Очень часто, можно сказать - постоянно, наталкиваюсь на размещение в модуле формы функций или процедур которые обращаются к данным базы (прямые обращения или через механизмы запросов).
Моё мнение - это в корне не верно. Для размещения подобного кода лучше использовать модуль объекта или модуль менеджера. Наилучшим размещением будет расположение в общих модулях.
Такое размещение кода позволит практически все обращения к базе выполнить на стороне сервера, что значительно увеличит скорость работы системы. Да и интерфейс пользователя будет работать более плавно.
Если запрос написан в модуле формы - его выполняет клиент, а если запрос написан в модуле объекта - его выполнение перехватывает на себя сервер.
Вы считаете запросы к базе алгоритмами формы? Я - нет. Для меня любой запрос является либо общим для всей конфигурации, и находится в общем модуле, либо алгоритмом объекта и находится в модуле объекта.
С учетом управляемых форм множество алгоритмов можно перенести вообще в модуль менеджера! Достаточно передать идентификатор объекта и вернуть структуру или соответствие с результатом.
А зачем в модуле формы выполнять запросы, порой, в несколько скроллов длинной? Не проще ли перенести запрос модуль объекта (который так же контекст данной формы) а в форме оставить только вызов функции интуитивно понятный, одной строкой?
Если подобным образом писать код, то не нужно заниматься интимом с конфигуратором, выискивая ошибку в куче мусорного кода.
Если ошибка связана с отображением - смотрим форму.
Если ошибка связана с обработкой данных - модуль объекта ил модуль менеджера.
Я уже года три пишу в таком стиле - гораздо легче стало сопровождать. Меньше ошибок допускается, гораздо проще вносить изменения.
Если обычный режим запуска системы - и модуль формы и модуль объекта исполняются на стороне клиента, поэтому собственно никакой разницы куда помещен запрос (в модуль формы или объекта) нету, обращение к БД будет выполняться всегда со стороны клиента.
Если управляемый режим запуска - в любом случае, если необходимо выполнить запрос к БД из формы, то запрос нужно будет помещать в серверную процедуру формы (с соответствующей директивой компиляции) или модуль объекта, что в первом, что во втором случае - это вызов сервера и обращение с него к БД.
Фирма "1С" считает иначе, я лишь придерживаюсь ее стандартов и рекомендаций, на сколько я помню, Радченко в одной из своих книг писал, что при выборе места размещения процедуры (в модуле формы или объекта) следует исходить из логики ее использования и применения. На самом деле, если мне необходимо программно заполнить на форме для поля ввода список его значений - зачем мне обращаться для этого к объекту, если это чисто локальная задача для конкретного поля ввода конкретной формы (поместив ее в модуль объекта, тем самым мы замусорим его модуль, т.к. эта процедура не используется отдельно в контексте модуля объекта, а только в контексте одной из его форм)?
Еще одной из причин не размещения всех процедур, связанных с запросами к БД, в модуле объекта - при обращении к объекту для вызова только лишь одной из его процедур вместе с ним на клиент тянутся все его табличные части, и если они большие по объему, то их получение возможно будет занимать больше времени, чем исполнение самой вызываемой процедуры.
В этом соглашусь, если смотреть с этой точки зрения, то конечно подобное разделение исполнение кода облегчает его отладку.
Тут вы не правы. Посмотрите на замер производительности. Все запросы, размещенные в модуле объекта - автоматически передаются на сторону сервера. Если запросы размещены в форме - выполнение на стороне клиента.
Если вы работаете с формой некоего объекта - у вас уже существует вся его структура, на стороне клиента, для классических форм всегда, для УФ только в толстом клиенте, на стороне сервера при тонком и web клиентах.
Если включить замер производительности в режиме обычного приложения то в таблице замера отсутствуют такие графы как "Клиент"/"Сервер"/"Обработано сервером", т.к. в этом режиме модули объектов и форм компилируются и исполняются на стороне клиента, а при выполнении запросов к БД происходит обращение к серверу, поэтому где бы мы не разместили процедуру с запросом (модуль объекта или формы) - всегда будет выполнено обращение к серверу столько раз, сколько производится запросов к БД (допустим, столько раз сколько в процедуре прописано "Запрос.Выполнить()").
В управляемом приложении в формах можно уже играться с обращениями к серверу и выполнением кода на его стороне при помощи директив компиляции, в любом случае, если Вы захотите выполнить какую-либо процедуру модуля объекта из модуля одной его форм, Вам необходимо будет сначала получить сам объект на стороне сервера (при помощи метода "РеквизитФормыВЗначение()", т.к. на стороне клиента он отсутствует), т.е. произвести вызов сервера. Тоже самое будет если Вам понадобится выполнить какой-то запрос, размещенный непосредственно в одной из процедур модуля формы - необходимо будет обратиться к серверной процедуре формы (т.к. работа с запросами на стороне клиента невозможна), т.е. тот же самый вызов сервера.
При получении объекта на стороне клиента (в случае обычного приложения) компилируется весь его модуль, так зачем нам лишний раз перегружать клиента компиляцией тех процедур, которые используются только в формах (это как один из доводов)?
p.s. Наше обсуждение уже явно выходит за рамки этой публикации, если хотите, то можно продолжить обсуждение этой темы через ЛС.
Раз на стороне клиента компилируется весь его модуль, то какая разница где лежит процедура - в форме ли, в модуле - все равно скомпилится. Вот для сервера - как раз таки значение есть: формы на сервере не компилятся, соотв чем меньше модуль - тем серверу легче. Однако, во-первых, никто не отменял директив "#Если Клиент", а во-вторых, все это дело компилится один раз, и затраты на компиляцию по сравнению со всей остальной работой пренебрежительно малы.
Вот чего в неуправляемых формах не хватает - это сделать выполнение на сервере (даже без передачи объекта), единственный вариант - общий модуль с вызовом сервера, что не всегда удобно.
p.s. все ассоциации с новым интерфейсом 8.3 случайны
По поводу не тиражируемого кода, на моей практике такого кода было не так уж и много.
Мысль 1) К сожалению (в этом месте я делаю вздох), существует 2 противоречивых интереса: у программиста "сделать это по-быстрому". У владельца - сделать красивый код. Под владельцем я имею ввиду того, кто будет дальше эксплуатировать, тиражировать, исправлять ошибки, и менять функционал. Т.е., читай по-русски, платить другим программистам. Я директор небольшой франчайзи и для меня изложенные тезисы не удовлетворение моего тонкого эстетического вкуса а реальные ресурсы. Ибо только я верю своему опыту: за 10 лет модифицируется 80% исходного кода.
Мысль 2) А посему писать иначе, кроме как по-правилам, просто не могу. Фраза от программиста "так эту красоту наводить долго" мне не понятна. За оговорку "комменты я потом нарисую" я сразу ложу на плаху. И вот почему - сам я ничего не делаю "потом". Я сразу пишу как надо. Пока пишу описание к процедуре, мысленно ревизирую ее параметры. А придумывание название переменной/реквизиту является поводом для ананлиза ее применяемости.
Мысль 3)О решении проблемы. Пока молодое поколение дозревает до понимания важности стиля, способ только один - тотальный контроль на приемке (второй вздох). Порой читаешь код и понимаешь: как исполнитель строки разбросал, так и мозги у него разбросаны. Жаль, рамки сообщения не позволяют привести примеры.
* О качестве кода самой 1С могу сказать одно: бывшие тетки-бухгалтерши писали. Маниакальное стремление достичь 10-кратной вложенности процедур, перенести функционал из объектов в глобальные модули (так мол "библиотечнее") напрочь лишает типовые версии звания "программный продукт".
* По моим наблюдениям из 10-15 программистов только один задумывается над оформлением и логической структуре кода. (Присутствующих прошу не дуться, я же не только об 1С-никах :) .
Когда есть 100500 задач, которые нужно решить здесь и сейчас, как-то трудно писать код для диссертации когда требуется все сделать быстро и дешево. Да, стремится делать все на 105% нужно, но для этого должна быть соответствующая мотивация.
Профи делают «по правильному» для будущего, тем самым возможно недополучая сейчас, они набрав нужный опыт уйдут на более оплачиваемую работу. «Шалапаи» делают все быстро на коленке, чтоб срубить деньжат здесь и сейчас, «а завтра посмотрим что будет». Обычные прогеры делают как получится – из-за лени, неправильной мотивации и т.п.
Бизнес покупает услугу по той цене, которою считает справедливой - за 100 рублей он купит соответствующее решение, за 500 другое (сферический идеал в вакууме). Грубо говоря, есть ли смысл писать код за 500, если платят 100 или другое дело, писать, когда платят 500, а он стоит 100?
p.s.: и будем нарушать.
Не совсем понял что имел ввиду pumbaE но - согласен: Часто код намеренно делается нечитаемым, чтобы сохранить свою незаменимость ;)
- когда 1Снику больше нечем гордится - тогда вытасивается в качестве предмета гордости простота и понятность кода.
Гордиться надо работающими процессами, сделанной автоматизацией и nyv? что все идет как по часам...
При этом программист сам для себя должен решить: нужно ли ему, чтобы код был читабельным. На ИС, к примеру, публиковались инструменты для получения нечитабельного кода.
Напрягает обратная ситуация.
Вместо написания серии выборок во временные таблицы и финальной выборки "особо одаренные" пишут дикий запрос с подзапросами, мало того, что трудно читаемый, так еще и тормознутый.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 191635
Создание 21.06.13 00:23
Обновление 21.06.13 00:23
Просмотры 41662
Загрузки 0
Рейтинг
202
Комментарии 50
Код открыт Не указано
Рубрики Рефакторинг и качество кода
Кому Разработчик
Тип файла Нет файла
Платформа Не имеет значения
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)