Разработка и Конфигурация · 11 мин
Какие модули есть в 1С и для чего они нужны
Разбираем, какие модули есть в 1С: общие модули, модули объектов, форм, сеанса, приложения. Назначение, директивы компиляции, типичные ошибки разработчика.
Модуль в 1С — это контейнер программного кода на встроенном языке платформы. Любая логика конфигурации: расчёт зарплаты, проведение документа, проверка заполнения справочника — размещается в модулях. Понимание того, какие виды модулей существуют и где должен лежать конкретный код, — базовый навык разработчика и внедренца 1С.
Ошибка в выборе места для кода приводит к типичным проблемам: процедура не видна из другого объекта, серверный вызов обрушивает производительность, а при обновлении конфигурации доработки теряются. Поэтому вопрос «какие модули есть в 1С» — не академический, а вполне практический: от ответа зависит архитектура решения.
Платформа «1С:Предприятие 8» предусматривает несколько типов модулей, различающихся местом исполнения (клиент или сервер), областью видимости и назначением. Ниже разобраны все основные виды, правила выбора между ними и типичные ошибки при работе с модулями.
Модули верхнего уровня: приложение, сеанс, внешнее соединение
Модуль управляемого приложения (и устаревший модуль обычного приложения) отвечает за старт и завершение работы программы. В нём обрабатываются события ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы. Здесь размещают код, который должен выполниться один раз при запуске: проверку версии, открытие стартовой формы, установку глобальных параметров.
Модуль сеанса содержит единственное важное событие — УстановкаПараметровСеанса. Оно срабатывает при инициализации сеанса и используется для заполнения параметров сеанса: текущего пользователя, настроек прав, функциональных опций. Код здесь должен быть максимально быстрым, потому что выполняется при каждом старте сеанса, включая фоновые задания.
Модуль внешнего соединения используется, когда с информационной базой работают через COM-соединение или Automation-сервер. В нём определяют, какие данные и операции доступны внешней программе. В современных решениях его роль частично перехватывают HTTP-сервисы, но в старых интеграциях модуль внешнего соединения встречается часто.
Общие модули — основа прикладной логики
Общие модули — это библиотеки процедур и функций, доступные из любого объекта конфигурации. Именно здесь в типовых конфигурациях живёт большая часть бизнес-логики: расчёты, проверки, работа с запросами, интеграции. Общий модуль не привязан к конкретному объекту метаданных и не хранит состояние между вызовами.
Поведение общего модуля определяется его свойствами в конфигураторе. Флажок «Сервер» означает исполнение на сервере приложений, «Клиент (управляемое приложение)» — на клиенте, «Вызов сервера» разрешает обращаться к серверному модулю с клиента. Флажок «Привилегированный режим» отключает проверку прав доступа внутри модуля — это нужно для операций, которые пользователь не может выполнить напрямую, но которые допустимы в рамках бизнес-процесса.
Принятая в типовых решениях практика — парные модули с постфиксами: РасчетЗарплаты (серверный) и РасчетЗарплатыКлиент (клиентский), а также модули с постфиксом Переопределяемый для внесения прикладных изменений без правки основного кода. Такое разделение упрощает поддержку и обновление.
Модули объектов и менеджеров: где живёт поведение данных
Модуль объекта есть у справочников, документов, планов счетов, регистров и других прикладных объектов. Он описывает поведение конкретного экземпляра: что происходит при записи (ПередЗаписью, ПриЗаписи), при проведении документа (ОбработкаПроведения), при заполнении (ОбработкаЗаполнения) и при проверке корректности (ОбработкаПроверкиЗаполнения). Модуль объекта исполняется только на сервере.
Модуль менеджера объекта содержит код, относящийся ко всему типу объектов, а не к одному экземпляру: создание элемента с предустановленными параметрами, формирование печатных форм, получение представления. Частый пример — процедура Печать в модуле менеджера документа, формирующая табличный документ для вывода на печать.
Важно помнить ограничение: в модуле объекта нельзя обращаться к элементам формы и выполнять клиентские операции — контекст формы там недоступен. Если при записи документа нужно задать вопрос пользователю, это делается не в модуле объекта, а через механизм проверки заполнения с выдачей сообщения либо на клиенте до вызова записи.
Модули форм и команд: клиентская часть
Модуль формы — самый «перегруженный» по структуре вид модуля. В нём смешиваются клиентские и серверные процедуры, разделённые директивами компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Обработчики событий формы (ПриОткрытии, ПередЗаписью) и команд размещаются именно здесь.
Директива определяет, где исполняется код и что ему доступно. Клиентская процедура работает с элементами формы, но не может напрямую выполнять запросы к базе. Серверная процедура без контекста не имеет доступа к реквизитам формы напрямую, зато исполняется быстрее и может быть вызвана из тонкого клиента. Неправильный выбор директивы — частая причина лишних серверных вызовов, которые заметно тормозят форму при работе через интернет.
Модули команд (общих команд и команд объектов) хранят обработчики ОбработкаКоманды. Они используются для действий, не привязанных к конкретной форме: открытие отчёта из подменю, запуск обработки, печать из списка документов.
- 1Определите, к чему относится логика: к интерфейсу, к объекту данных или это переиспользуемая операция
- 2Интерфейсную реакцию (клик, открытие, вопрос пользователю) разместите в модуле формы с директивой &НаКлиенте
- 3Поведение при записи или проведении объекта разместите в обработчиках модуля объекта
- 4Повторно используемую расчётную логику вынесите в общий серверный модуль с Экспорт
- 5Проверьте, что клиентский код не содержит запросов к базе, а серверные вызовы из формы минимальны
Директивы компиляции и контекст исполнения
Контекст исполнения — ключевое понятие при работе с модулями. Один и тот же код может компилироваться на сервере, на толстом, тонком или веб-клиенте, и набор доступных возможностей различается. Например, работа с файловой системой и диалогами доступна на клиенте, а прямое обращение к базе данных — только на сервере.
Директивы &НаКлиенте и &НаСервере в модуле формы явно указывают контекст. В общих модулях контекст задаётся свойствами модуля, но дополнительно можно использовать инструкции препроцессора #Если Сервер Тогда ... #КонецЕсли для точечной настройки компиляции под разные режимы.
Практическое правило: минимизируйте число серверных вызовов из клиентского кода. Каждый вызов серверной процедуры из формы — это сетевой обмен. Если при изменении одного поля форма делает пять вызовов сервера, пользователи на медленных каналах почувствуют заметные задержки. Объединяйте несколько обращений в одну серверную функцию, возвращающую структуру с результатами.
Как смотреть модули в конфигураторе и отладчике
В дереве конфигурации модули открываются из контекстного меню объекта: «Открыть модуль объекта», «Открыть модуль менеджера», «Открыть модуль формы». Общие модули находятся в отдельной ветке «Общие → Общие модули». Модули приложения, сеанса и внешнего соединения открываются из корня конфигурации.
Для поиска нужного кода по всей конфигурации используйте глобальный поиск (Ctrl+Shift+F) с фильтром по типам модулей. Это быстрее, чем вручную открывать объекты, особенно в типовых конфигурациях, где общих модулей сотни.
Отладка модулей включается через меню «Отладка → Подключение» с выбором нужного предмета отладки. Учтите: серверный код отлаживается только при запущенной отладке на сервере (для серверной базы — при включённом режиме отладки на сервере 1С), иначе точки останова в серверных модулях просто не сработают.
Как проверить правильность размещения кода
Проверка конфигурации (Конфигурация → Проверка конфигурации) проходит без ошибок по модулю
Ошибки вида «переменная не определена» или недоступные в контексте методы
Серверные процедуры вызываются из формы редко и пакетно
На каждое действие пользователя — несколько серверных вызовов, форма тормозит
Операции под привилегированным режимом оформлены осознанно и задокументированы
Привилегированные модули используются «на всякий случай» повсеместно
Практические рекомендации по организации кода
Держите модули компактными по смыслу: один общий модуль — одна предметная область. Модуль «ОбщегоНазначения» на тридцать тысяч строк, куда складывают всё подряд, усложняет поиск, замедляет компиляцию и повышает риск конфликтов при командной разработке.
Для доработок типовых конфигураций предпочтительнее создавать собственные общие модули с понятным префиксом (например, по аббревиатуре проекта), а не встраивать код в типовые модули. Это резко упрощает обновление: ваши модули не конфликтуют с изменениями поставщика.
Документируйте программный интерфейс общих модулей комментариями перед экспортными процедурами: назначение, параметры, возвращаемое значение. В типовых конфигурациях придерживаются стандартов оформления, и следование им облегчает чтение кода другими разработчиками.
Что важно запомнить
Модули 1С делятся на модули верхнего уровня (приложение, сеанс, внешнее соединение), общие модули, модули объектов и менеджеров, модули форм и команд. Выбор места для кода определяется контекстом исполнения и назначением логики: интерфейс — в форме, поведение объекта — в модуле объекта, переиспользуемая логика — в общем серверном модуле с Экспорт.
Часто задаваемые вопросы
Чем общий модуль отличается от модуля объекта?
Общий модуль не привязан к данным и содержит независимые процедуры, доступные отовсюду. Модуль объекта исполняется в контексте конкретного экземпляра (например, записываемого документа) и имеет доступ к его реквизитам через контекст. Логика «как объект себя ведёт» — в модуле объекта, логика «как что-то посчитать» — в общем модуле.
Почему процедура общего модуля не видна из формы?
Чаще всего не хватает слова Экспорт после объявления процедуры. Также проверьте свойства модуля: если он серверный без флажка «Вызов сервера», обратиться к нему из клиентской процедуры формы нельзя — вызов нужно делать из серверной процедуры формы или включить соответствующее свойство.
Что означает «привилегированный режим» у общего модуля?
Код в таком модуле выполняется без проверки прав доступа пользователя к объектам базы. Это нужно для операций, которые система должна выполнить независимо от прав (например, запись служебного регистра). Злоупотреблять этим режимом опасно: через него пользователь косвенно получает доступ к данным, которые ему закрыты.
Можно ли вызвать модуль объекта напрямую из формы списка?
Модуль объекта исполняется только в контексте созданного объекта (например, после вызова ПолучитьОбъект() на сервере). Из формы списка напрямую его методы не вызываются — нужно на сервере получить объект ссылки и работать с ним. Для операций над типом в целом предназначен модуль менеджера.
Где размещать код обмена с внешней системой?
Обычно в отдельном общем серверном модуле, выделенном под интеграцию. Если обмен инициируется регламентным заданием, обработчик задания вызывает методы этого модуля. Клиентские модули для обмена не подходят, так как обмен обычно должен работать без участия пользователя.
Что такое модули с постфиксом «Переопределяемый» в типовых конфигурациях?
Это модули, специально предназначенные поставщиком для внесения прикладных доработок. Типовой код вызывает их процедуры в ключевых точках, а внедренец заполняет их своей логикой. Правка таких модулей считается более безопасной при обновлении, чем изменение основных модулей конфигурации.