Стандарт фирмы 1С "Структура модуля" содержит в себе рекомендации о перечене и составе элементов разделов на которые предлагается разделить программный модуль. Само требование о разделении кода модуля на разделы призвано повысить читаемость кода и упростить внесение изменений в код разными авторами (разработчиками) как при коллективной разработке, так и при доработке прикладных решений на конкретных внедрениях. За туманными выражениями "повысить читаемость" и "упростить внесение изменений" теряется настоящая цель - снижение сложности системы.
В этой небольшой статье я попытаюсь продемонстрировать более удачное применение областей модуля. Как мне представляется, на самом деле, требуется не повысить читаемость кода, а структурировать его, улучшить его понимаемость, и облегчить внесение изменений.
На мой взгляд, даже названия разделов неудачны, например:
- "ПрограммныйИнтерфейс" - интересно, а какой еще как не "Программный" он может быть в данном случае,
- "СлужебныеПроцедурыИФункции" - слишком длинно, к тому же в эту область можно включить вообще любую процедуру и функцию. Критерии считать функциональную единицу "служебной" или "не служебной", как правило, размыты.
- "ОбработчикиСобытийТаблицыФормы" - уснешь, пока дочитаешь до конца, проще и компактнее просто "События".
Предложенный подход не использует в полной мере возможности областей кода. Ведь можно создавать вложенные области. Более того, вложенные области могут иметь одинаковые имена, т.е. например мы можем создать область
#Область Таблицы
#Область Запасы
#Область Команды
#КонецОбласти
#КонецОбласти
#Область Услуги
#Область Команды
#КонецОбласти
#КонецОбласти
#КонецОбласти
Вот какие разделы рекомендуется использовать.
Для модуля формы:
#Область Форма
#КонецОбласти
#Область Элементы
#КонецОбласти
#Область Таблицы
#Область <ИмяТаблицы>
#Область Команды
#КонецОбласти
#КонецОбласти
#КонецОбласти
#Область Команды
#КонецОбласти
#Область Оповещения
#КонецОбласти
#Область Подключаемые
#КонецОбласти
#Область Методы
#Область НаКлиенте
#КонецОбласти
#Область НаСервере
#КонецОбласти
#КонецОбласти
В разделе "Форма" собираются все обработчики событий формы.
В разделе "Элементы" собираются все обработчики событий элементов формы (кроме таблиц и табличных полей).
В разделе "Таблицы" собираются обработчики событий всех таблиц формы. При необходимости в область таблицы можно добавить вложенную область "Команды" и включить в нее все команды относящиеся к таблице.
В разделе "Оповещения" собираются все оповещения о событиях формы.
В разделе "Подключаемые" указываются все подключаемые процедуры и функции формы.
В разделе "Методы" собираются все остальные процедуры и функции. В исходном варианте он содержит вложенные области по директивам компиляции, соответственно "НаКлиенте", "НаСервере". Вначале были еще и области "НаСервереБезКонтекста", "НаКлиентеНаСервереБезКонтекста", но согласно стандарта "Правила создания общих модулей" не рекомендуется определять модули одновременно для клиента и для сервера. Здесь принцип такой же. По сути в модуле формы, с помощью областей определяются клиентская и серверная часть формы. Общий модуль, да может быть смешанным, но в этом случае, это скорее получается некий пакет связанного функционала, который должен уметь работать и на клиенте и на сервере.
Исходный замысел был в том чтобы разделить логику модуля на клиентскую и серверную части соответственно, однако, естественно, при увеличении объема кода, принятый набор областей перестанет справляться со сложностью. В этом случае, я переразбиваю функции, добавляя область "Пакеты", и уже в ней указываю вложенные области, группируя функции. Например:
#Область Пакеты
#КонецОбласти
Хотя появление этой области, скорее говорит о том что функционал формы перегружен. Впрочем, для каких-то сложных обработок, это может быть применимо.
Для модуля объекта:
#Область Интерфейс
#КонецОбласти
#Область События
#КонецОбласти
#Область Методы
#КонецОбласти
Для общего модуля (и для модуля менеджера):
#Область Интерфейс
#КонецОбласти
#Область Методы
#КонецОбласти