Аккуратный код на встроенном языке 1С: отступы, переносы, области и запросы
Содержание
Чтобы отформатировать код в 1С 8.3, выделите фрагмент модуля в конфигураторе и нажмите Alt+Shift+F: платформа заново расставит отступы по вложенности конструкций. Та же команда есть в меню Текст → Блок → Форматировать. Пробелы вокруг операторов, переносы длинных строк и порядок процедур автоформат не трогает — это делается по стандартам вручную или внешними инструментами.
Типичная ситуация: вы открыли доработку подрядчика, а там процедура на 300 строк, где КонецЕсли стоит на одном уровне с Если через раз. Ошибки в такой каше не видно. Ниже — как привести код в порядок встроенными средствами, как настроить редактор и какие правила оформления приняты в типовых конфигурациях.
Автоформат в конфигураторе: что умеет и чего не умеет
Встроенный форматировщик работает на уровне отступов. Он понимает блоки Если … КонецЕсли, Для … КонецЦикла, Пока … КонецЦикла, Попытка … КонецПопытки, Процедура … КонецПроцедуры и сдвигает строки внутри них на один уровень.
Как отформатировать модуль целиком
- Откройте модуль в конфигураторе.
- Нажмите
Ctrl+A, чтобы выделить весь текст. - Нажмите
Alt+Shift+F. - Проверьте синтаксис:
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
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура";
Запрос.УстановитьПараметр("Дата", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Склад", Склад);
Правила, которые видны в примере:
- Ключевые слова языка запросов — заглавными:
ВЫБРАТЬ,ИЗ,ГДЕ,КАК. - Каждое поле — с новой строки, с отступом табуляцией после
|. - У каждой таблицы и поля — псевдоним через
КАК. - Параметры виртуальной таблицы (
&Дата, отбор по складу) — в скобках сразу после имени таблицы, а не вГДЕ. Это не только стиль: так отбор накладывается до расчёта остатков.
Имя регистра ТоварыНаСкладах в примере условное. В вашей конфигурации посмотрите точное имя в дереве метаданных.
Пакетные запросы
Запросы пакета разделяют строкой ; и строкой из комментариев-разделителей. Конструктор сам вставляет такой разделитель:
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
С разделителем пакет из 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. - 📐 Выравнивание пробелами по знаку
=в соседних строках. После переименования переменной выравнивание ломается, а дифф в хранилище засоряется.
Если вы дорабатываете типовую конфигурацию, правки удобнее держать в расширении. Там легче соблюдать собственный стиль, не трогая форматирование типового кода, — а это заметно упрощает последующие обновления.