Разработка и Конфигурация · 11 мин
Модули 1С: какие бывают и для чего нужен каждый вид
Разбираем, какие бывают модули в 1С: общие, формы, объекта, менеджера, сеанса, приложения. Назначение, директивы компиляции, типичные ошибки и выбор.
Модуль в 1С — это контейнер для программного кода на встроенном языке. Любая логика конфигурации: расчёт цены, проведение документа, заполнение отчёта — хранится в том или ином модуле, и от правильного выбора вида модуля зависят доступность кода, скорость работы и удобство поддержки.
Ошибка выбора модуля — частая причина проблем: код, размещённый не там, либо недоступен в нужном контексте, либо заставляет систему выполнять лишние серверные вызовы. Например, функция, написанная в модуле формы, не будет видна из другой формы, а клиентский код в общем серверном модуле просто не скомпилируется.
Ниже разобраны все основные виды модулей в 1С:Предприятии 8.3, их назначение, директивы компиляции и практические критерии выбора — от модуля приложения до модулей конкретных объектов конфигурации.
Как устроена система модулей в 1С
Все модули в конфигурации 1С можно условно разделить на три группы. Первая — модули, связанные с запуском и работой сеанса: модуль приложения, модуль сеанса, модуль внешнего соединения. Вторая — общие модули, которые не привязаны к конкретному объекту и содержат переиспользуемые процедуры и функции. Третья — модули, принадлежащие конкретным объектам конфигурации: модуль объекта, модуль менеджера, модуль формы, модуль команды.
Ключевая характеристика любого модуля — контекст исполнения: клиент или сервер. В тонком и веб-клиенте код на клиенте и на сервере физически выполняется в разных процессах, поэтому платформа строго разделяет, где какой модуль компилируется. Именно это разделение определяет директивы компиляции, которые указываются перед каждой процедурой и функцией.
Модули верхнего уровня: приложение, сеанс, внешнее соединение
Модуль управляемого приложения исполняется при старте тонкого, толстого или веб-клиента. В нём обрабатываются события ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы. Здесь размещают логику инициализации клиентской части: проверку версии платформы, открытие стартовой формы, глобальные обработчики ожидания.
Модуль сеанса содержит единственный, но критически важный обработчик — УстановкаПараметровСеанса. Он выполняется на сервере при инициализации сеанса и задаёт значения параметров сеанса: текущего пользователя, настройки доступа, ограничения по организации. Обратите внимание: обработчик вызывается многократно, пока все параметры не будут установлены, поэтому код в нём должен быть быстрым и без тяжёлых запросов в цикле.
Модуль внешнего соединения работает при подключении к информационной базе через COM-connector или аналогичные механизмы. Модуль обычного приложения используется только в режиме обычного приложения (устаревший интерфейс) и в современных конфигурациях обычно остаётся пустым.
Общие модули — основа переиспользуемого кода
Общие модули не привязаны к объектам и содержат процедуры и функции, доступные из любой точки конфигурации. Именно сюда выносится бизнес-логика, которая нужна в нескольких местах: расчёт налогов, работа со строками, обмен с внешними системами, проверка заполнения реквизитов.
Поведение общего модуля задаётся его свойствами. Флажок «Сервер» означает, что модуль компилируется на сервере; «Клиент (управляемое приложение)» — на клиенте; «Вызов сервера» разрешает обращаться к серверному модулю с клиента. Флажок «Привилегированный режим» отключает проверку прав доступа — это удобно для служебных операций, но требует осторожности: через такой модуль пользователь может косвенно получить доступ к данным, на которые у него нет прав.
Хорошая практика — группировать общие модули по предметным областям и придерживаться соглашений об именовании, например: РаботаСДокументами, РаботаСДокументамиКлиент, РаботаСДокументамиВызовСервера. Так сразу видно, где компилируется модуль и откуда его можно вызывать.
Модули объектов и менеджеров
Модуль объекта принадлежит конкретному прикладному объекту — справочнику, документу, регистру, обработке. В нём описываются обработчики событий экземпляра: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения, а также экспортные процедуры, работающие с данными конкретного объекта. Модуль объекта исполняется на сервере и недоступен напрямую с тонкого клиента — до него «дотянуться» можно только через серверный вызов.
Модуль менеджера существует в единственном экземпляре для всего типа объектов (например, для всех документов «РеализацияТоваров»). В него помещают логику, которая работает с коллекцией объектов, а не с одним экземпляром: формирование печатных форм, получение представления объекта, заполнение по умолчанию, создание объектов на основании. Классический пример — процедура ДобавитьКомандуПечати и функция печати, вызываемые подсистемой печати БСП.
Модуль объекта или модуль менеджера
Код относится к одному экземпляру: проверка реквизитов, движения при проведении, заполнение по данным этого же объекта.
Код работает с типом в целом: печать, создание на основании, получение данных по ссылке без чтения всего объекта.
Логика нужна разным типам объектов или не привязана к конкретному типу: общие алгоритмы, интеграции, утилиты.
Модули форм и команд
Модуль формы — самый «населённый» модуль в типовых конфигурациях. В нём обрабатываются события формы (ПриСозданииНаСервере, ПриОткрытии), команды формы и события элементов. Особенность модуля формы — смешанный контекст: одни процедуры выполняются на клиенте, другие на сервере, поэтому директивы компиляции здесь обязательны и осмысленны.
Директива &НаСервереБезКонтекста означает, что процедура выполняется на сервере, но без доступа к данным формы — передать туда реквизит формы напрямую нельзя, только примитивные параметры и ссылки. Зато такой вызов дешевле: не сериализуется вся форма. Используйте его для вспомогательных серверных функций, которым достаточно передать ссылку или строку.
Модуль команды — небольшой модуль у объектов конфигурации и общих команд. В нём обычно одна процедура ОбработкаКоманды, которая запускается при нажатии кнопки в интерфейсе: открытие обработки, вызов печати, запуск обмена.
&НаКлиенте
Процедура РассчитатьСумму(Команда)
РассчитатьСуммуНаСервере(Объект.Ссылка);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РассчитатьСуммуНаСервере(ДокументСсылка)
// серверная логика без контекста формы
КонецПроцедурыКак выбрать модуль для нового кода
Алгоритм выбора простой. Сначала ответьте на вопрос: код привязан к конкретному объекту конфигурации? Если да — модуль объекта (логика экземпляра) или модуль менеджера (логика типа). Если код универсален — общий модуль. Если код управляет поведением формы — модуль формы.
Второй вопрос — где код должен исполняться. Всё, что работает с базой данных, запросами и правами, — на сервере. Всё, что связано с интерфейсом, диалогами, файлами на компьютере пользователя, — на клиенте. Минимизируйте число серверных вызовов из клиентских процедур: каждый вызов — это сетевой обмен, и десять вызовов подряд в цикле заметно «подвешивают» форму.
Как выбрать действие
Типичные ошибки при работе с модулями
Самая распространённая ошибка — попытка вызвать с клиента процедуру, которая существует только на сервере. Платформа выдаст ошибку компиляции или выполнения «Процедура или функция с указанным именем не определена». Проверяйте флажки общего модуля и директивы компиляции.
Вторая группа ошибок — избыточная логика в модуле формы. Когда вся бизнес-логика живёт в форме, её невозможно переиспользовать в фоновых заданиях, обменах и проведении без открытия формы. Правило простое: в форме — только интерфейсная логика, всё остальное — в общие модули и модули объектов.
Как проверить, что модуль выбран правильно
После размещения кода выполните проверку конфигурации (Конфигурация → Проверка конфигурации) с включёнными режимами «Тонкий клиент», «Веб-клиент» и «Сервер». Ошибки компиляции модулей в недоступных контекстах всплывут именно здесь, а не в момент ручного тестирования.
Затем проверьте поведение в пользовательском режиме: код должен вызываться из всех предполагаемых мест, форма не должна «подвисать» при операциях, а при работе пользователя с ограниченными правами не должно быть неожиданных ошибок доступа — или, наоборот, доступа к запрещённым данным.
Как проверить результат
Нет ошибок компиляции модулей
«Процедура не определена» или «Недопустимый контекст»
Один серверный вызов на операцию, форма отзывчива
Серверные вызовы в цикле, заметные паузы
Доступны только разрешённые данные
Ошибки прав или доступ к закрытым данным через привилегированный модуль
Частые вопросы о модулях 1С
Чем общий модуль отличается от модуля объекта?
Общий модуль не привязан к конкретному объекту и доступен из любой точки конфигурации, а модуль объекта существует только в контексте конкретного экземпляра (документа, элемента справочника) и содержит обработчики его событий — записи, проведения, заполнения.
Почему с клиента не видна процедура общего модуля?
Чаще всего у общего модуля не включён флажок компиляции для клиента или флажок «Вызов сервера». Проверьте свойства модуля: для вызова серверной процедуры с клиента обязательно нужен «Вызов сервера».
Когда использовать «НаСервереБезКонтекста»?
Когда серверной процедуре формы не нужны данные самой формы — достаточно передать ссылку или параметр. Такой вызов легче, потому что платформа не сериализует всю форму на сервер и обратно.
Опасен ли привилегированный режим в общем модуле?
Да, если модуль доступен для вызова с клиента и содержит экспортные функции, возвращающие данные. В привилегированном режиме проверка прав отключена, поэтому пользователь может получить данные, к которым у него нет доступа. Включайте этот режим только для служебных операций с минимальным набором экспортируемых процедур.
Можно ли вызвать модуль объекта напрямую с тонкого клиента?
Нет. Модуль объекта исполняется только на сервере. С клиента можно вызвать серверную процедуру формы или общий серверный модуль, которые уже обратятся к объекту.
Где размещать обработчики подписок на события?
В общих серверных модулях. Подписка на событие ссылается на процедуру общего модуля, которая будет вызвана при записи или проведении любого объекта, указанного в источнике подписки.
Что важно запомнить
Модули 1С делятся на модули запуска (приложения, сеанса), общие модули и модули объектов (объекта, менеджера, формы, команды). Выбирайте модуль по двум критериям: привязка к объекту и контекст исполнения. Бизнес-логику держите в общих модулях и модулях объектов, в формах оставляйте только интерфейс, а привилегированный режим и серверные вызовы используйте осознанно.