Допустимо ли использовать #Область внутри выражений и процедур в 1С: разбор стандартов

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разрыв выражений областями: разбор практического примера

Рассмотрим пример кода, в котором разработчик попытался выделить часть длинного математического выражения во внутреннюю область для повышения читаемости:


КакаяТоПеременная = ПервоеСлагаемое +
#Область Проверка
    ОченьДлинноеВыражение
#КонецОбласти
    + ПоследнееСлагаемое;

Удовлетворяет ли этот код требованиям стандартов? Категорически нет. Данный пример демонстрирует грубое нарушение официального стандарта разработки.

Выясним причину этого запрета. Согласно стандарту #std439 («Использование директив компиляции и инструкций препроцессора»), пункт 3 четко регламентирует правила размещения препроцессорных инструкций:

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

В официальной документации «1С» приводится аналогичный пример неправильного оформления кода:


Процедура ПримерНеправильногоКода()
    а = 1
#Область ИмяОбласти
    + 2;
#КонецОбласти // Разрыв выражения препроцессором
КонецПроцедуры

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

Правила образования имен областей (Стандарт #std454)

При создании областей необходимо строго следовать стандарту именования переменных (#std454). Это накладывает следующие обязательные требования:

  1. Запрет на пробелы. Имя области обязано быть единым идентификатором встроенного языка. Конструкция вида #Область Проверка данных является синтаксической ошибкой. Правильно писать слитно, применяя CamelCase: #Область ПроверкаДанных.
  2. Смысловая нагрузка. Название области должно кратко и понятно объяснять, какой код находится внутри, без использования сокращений (кроме общепринятых).
  3. Запрет на букву «Ё». Согласно общему стандарту оформления текстов модулей (#std456), в именах областей, как и в именах переменных или процедур, не допускается использование буквы «ё».

Области внутри процедур: признак хорошего тона или «код-смелл» (Code Smell)?

Стандарт #std456 (пункт 8) формально разрешает разбивать тексты больших процедур и функций на отдельные сворачиваемые области. Однако в современной практике разработки и при прохождении код-ревью это считается признаком плохого архитектурного стиля.

Проанализируем ситуацию: если процедура или функция разрастается до таких размеров, что ее приходится делить на сворачиваемые области, это явный сигнал о нарушении принципа единственной ответственности (Single Responsibility Principle). Такая процедура делает слишком много вещей одновременно.

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

Тем не менее, существуют редкие исключения, когда деление на области внутри одного метода оправдано:

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

Рефакторинг кода: как исправить нежелательные области

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

Пусть у нас есть исходный проблемный метод:


Процедура ЗаполнитьДокумент()
    
#Область ИнициализацияПараметров
    Параметр1 = ПолучитьНастройку("Настройка1");
    Параметр2 = ПолучитьНастройку("Настройка2");
#КонецОбласти

#Область РасчетТабличнойЧасти
    Для Каждого СтрокаТЧ Из Товар Цикл
        СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
    КонецЦикла;
#КонецОбласти

КонецПроцедуры

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


Процедура ЗаполнитьДокумент()
    
    ПараметрыЗаполнения = ПолучитьПараметрыЗаполнения();
    РассчитатьТабличнуюЧастьТовары(ПараметрыЗаполнения);
    
КонецПроцедуры

Функция ПолучитьПараметрыЗаполнения()
    
    Параметры = Новый Структура;
    Параметры.Вставить("Параметр1", ПолучитьНастройку("Настройка1"));
    Параметры.Вставить("Параметр2", ПолучитьНастройку("Настройка2"));
    
    Возврат Параметры;
    
КонецФункции

Процедура РассчитатьТабличнуюЧастьТовары(ПараметрыЗаполнения)
    
    Для Каждого СтрокаТЧ Из Товар Цикл
        СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
    КонецЦикла;
    
КонецПроцедуры

В результате рефакторинга мы получили чистую главную процедуру ЗаполнитьДокумент, которая легко читается с первого взгляда. Логика инициализации параметров и расчета вынесена в отдельные небольшие методы, которые при необходимости можно покрыть юнит-тестами.

Инструменты автоматической проверки кода

При ручной проверке модулей легко упустить нарушения стандартов препроцессора. Рекомендуется использовать автоматизированные инструменты проверки качества кода:

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

← На главную