Чистый код в 1С: форматирование, стандарты и инструменты

· 9 мин

Содержание

Чтобы выровнять отступы в модуле, выделите нужный фрагмент и выполните Текст → Блок → Форматировать. Команда расставит табуляцию по уровням вложенности Если, Цикл, Попытка и процедур — ровно то, что чаще всего и называют «отформатировать код».

Одно уточнение сразу. В Конфигураторе нет кнопки, которая переписывает код «под один стиль», как Prettier в вебе или автоформат в современных IDE. Встроенное форматирование делает одну вещь — приводит в порядок отступы. Переносы длинных строк, пробелы вокруг операторов, именование переменных остаются на вас. Поэтому «красивый код в 1С» складывается из трёх частей: отступы Конфигуратора, настройки редактора и внешние инструменты вроде 1C:EDT и BSL Language Server. Разберём всё по порядку — от быстрой команды до проверки стиля в CI.

Форматируем блок кода прямо в Конфигураторе

Основной рабочий сценарий — выделить код и выровнять отступы.

  1. Откройте модуль в редакторе (модуль объекта, формы, общий модуль).
  2. Выделите фрагмент или весь текст (Ctrl+A).
  3. Выполните Текст → Блок → Форматировать.

Табуляция выстроится по вложенности: тело Если … КонецЕсли, Для … КонецЦикла, Попытка … Исключение … КонецПопытки и процедур сдвинется на нужное число отступов.

Рядом в том же подменю Текст → Блок есть ещё две полезные команды:

  • 📐 Увеличить / уменьшить отступ — Tab и Shift+Tab на выделенном блоке. Сдвигают выбранные строки целиком, не ломая вложенность.
  • 💬 Добавить / удалить комментарий — Ctrl + Num / закомментирует выделенные строки (поставит //), Ctrl + Shift + Num / раскомментирует. Удобно, когда надо временно отключить кусок логики.

Наглядно это выглядит так. Вставленный фрагмент с «уехавшими» отступами:

Для Каждого Строка Из ТаблицаТоваров Цикл
Если Строка.Количество > 0 Тогда
Сумма = Сумма + Строка.Количество * Строка.Цена;
КонецЕсли;
КонецЦикла;

После Текст → Блок → Форматировать:

Для Каждого Строка Из ТаблицаТоваров Цикл
	Если Строка.Количество > 0 Тогда
		Сумма = Сумма + Строка.Количество * Строка.Цена;
	КонецЕсли;
КонецЦикла;

Логика та же — изменились только отступы, зато структура цикла и условия видна с первого взгляда.

Автоотступ работает и при наборе: когда вы жмёте Enter внутри Если или Цикл, новая строка получает отступ автоматически. Команда Форматировать нужна в основном для чужого кода, вставленного из буфера или из внешней обработки, где отступы «уехали».

Если после форматирования блок выглядит странно — почти всегда причина в незакрытом операторе выше по тексту. Проверьте парность Если/КонецЕсли и Цикл/КонецЦикла: именно по ним редактор считает уровень вложенности.

Настройка отступов, табуляции и переносов

Поведение редактора настраивается один раз на всю работу: Сервис → Параметры → Тексты модулей. Здесь живут настройки, которые влияют на то, как выглядит и форматируется ваш код.

Что имеет смысл проверить:

  • Ширина табуляции — сколько пробелов «рисует» один Tab (обычно 4). На само хранение это не влияет, меняется только отображение.
  • Использовать табуляцию / заменять на пробелы — ключевая настройка командной работы. Стандарт 1С — отступ табуляцией, по одному табу на уровень. Если половина команды пишет пробелами, а половина табами, в хранилище будут бесконечные «различия» на пустом месте.
  • Автоотступ — автоматический отступ новой строки по образцу предыдущей.
  • Показывать пробелы — подсветка невидимых символов. Помогает увидеть смешанные табы и пробелы.

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

Переносы длинных строк Конфигуратор сам не делает — это ручная работа. Общее правило: если выражение не помещается на экран, переносите по операторам, а продолжение сдвигайте на отступ вправо, чтобы было видно — это одна строка кода:

РезультатЗапроса = Запрос.Выполнить()
	.Выбрать()
	.Следующий();

ТекстСообщения = СтрШаблон(
	"Документ %1 от %2 проведён на сумму %3",
	Документ.Номер,
	Формат(Документ.Дата, "ДЛФ=D"),
	Формат(Документ.СуммаДокумента, "ЧГ=0"));

Правила именования переменных и объектов

Отступы — это половина читаемости. Вторая половина — имена. Стандарты разработки 1С здесь довольно строгие, и их стоит держать в голове, потому что ни одна команда «Форматировать» их не исправит.

Базовые правила:

  • 🔤 Имена — на русском, в «ВерблюжьемРегистре». Каждое слово с заглавной буквы, без разделителей: СуммаДокумента, СформироватьПечатнуюФорму, ТаблицаНоменклатуры. Это стиль платформенных объектов, и собственный код должен ему соответствовать.
  • 📛 Имя отражает смысл, а не тип. Контрагент лучше, чем Спр1; ВыбранныеСтроки лучше, чем мМассив. Исключение — короткие счётчики циклов (Индекс, Сч).
  • 🧩 Процедуры и функции — тоже в «ВерблюжьемРегистре», глаголом: ЗаполнитьТаблицу(), ПолучитьКурсВалюты(). Функция возвращает значение — имя отвечает на вопрос «что получаем».
  • 📝 Экспортные процедуры снабжают комментарием-описанием над объявлением: что делает, какие параметры принимает, что возвращает. Это основа читаемости общих модулей.

Ключевые слова (Если, Процедура, Возврат) можно писать по-русски или по-английски — платформа понимает оба варианта. Но в одном проекте выберите что-то одно: смешение Если и If в соседних строках выглядит неряшливо.

Единый регистр ключевых слов и встроенных функций тоже помогает. В типовых конфигурациях 1С принят русский язык и написание функций «как в синтакс-помощнике»: НСтр, СтрНайти, ТекущаяДата.

Отдельно про структуру модуля. Процедуры и функции группируют по областям — директивами #Область ИмяОбласти и #КонецОбласти. В редакторе область сворачивается, и большой модуль читается как оглавление. В типовых конфигурациях приняты осмысленные имена областей — например, программный интерфейс, обработчики событий, служебные процедуры и функции. Разложить код по областям так же важно для читаемости, как ровные отступы.

Шаблоны текста: ввод кода без лишних нажатий

Чтобы код был единообразным, его удобно не печатать заново, а вставлять из шаблонов. В Конфигураторе это механизм шаблонов текста: Сервис → Шаблоны текста.

Вы задаёте короткое сокращение и полный текст, который оно разворачивает. Классический пример — заготовка процедуры:

// <Описание процедуры>
//
// Параметры:
//  <Параметр> - <Тип> - <описание>
//
Процедура <ИмяПроцедуры>()
	|
КонецПроцедуры

Набираете сокращение, нажимаете клавишу разворота (по умолчанию Ctrl+Q или через автоподстановку) — и получаете готовый каркас с правильными отступами и комментарием. Это экономит время и держит стиль в рамках: все процедуры начинаются одинаково.

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

Внешние инструменты: 1C:EDT, BSL Language Server, Снегопат

Когда встроенного форматирования мало, подключают внешние средства. Они умеют то, чего Конфигуратор не делает: переформатировать код целиком, проверять стиль по правилам, подсвечивать проблемы на лету.

1C:EDT (среда на базе Eclipse). Полноценная среда разработки с настоящим автоформатированием. Выделяете код или весь файл, жмёте Ctrl+Shift+F — и EDT переоформляет его по заданным правилам: отступы, пробелы вокруг операторов, переносы. Правила настраиваются в параметрах среды (раздел стиля кода для языка 1С). Если проект ведётся в EDT, это основной способ держать код в форме.

BSL Language Server. Открытый языковой сервер для встроенного языка 1С. Чаще всего его ставят как расширение Language 1C (BSL) в редактор VS Code. Он даёт:

  • форматирование документа (Shift+Alt+F в VS Code);
  • десятки диагностик — от «метод не используется» до нарушений стиля и потенциальных ошибок;
  • подсказки и переход к объявлению.

Для работы с BSL Language Server код выгружают в файлы .bsl — через 1C:EDT или через выгрузку конфигурации в файлы из Конфигуратора (Конфигурация → Выгрузить конфигурацию в файлы).

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

Коротко, что выбрать под задачу:

ИнструментЧто умеетКогда брать
КонфигураторВыравнивание отступов, комментированиеБыстрая правка, работа без дополнительного ПО
1C:EDTПолный автоформат, настройка стиля, GitОсновная среда разработки, командный проект
BSL Language Server (VS Code)Формат документа + диагностики стиляПроверка кода, лёгкий редактор, подготовка к CI
СнегопатСкрипты поверх КонфигуратораНужны расширения штатного редактора

Эти средства не взаимоисключающие: отступы можно держать в Конфигураторе, а раз в спринт прогонять код диагностиками BSL Language Server и чинить замечания.

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

Проверка стиля кода в CI/CD

Ручная дисциплина работает до тех пор, пока проект маленький. Дальше стиль проверяют автоматически — на каждый коммит или сборку.

Как это обычно устроено:

  1. Выгрузка в Git. Конфигурация или проект EDT хранится в Git. Из Конфигуратора с хранилищем код синхронизируют инструментами выгрузки (например, gitsync), EDT работает с Git напрямую.
  2. Анализ BSL Language Server. В пайплайне запускается консольный анализ: сервер проходит по файлам .bsl, собирает диагностики и формирует отчёт. Нарушения стиля и ошибки видны прямо в сборке.
  3. Качество через SonarQube. Отчёт BSL Language Server передают в SonarQube (через соответствующий плагин для языка 1С). Там настраивается «ворота качества»: если новых замечаний больше порога — сборка падает.
  4. Pre-commit хуки. Самый ранний рубеж — проверка до коммита. Хук прогоняет анализ по изменённым файлам и не даёт закоммитить код с грубыми нарушениями.

Такой конвейер не форматирует код за разработчика — он не пускает в репозиторий то, что оформлено плохо. Форматирование остаётся за автором (EDT или редактор с BSL), а CI следит, чтобы правило соблюдалось.

Чек-лист читаемого модуля 1С
Выполнено: 0 / 7

Частые ошибки при форматировании

Несколько ситуаций, которые регулярно портят код и ломают сравнение версий.

  • ❌ Смешение табов и пробелов. Самая частая беда командной разработки. Внешне код ровный, но в хранилище — постоянные ложные различия. Лечится единой настройкой Сервис → Параметры → Тексты модулей у всех и включённым показом пробелов.
  • ❌ Массовая переформатировка «заодно». Правите одну процедуру, а автоформат трогает весь модуль. В коммит попадают сотни строк, и ревью становится бессмысленным. Форматируйте только то, что меняете, либо выносите глобальный переформат в отдельный коммит с понятным комментарием.
  • ❌ Отступ сломался после вставки. Код из буфера или из внешней обработки приходит с чужими отступами. Не оставляйте как есть — выделите и выполните Форматировать.
  • ❌ Транслитерация и латиница в именах. Summa, tekDoc, arr выбиваются из стиля платформы. Держитесь русских имён в «ВерблюжьемРегистре».
  • ❌ Форматирование вместо рефакторинга. Ровные отступы не спасут процедуру на 500 строк. Если код нечитаем структурно — его надо разбивать на процедуры, а не только выравнивать.

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

Есть ли горячая клавиша, чтобы отформатировать весь модуль сразу?
В Конфигураторе — нет единой клавиши. Выделите весь текст Ctrl+A и выполните Текст → Блок → Форматировать. В 1C:EDT и в VS Code с расширением BSL автоформат документа вызывается Ctrl+Shift+F и Shift+Alt+F соответственно.
Форматирование меняет логику кода?
Нет. Встроенная команда трогает только отступы. Внешние форматтеры меняют ещё пробелы и переносы, но тоже не затрагивают исполнение. Логику правит только рефакторинг, не форматирование.
Табуляция или пробелы — что правильно в 1С?
Стандарт разработки 1С — отступ табуляцией, по одному табу на уровень вложенности. Главное, чтобы вся команда использовала один вариант: смешение приводит к ложным различиям в хранилище.
Почему после форматирования отступы «съехали»?
Почти всегда причина — незакрытый оператор выше: пропущенный КонецЕсли, КонецЦикла или КонецПроцедуры. Редактор считает вложенность по парным ключевым словам. Найдите непарный оператор — отступы встанут на место.
Можно ли проверять стиль кода автоматически?
Да. BSL Language Server даёт диагностики стиля в редакторе и в консольном режиме для CI. В связке с SonarQube настраиваются «ворота качества», которые не пропускают плохо оформленный код в сборку.