К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как упорядочить код в 1С: практическое руководство для разработчика

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

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

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

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

Разберитесь, какой код где должен лежать

Первый источник хаоса — код, размещённый не в том модуле. В 1С место размещения определяет область видимости и время жизни кода, поэтому перенос процедуры «куда попало» меняет поведение системы. Базовое правило: серверная бизнес-логика живёт в модулях объектов и общих модулях, клиентская — в модулях форм и общих клиентских модулях.

Общие модули стоит группировать по прикладным областям, а не по типу операций. Правильно: РаботаСНоменклатурой, ОбменСБанком. Неправильно: ОбщегоНазначения, Утилиты, Вспомогательные — такие модули неизбежно превращаются в свалку, куда попадает всё подряд.

Обработчики событий формы и объекта должны оставаться тонкими: получить параметры, вызвать прикладную процедуру, обработать результат. Если в обработчике ПриЗаписи больше десятка строк логики — это признак того, что логику нужно вынести в отдельную процедуру модуля объекта или общего модуля.

Настройте общие модули по правилам

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

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

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

Приведите имена к единому стандарту

Имена процедур, функций и переменных — это документация, которую читают чаще всего. Правила просты: имя функции отвечает на вопрос «что возвращает?» (ОстатокТовараНаСкладе), имя процедуры — «что делает?» (СформироватьОтчетПоПродажам). Сокращения допустимы только общеупотребимые.

Переменные именуйте по содержимому, а не по типу: ТаблицаЗаказов вместо ТЗ1, ТекущийПользователь вместо ТекПольз. Однобуквенные и транслитерированные имена (Spisok, Kol) — верный признак кода, который через полгода не поймёт и сам автор.

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

Разбейте длинные процедуры

Процедура на 200–300 строк, в которой перемешаны проверки, запросы, циклы и формирование результата, — главный кандидат на упорядочивание. Признаки того, что метод пора делить: трудно придумать ему короткое имя, внутри есть блоки, отделённые пустыми строками и комментариями-заголовками, одни и те же фрагменты повторяются с небольшими вариациями.

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

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

Не стремитесь переписать всё за один раз. Разумная тактика — «правило бойскаута»: каждый раз, когда вы дорабатываете процедуру по задаче, заодно приводите в порядок именно её. За несколько месяцев такой работы кодовая база заметно выравнивается без отдельного рискованного проекта «большого рефакторинга».

Устраните дублирование и мёртвый код

Скопированные фрагменты — скрытый источник ошибок: исправление вносится в одну копию и забывается в трёх других. Найдите дубли поиском характерных строк по всей конфигурации и замените копии вызовом одной процедуры общего модуля. Если копии слегка отличаются — выносите различия в параметры.

Мёртвый код — процедуры, которые никто не вызывает, закомментированные блоки «на всякий случай», неиспользуемые переменные. Закомментированный код удаляйте без сожаления: история изменений хранится в хранилище конфигурации, и восстановить фрагмент при необходимости можно оттуда.

Типичные ошибки при наведении порядка
01
Рефакторинг без резервной копии и хранилища — при ошибке откатить изменения нечем
02
Переименование и перенос процедур без поиска всех вызовов — конфигурация перестаёт компилироваться или падает в редких сценариях
03
Смешение рефакторинга с изменением логики в одном заходе — при ошибке невозможно понять, что именно сломалось
04
Создание модулей «ОбщегоНазначения» и «Утилиты» — через полгода это снова свалка
05
Удаление «непонятного» кода в типовой конфигурации — он может вызываться динамически через Выполнить или из подписок на события

Используйте области и комментарии осмысленно

Директивы #Область помогают ориентироваться в больших модулях. Типовая структура общего модуля: «ПрограммныйИнтерфейс» (экспортные методы), «СлужебныеПроцедурыИФункции» (внутренняя реализация). В модулях форм добавляются области обработчиков событий. Такое деление позволяет свернуть служебную часть и видеть «лицо» модуля.

Комментарии должны объяснять «почему», а не «что». Комментарий // увеличиваем счётчик на 1 бесполезен, а // пропускаем первую строку — в файле заголовок колонок экономит время следующему разработчику. У каждой экспортной процедуры общего модуля полезно держать короткое описание назначения и параметров.

bsl
#Область ПрограммныйИнтерфейс

// Возвращает остаток товара на складе на дату.
//
// Параметры:
//   Номенклатура - СправочникСсылка.Номенклатура
//   Склад - СправочникСсылка.Склады
//   НаДату - Дата
//
// Возвращаемое значение:
//   Число - количество в базовой единице измерения.
//
Функция ОстатокТовараНаСкладе(Номенклатура, Склад, НаДату) Экспорт
	// ...
КонецФункции

#КонецОбласти

Проверяйте результат и закрепляйте порядок

Любое упорядочивание завершается проверкой. Минимум — синтаксический контроль модулей в конфигураторе (меню «Конфигурация — Проверка конфигурации») с проверкой всех режимов, включая тонкий и веб-клиент, если они используются. Затем — прогон сценариев, затронутых изменениями: проведение документов, формирование отчётов, обмены.

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

Контрольные точки

Как проверить, что порядок наведён

Структура общих модулей
Норма

У каждого модуля понятная прикладная область и корректные флаги

Тревожный признак

Модули «ОбщегоНазначения», «Утилиты» с сотнями разнородных функций

Длина процедур
Норма

Большинство методов умещается на 1–2 экрана и имеет одно назначение

Тревожный признак

Процедуры на 200+ строк с блоками-комментариями внутри

Дублирование
Норма

Повторяющаяся логика вынесена в общие процедуры

Тревожный признак

Одинаковые фрагменты встречаются в нескольких объектах

Компиляция и сценарии
Норма

Проверка конфигурации без ошибок, ключевые операции работают как раньше

Тревожный признак

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

Частые вопросы

С чего начать упорядочивание старой конфигурации, где беспорядок повсюду?

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

Можно ли переименовывать процедуры в типовой конфигурации?

Технически можно, но делать этого не стоит: при обновлении типовой конфигурации сопоставление объектов и сравнение модулей опирается на имена, и массовые переименования превратят каждое обновление в трудоёмкую ручную работу. Свои доработки лучше выносить в отдельные общие модули с префиксом, например Преф_РаботаСЗаказами.

Как найти процедуры, которые больше никто не вызывает?

Используйте глобальный поиск по конфигурации (Ctrl+Shift+F) по имени процедуры. Учитывайте, что поиск не находит вызовы через Выполнить, ОбщегоНазначения.ВызватьФункциюКонфигурации и подписки на события — перед удалением проверьте эти механизмы. Надёжнее пометить сомнительную процедуру комментарием «кандидат на удаление» и понаблюдать за работой системы некоторое время.

Чем отличается рефакторинг от исправления ошибок?

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

Сколько процедур должно быть в одном общем модуле?

Жёсткого ограничения нет, ориентир — единство прикладной области. Если модуль посвящён одной задаче (например, обмену с конкретным сервисом), даже несколько десятков процедур в нём уместны. Тревожный признак — когда в модуле соседствуют функции про склад, кадры и отправку почты: это повод разделить его по областям.

Нужно ли комментировать каждую строку кода?

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

Итог

Что важно запомнить

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