Аккуратный код на встроенном языке 1С: отступы, переносы, области и запросы

· 9 мин

Содержание

Чтобы отформатировать код в 1С 8.3, выделите фрагмент модуля в конфигураторе и нажмите Alt+Shift+F: платформа заново расставит отступы по вложенности конструкций. Та же команда есть в меню Текст → Блок → Форматировать. Пробелы вокруг операторов, переносы длинных строк и порядок процедур автоформат не трогает — это делается по стандартам вручную или внешними инструментами.

Типичная ситуация: вы открыли доработку подрядчика, а там процедура на 300 строк, где КонецЕсли стоит на одном уровне с Если через раз. Ошибки в такой каше не видно. Ниже — как привести код в порядок встроенными средствами, как настроить редактор и какие правила оформления приняты в типовых конфигурациях.

Автоформат в конфигураторе: что умеет и чего не умеет

Встроенный форматировщик работает на уровне отступов. Он понимает блоки Если … КонецЕсли, Для … КонецЦикла, Пока … КонецЦикла, Попытка … КонецПопытки, Процедура … КонецПроцедуры и сдвигает строки внутри них на один уровень.

Как отформатировать модуль целиком

  1. Откройте модуль в конфигураторе.
  2. Нажмите Ctrl+A, чтобы выделить весь текст.
  3. Нажмите Alt+Shift+F.
  4. Проверьте синтаксис: Ctrl+F7.

Если выделения нет, команда применяется только к текущей строке. Поэтому для старого модуля сначала выделяйте всё.

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

Другие команды блока

ДействиеКлавиши
Сдвинуть выделенное вправоTab
Сдвинуть выделенное влевоShift+Tab
Закомментировать строкиCtrl+/ на цифровой клавиатуре
Раскомментировать строкиCtrl+Shift+/ на цифровой клавиатуре
Отформатировать отступыAlt+Shift+F
Свернуть / развернуть группуCtrl+- / Ctrl++ на цифровой клавиатуре
Проверить синтаксис модуляCtrl+F7

Все эти команды дублируются в меню Текст → Блок. На ноутбуке без цифрового блока пользуйтесь меню или назначьте свои сочетания.

Чего автоформат не сделает

  • ❌ Не расставит пробелы вокруг =, +, <> и после запятых.
  • ❌ Не перенесёт строку длиннее экрана.
  • ❌ Не выровняет текст запроса внутри строкового литерала.
  • ❌ Не сгруппирует процедуры по областям.
  • ❌ Не исправит регистр ключевых слов (если останется если).

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

Настройка редактора модулей под форматирование кода

Параметры редактора задаются в окне Сервис → Параметры. Нужная вкладка — «Модули», внутри неё есть раздел про редактирование текста.

Что стоит проверить:

  • 📏 Ширина табуляции и отступ. Типовой вариант — 4 символа. Если коллеги используют другое значение, код с табуляцией будет выглядеть у вас иначе, чем у них.
  • ↩️ Автоотступ. При нажатии Enter новая строка начинается с того же отступа, что предыдущая. Включайте всегда.
  • 🔠 Автозамена ключевых слов. Платформа может подставлять правильный регистр при наборе. Удобно, если вы печатаете быстро и не следите за Shift.
  • 🎨 Цвета и шрифт. Моноширинный шрифт обязателен, иначе выравнивание «плывёт». По умолчанию стоит Courier New; многие ставят Consolas.

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

Табуляция или пробелы

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

Пробелы используются только внутри строки: вокруг операторов и после запятых.

Стандарты оформления кода в типовых конфигурациях 1С

Фирма 1С публикует «Стандарты и методики разработки прикладных решений». По ним написаны БП 3.0, ЗУП 3.1, УТ 11 и Библиотека стандартных подсистем. Если вы дорабатываете типовую, имеет смысл писать так же: код читается однородно, а проверки качества не ругаются.

Основные правила по тексту модуля

ПравилоКак правильно
Длина строкине более 120 символов
Отступодин символ табуляции на уровень
Ключевые словас заглавной: Если, Для Каждого, Возврат
Операторыпробел с обеих сторон: Сумма = Цена * Количество;
Запятыепробел после, но не перед: Метод(А, Б, В)
Пустые строкиодна между процедурами, внутри процедуры — для разделения смысловых блоков
Одна инструкцияодна инструкция на строку

Перенос длинных выражений

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

Если ЗначениеЗаполнено(Документ.Контрагент)
	И Документ.Проведен
	И Документ.СуммаДокумента > 0 Тогда
	
	ЗаписатьДвижения(Документ);
	
КонецЕсли;

Длинный вызов с множеством параметров — по одному параметру на строку с дополнительным отступом:

Результат = РассчитатьВыручкуЗаПериод(
	Организация,
	НачалоПериода,
	КонецПериода,
	ВключатьВозвраты);

Закрывающая скобка остаётся на строке с последним параметром. Так принято в типовом коде, и вызов не растягивается лишней строкой.

Области модуля

Код группируется директивами #Область … #КонецОбласти. Для общего модуля и модуля объекта принят такой порядок:

#Область ПрограммныйИнтерфейс
// экспортные процедуры, которые вызывают другие объекты
#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс
// экспортные процедуры для «своих» подсистем
#КонецОбласти

#Область СлужебныеПроцедурыИФункции
// всё неэкспортное
#КонецОбласти

В модуле формы — свои области: ОбработчикиСобытийФормы, ОбработчикиСобытийЭлементовШапкиФормы, ОбработчикиКомандФормы, СлужебныеПроцедурыИФункции. Области сворачиваются в редакторе, и модуль на 2000 строк становится обозримым.

Комментарий к экспортной процедуре

Перед каждой экспортной процедурой пишут описание. Синтакс-помощник и контекстная подсказка показывают его при вызове:

// Рассчитывает сумму скидки по строке документа.
//
// Параметры:
//  Сумма   - Число - сумма строки без скидки.
//  Процент - Число - процент скидки, от 0 до 100.
//
// Возвращаемое значение:
//  Число - сумма скидки, округлённая до копеек.
//
Функция СуммаСкидки(Сумма, Процент) Экспорт
	
	Возврат Окр(Сумма * Процент / 100, 2);
	
КонецФункции

Проверка: при Сумма = 1250 и Процент = 7 функция вернёт 87.5.

Форматирование текста запросов

Запрос — это строковый литерал, и автоформат конфигуратора его не выравнивает. Есть два пути.

Через конструктор запроса

Установите курсор внутрь текста запроса, откройте контекстное меню правой кнопкой и выберите «Конструктор запроса…». После нажатия «ОК» конструктор перепишет текст в собственном формате: ключевые слова заглавными, каждое поле с новой строки, вертикальная черта | в начале каждой строки литерала.

Минусы метода:

  • 🧹 конструктор удаляет комментарии внутри текста запроса;
  • 🔀 может переставить поля и условия по-своему;
  • 🧩 не всегда открывает запросы, собранные из кусков через СтрЗаменить или конкатенацию.

Вручную по правилам

Если запрос собран динамически или в нём есть ценные комментарии, оформляйте вручную:

Запрос = Новый Запрос;
Запрос.Текст =
	"ВЫБРАТЬ
	|	Остатки.Номенклатура КАК Номенклатура,
	|	Остатки.КоличествоОстаток КАК Количество
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки
	|ГДЕ
	|	Остатки.КоличествоОстаток > 0
	|
	|УПОРЯДОЧИТЬ ПО
	|	Номенклатура";

Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Склад", Склад);

Правила, которые видны в примере:

  1. Ключевые слова языка запросов — заглавными: ВЫБРАТЬ, ИЗ, ГДЕ, КАК.
  2. Каждое поле — с новой строки, с отступом табуляцией после |.
  3. У каждой таблицы и поля — псевдоним через КАК.
  4. Параметры виртуальной таблицы (&Дата, отбор по складу) — в скобках сразу после имени таблицы, а не в ГДЕ. Это не только стиль: так отбор накладывается до расчёта остатков.

Имя регистра ТоварыНаСкладах в примере условное. В вашей конфигурации посмотрите точное имя в дереве метаданных.

Пакетные запросы

Запросы пакета разделяют строкой ; и строкой из комментариев-разделителей. Конструктор сам вставляет такой разделитель:

	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ

С разделителем пакет из 5–6 запросов читается так же легко, как один.

Шаблоны текста и внешние инструменты

Шаблоны конфигуратора

Шаблоны вставляют готовые конструкции с правильными отступами. Список открывается через Сервис → Шаблоны текста. Наберите в модуле имя шаблона, например Если, и нажмите Ctrl+Q — платформа развернёт конструкцию целиком и поставит курсор в нужное место.

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

1С:Enterprise Development Tools

В EDT есть полноценный форматировщик на базе Eclipse. Команда форматирования — Ctrl+Shift+F. Он работает и с отступами, и с пробелами вокруг операторов. Правила задаются в настройках проекта и попадают в Git вместе с кодом — у всей команды одинаковое форматирование без договорённостей на словах.

BSL Language Server и VS Code

BSL Language Server — открытый проект для встроенного языка 1С. Он подключается к VS Code через расширение для языка BSL и умеет:

  • 🔎 подсвечивать нарушения стандартов прямо при наборе;
  • 🧽 форматировать документ целиком или выделенный фрагмент;
  • 📊 выдавать отчёт по качеству кода для SonarQube.

Модули из конфигуратора для этого выгружают в файлы: Конфигурация → Выгрузить конфигурацию в файлы. После правки их загружают обратно через Конфигурация → Загрузить конфигурацию из файлов.

Загрузка из файлов заменяет конфигурацию в базе. Делайте её на копии или в базе разработчика, а перед загрузкой в рабочую базу сделайте выгрузку .dt.

Сравнение способов

ИнструментЧто форматируетКогда выбирать
Конфигуратор, Alt+Shift+Fтолько отступыбыстрые правки в любой базе
Конструктор запросатекст запросакороткие статичные запросы без комментариев
Шаблоны текстановые конструкциичтобы сразу писать в едином стиле
EDTотступы, пробелы, переносыкомандная разработка с Git
BSL Language Serverформатирование и проверка стандартовразработка в VS Code, контроль качества

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

Здесь не про синтаксические ошибки — их ловит Ctrl+F7. Речь о том, что компилируется, но мешает.

  • 🌀 Отступы пробелами вперемешку с табуляцией. После автоформата строки встают на разные уровни. Лечится выделением всего модуля и Alt+Shift+F.
  • 🧱 Процедура на сотни строк без пустых строк. Разбейте на логические блоки пустой строкой, а повторяющиеся куски вынесите в отдельные процедуры.
  • 💬 Закомментированный старый код. Через год никто не помнит, зачем он. История есть в хранилище — удаляйте.
  • 🏷️ Комментарий «Изменено Ивановым» без даты и задачи. Если такие метки приняты в команде, пишите номер задачи и дату: // +++ Задача 1452, 15.03.
  • 🔤 Однобуквенные имена. Для А = 1 По Т.Количество() читается хуже, чем Для Индекс = 0 По Товары.Количество() - 1.
  • 📐 Выравнивание пробелами по знаку = в соседних строках. После переименования переменной выравнивание ломается, а дифф в хранилище засоряется.

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

Проверка модуля перед помещением в хранилище
Выполнено: 0 / 8

Частые вопросы про форматирование кода в 1С

Можно ли отформатировать сразу все модули конфигурации?
В конфигураторе — нет, команда работает с открытым модулем. Массово форматируют через выгрузку конфигурации в файлы и EDT или BSL Language Server.
Почему после форматирования отступы у коллеги выглядят иначе?
У вас разная ширина табуляции в параметрах редактора. Сам код одинаковый: один символ табуляции на уровень.
Влияет ли форматирование на скорость работы кода?
Нет. Пробелы, отступы и комментарии не влияют на выполнение модуля.
Нужно ли форматировать код в типовых модулях при доработке?
Нет. Трогайте только свой код. Переформатированный типовой модуль при обновлении покажет различия в каждой строке, и сравнение-объединение станет тяжёлым.
Почему конструктор запроса удалил мои комментарии?
Конструктор разбирает текст запроса и собирает его заново. Комментарии внутри литерала при этом теряются. Если они нужны, правьте такой запрос вручную.