В процессе разработки на платформе «1С:Предприятие» перед программистами часто встает вопрос визуального структурирования исходного кода. Директивы препроцессора #Область и #КонецОбласти предоставляют удобную возможность сворачивать части текста в конфигураторе. Однако бесконтрольное применение этого инструмента может привести к нарушению стандартов разработки фирмы «1С» и усложнить поддержку программного продукта. Проанализируем, где использование областей оправдано, а где оно категорически запрещено стандартами кодирования.
Рассмотрим пример кода, в котором разработчик попытался выделить часть длинного математического выражения во внутреннюю область для повышения читаемости:
КакаяТоПеременная = ПервоеСлагаемое +
#Область Проверка
ОченьДлинноеВыражение
#КонецОбласти
+ ПоследнееСлагаемое;
Удовлетворяет ли этот код требованиям стандартов? Категорически нет. Данный пример демонстрирует грубое нарушение официального стандарта разработки.
Выясним причину этого запрета. Согласно стандарту #std439 («Использование директив компиляции и инструкций препроцессора»), пункт 3 четко регламентирует правила размещения препроцессорных инструкций:
«Не следует разрывать инструкциями препроцессора и областями отдельные грамматические конструкции, выражения, а также объявления и места вызова процедур и функций».
В официальной документации «1С» приводится аналогичный пример неправильного оформления кода:
Процедура ПримерНеправильногоКода()
а = 1
#Область ИмяОбласти
+ 2;
#КонецОбласти // Разрыв выражения препроцессором
КонецПроцедуры
Разрыв единого выражения инструкциями #Область и #КонецОбласти ломает логическую структуру модуля для парсеров. Инструменты статического анализа кода и компилятор платформы воспринимают такой код как потенциальный источник ошибок. Кроме того, это ухудшает «гладкое» чтение программы другими разработчиками.
При создании областей необходимо строго следовать стандарту именования переменных (#std454). Это накладывает следующие обязательные требования:
#Область Проверка данных является синтаксической ошибкой. Правильно писать слитно, применяя CamelCase: #Область ПроверкаДанных.Стандарт #std456 (пункт 8) формально разрешает разбивать тексты больших процедур и функций на отдельные сворачиваемые области. Однако в современной практике разработки и при прохождении код-ревью это считается признаком плохого архитектурного стиля.
Проанализируем ситуацию: если процедура или функция разрастается до таких размеров, что ее приходится делить на сворачиваемые области, это явный сигнал о нарушении принципа единственной ответственности (Single Responsibility Principle). Такая процедура делает слишком много вещей одновременно.
Правильным решением в данном случае будет проведение рефакторинга: разбиение огромного метода на цепочку небольших, изолированных вспомогательных функций. Это делает код тестируемым, самодокументируемым и повторно используемым.
Тем не менее, существуют редкие исключения, когда деление на области внутри одного метода оправдано:
Важно помнить критическое правило синтаксической вложенности: области не могут пересекать границы других синтаксических блоков. Нельзя начать область внутри конструкции Если, а закончить за её пределами или внутри блока Иначе.
Рассмотрим по шагам, как преобразовать перегруженную процедуру с внутренними областями в чистый и понятный код.
Пусть у нас есть исходный проблемный метод:
Процедура ЗаполнитьДокумент()
#Область ИнициализацияПараметров
Параметр1 = ПолучитьНастройку("Настройка1");
Параметр2 = ПолучитьНастройку("Настройка2");
#КонецОбласти
#Область РасчетТабличнойЧасти
Для Каждого СтрокаТЧ Из Товар Цикл
СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
КонецЦикла;
#КонецОбласти
КонецПроцедуры
Выделим логические блоки в отдельные вспомогательные процедуры и функции. Это позволит нам полностью избавиться от внутренних областей внутри метода:
Процедура ЗаполнитьДокумент()
ПараметрыЗаполнения = ПолучитьПараметрыЗаполнения();
РассчитатьТабличнуюЧастьТовары(ПараметрыЗаполнения);
КонецПроцедуры
Функция ПолучитьПараметрыЗаполнения()
Параметры = Новый Структура;
Параметры.Вставить("Параметр1", ПолучитьНастройку("Настройка1"));
Параметры.Вставить("Параметр2", ПолучитьНастройку("Настройка2"));
Возврат Параметры;
КонецФункции
Процедура РассчитатьТабличнуюЧастьТовары(ПараметрыЗаполнения)
Для Каждого СтрокаТЧ Из Товар Цикл
СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
КонецЦикла;
КонецПроцедуры
В результате рефакторинга мы получили чистую главную процедуру ЗаполнитьДокумент, которая легко читается с первого взгляда. Логика инициализации параметров и расчета вынесена в отдельные небольшие методы, которые при необходимости можно покрыть юнит-тестами.
При ручной проверке модулей легко упустить нарушения стандартов препроцессора. Рекомендуется использовать автоматизированные инструменты проверки качества кода:
ParseError.Соблюдение правил использования областей гарантирует высокую читаемость кода вашей конфигурации, минимизирует количество ошибок при слиянии веток и значительно упрощает процесс поддержки системы другими разработчиками.