К статье
Практический материал

Разработка и Конфигурация · 11 мин

Модули 1С: какие бывают и для чего нужен каждый вид

Разбираем, какие бывают модули в 1С: общие, формы, объекта, менеджера, сеанса, приложения. Назначение, директивы компиляции, типичные ошибки и выбор.

Модуль в 1С — это контейнер для программного кода на встроенном языке. Любая логика конфигурации: расчёт цены, проведение документа, заполнение отчёта — хранится в том или ином модуле, и от правильного выбора вида модуля зависят доступность кода, скорость работы и удобство поддержки.

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

Ниже разобраны все основные виды модулей в 1С:Предприятии 8.3, их назначение, директивы компиляции и практические критерии выбора — от модуля приложения до модулей конкретных объектов конфигурации.

Как устроена система модулей в 1С

Все модули в конфигурации 1С можно условно разделить на три группы. Первая — модули, связанные с запуском и работой сеанса: модуль приложения, модуль сеанса, модуль внешнего соединения. Вторая — общие модули, которые не привязаны к конкретному объекту и содержат переиспользуемые процедуры и функции. Третья — модули, принадлежащие конкретным объектам конфигурации: модуль объекта, модуль менеджера, модуль формы, модуль команды.

Ключевая характеристика любого модуля — контекст исполнения: клиент или сервер. В тонком и веб-клиенте код на клиенте и на сервере физически выполняется в разных процессах, поэтому платформа строго разделяет, где какой модуль компилируется. Именно это разделение определяет директивы компиляции, которые указываются перед каждой процедурой и функцией.

Модули верхнего уровня: приложение, сеанс, внешнее соединение

Модуль управляемого приложения исполняется при старте тонкого, толстого или веб-клиента. В нём обрабатываются события ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы. Здесь размещают логику инициализации клиентской части: проверку версии платформы, открытие стартовой формы, глобальные обработчики ожидания.

Модуль сеанса содержит единственный, но критически важный обработчик — УстановкаПараметровСеанса. Он выполняется на сервере при инициализации сеанса и задаёт значения параметров сеанса: текущего пользователя, настройки доступа, ограничения по организации. Обратите внимание: обработчик вызывается многократно, пока все параметры не будут установлены, поэтому код в нём должен быть быстрым и без тяжёлых запросов в цикле.

Модуль внешнего соединения работает при подключении к информационной базе через COM-connector или аналогичные механизмы. Модуль обычного приложения используется только в режиме обычного приложения (устаревший интерфейс) и в современных конфигурациях обычно остаётся пустым.

Общие модули — основа переиспользуемого кода

Общие модули не привязаны к объектам и содержат процедуры и функции, доступные из любой точки конфигурации. Именно сюда выносится бизнес-логика, которая нужна в нескольких местах: расчёт налогов, работа со строками, обмен с внешними системами, проверка заполнения реквизитов.

Поведение общего модуля задаётся его свойствами. Флажок «Сервер» означает, что модуль компилируется на сервере; «Клиент (управляемое приложение)» — на клиенте; «Вызов сервера» разрешает обращаться к серверному модулю с клиента. Флажок «Привилегированный режим» отключает проверку прав доступа — это удобно для служебных операций, но требует осторожности: через такой модуль пользователь может косвенно получить доступ к данным, на которые у него нет прав.

Хорошая практика — группировать общие модули по предметным областям и придерживаться соглашений об именовании, например: РаботаСДокументами, РаботаСДокументамиКлиент, РаботаСДокументамиВызовСервера. Так сразу видно, где компилируется модуль и откуда его можно вызывать.

Модули объектов и менеджеров

Модуль объекта принадлежит конкретному прикладному объекту — справочнику, документу, регистру, обработке. В нём описываются обработчики событий экземпляра: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения, а также экспортные процедуры, работающие с данными конкретного объекта. Модуль объекта исполняется на сервере и недоступен напрямую с тонкого клиента — до него «дотянуться» можно только через серверный вызов.

Модуль менеджера существует в единственном экземпляре для всего типа объектов (например, для всех документов «РеализацияТоваров»). В него помещают логику, которая работает с коллекцией объектов, а не с одним экземпляром: формирование печатных форм, получение представления объекта, заполнение по умолчанию, создание объектов на основании. Классический пример — процедура ДобавитьКомандуПечати и функция печати, вызываемые подсистемой печати БСП.

Модуль объекта или модуль менеджера

Модуль объекта

Код относится к одному экземпляру: проверка реквизитов, движения при проведении, заполнение по данным этого же объекта.

Модуль менеджера

Код работает с типом в целом: печать, создание на основании, получение данных по ссылке без чтения всего объекта.

Общий модуль

Логика нужна разным типам объектов или не привязана к конкретному типу: общие алгоритмы, интеграции, утилиты.

Модули форм и команд

Модуль формы — самый «населённый» модуль в типовых конфигурациях. В нём обрабатываются события формы (ПриСозданииНаСервере, ПриОткрытии), команды формы и события элементов. Особенность модуля формы — смешанный контекст: одни процедуры выполняются на клиенте, другие на сервере, поэтому директивы компиляции здесь обязательны и осмысленны.

Директива &НаСервереБезКонтекста означает, что процедура выполняется на сервере, но без доступа к данным формы — передать туда реквизит формы напрямую нельзя, только примитивные параметры и ссылки. Зато такой вызов дешевле: не сериализуется вся форма. Используйте его для вспомогательных серверных функций, которым достаточно передать ссылку или строку.

Модуль команды — небольшой модуль у объектов конфигурации и общих команд. В нём обычно одна процедура ОбработкаКоманды, которая запускается при нажатии кнопки в интерфейсе: открытие обработки, вызов печати, запуск обмена.

bsl
&НаКлиенте
Процедура РассчитатьСумму(Команда)
	РассчитатьСуммуНаСервере(Объект.Ссылка);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура РассчитатьСуммуНаСервере(ДокументСсылка)
	// серверная логика без контекста формы
КонецПроцедуры

Как выбрать модуль для нового кода

Алгоритм выбора простой. Сначала ответьте на вопрос: код привязан к конкретному объекту конфигурации? Если да — модуль объекта (логика экземпляра) или модуль менеджера (логика типа). Если код универсален — общий модуль. Если код управляет поведением формы — модуль формы.

Второй вопрос — где код должен исполняться. Всё, что работает с базой данных, запросами и правами, — на сервере. Всё, что связано с интерфейсом, диалогами, файлами на компьютере пользователя, — на клиенте. Минимизируйте число серверных вызовов из клиентских процедур: каждый вызов — это сетевой обмен, и десять вызовов подряд в цикле заметно «подвешивают» форму.

Маршрут решения

Как выбрать действие

Процедура нужна в нескольких объектах и формахСоздайте общий модуль с нужными флагами компиляции
Код проверяет или заполняет данные одного документаРазместите его в модуле объекта или в модуле формы этого документа
Нужна печатная форма или создание на основанииИспользуйте модуль менеджера объекта
Код реагирует на старт или завершение работы пользователяМодуль приложения или модуль сеанса
Клиентской процедуре нужны данные из базыВызовите серверный общий модуль с флажком «Вызов сервера» или серверную процедуру формы

Типичные ошибки при работе с модулями

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

Вторая группа ошибок — избыточная логика в модуле формы. Когда вся бизнес-логика живёт в форме, её невозможно переиспользовать в фоновых заданиях, обменах и проведении без открытия формы. Правило простое: в форме — только интерфейсная логика, всё остальное — в общие модули и модули объектов.

Типичные ошибки
01
Включение флажка «Привилегированный режим» без необходимости — пользователи получают обход ограничений прав через экспортные функции модуля
02
Вызов сервера в цикле из клиентской процедуры — каждый вызов это сетевой обмен, форма зависает; переносите цикл целиком на сервер
03
Дублирование одной и той же функции в модулях разных форм вместо выноса в общий модуль — при изменении логики править придётся в нескольких местах
04
Тяжёлые запросы в УстановкаПараметровСеанса — замедляется вход каждого пользователя
05
Использование &НаСервере вместо &НаСервереБезКонтекста там, где контекст формы не нужен — лишняя сериализация данных формы при каждом вызове

Как проверить, что модуль выбран правильно

После размещения кода выполните проверку конфигурации (Конфигурация → Проверка конфигурации) с включёнными режимами «Тонкий клиент», «Веб-клиент» и «Сервер». Ошибки компиляции модулей в недоступных контекстах всплывут именно здесь, а не в момент ручного тестирования.

Затем проверьте поведение в пользовательском режиме: код должен вызываться из всех предполагаемых мест, форма не должна «подвисать» при операциях, а при работе пользователя с ограниченными правами не должно быть неожиданных ошибок доступа — или, наоборот, доступа к запрещённым данным.

Контрольные точки

Как проверить результат

Проверка конфигурации во всех режимах
Норма

Нет ошибок компиляции модулей

Тревожный признак

«Процедура не определена» или «Недопустимый контекст»

Вызов серверной логики из формы
Норма

Один серверный вызов на операцию, форма отзывчива

Тревожный признак

Серверные вызовы в цикле, заметные паузы

Работа под пользователем с ограниченными правами
Норма

Доступны только разрешённые данные

Тревожный признак

Ошибки прав или доступ к закрытым данным через привилегированный модуль

Частые вопросы о модулях 1С

Чем общий модуль отличается от модуля объекта?

Общий модуль не привязан к конкретному объекту и доступен из любой точки конфигурации, а модуль объекта существует только в контексте конкретного экземпляра (документа, элемента справочника) и содержит обработчики его событий — записи, проведения, заполнения.

Почему с клиента не видна процедура общего модуля?

Чаще всего у общего модуля не включён флажок компиляции для клиента или флажок «Вызов сервера». Проверьте свойства модуля: для вызова серверной процедуры с клиента обязательно нужен «Вызов сервера».

Когда использовать «НаСервереБезКонтекста»?

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

Опасен ли привилегированный режим в общем модуле?

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

Можно ли вызвать модуль объекта напрямую с тонкого клиента?

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

Где размещать обработчики подписок на события?

В общих серверных модулях. Подписка на событие ссылается на процедуру общего модуля, которая будет вызвана при записи или проведении любого объекта, указанного в источнике подписки.

Итог

Что важно запомнить

Модули 1С делятся на модули запуска (приложения, сеанса), общие модули и модули объектов (объекта, менеджера, формы, команды). Выбирайте модуль по двум критериям: привязка к объекту и контекст исполнения. Бизнес-логику держите в общих модулях и модулях объектов, в формах оставляйте только интерфейс, а привилегированный режим и серверные вызовы используйте осознанно.