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

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

Виды программных модулей в 1С:Предприятие 8

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

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

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

Система модулей в 1С делится на две большие группы: модули, принадлежащие конфигурации в целом (модуль приложения, модуль сеанса, общие модули, модуль внешнего соединения), и модули, принадлежащие конкретным объектам (модули форм, объектов, менеджеров, команд). Дальше разберём каждый вид с указанием контекста исполнения и практических рекомендаций.

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

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

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

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

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

Общие модули — самостоятельные объекты конфигурации в ветке «Общие» → «Общие модули». Именно сюда рекомендуется выносить всю переиспользуемую бизнес-логику: расчёты, проверки, работу с данными, интеграционные вызовы. Процедуры и функции общего модуля с ключевым словом Экспорт доступны из любого места конфигурации через имя модуля: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(...).

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

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

Модули форм и директивы компиляции

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

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

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

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

Модули объектов, менеджеров и наборов записей

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

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

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

Модули команд и прочие специализированные модули

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

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

Где размещать переиспользуемый код

Общий модуль (сервер)

Основной вариант для бизнес-логики с данными. Доступен отовсюду через вызов сервера, централизован, прост в поддержке

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

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

Модуль формы

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

Модуль приложения

Только глобальные клиентские процедуры и события запуска. Перегружать его бизнес-логикой нельзя

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

Алгоритм выбора строится на трёх вопросах. Первый: код относится к одному экземпляру объекта, к типу объектов или не привязан к объектам вообще? События экземпляра — в модуль объекта, логика типа — в модуль менеджера, универсальные функции — в общий модуль. Второй вопрос: где код должен исполняться? Работа с базой данных — только сервер; работа с интерфейсом — только клиент; смешанные сценарии разделяются на клиентскую обёртку и серверную реализацию.

Третий вопрос: нужен ли доступ к коду извне? Если да — процедура должна быть экспортной и находиться в общем модуле или модуле менеджера. Код в модуле формы по определению локален. Проверка результата проста: после размещения кода выполните синтаксическую проверку модулей в конфигураторе (Конфигурация → Проверка конфигурации) с флажками всех режимов компиляции — она выявит нарушения контекстов до запуска.

Порядок действий при размещении новой процедуры
  1. 1
    Определите предмет кода: событие объекта, логика типа объектов или универсальная функция
  2. 2
    Определите контекст исполнения: клиент, сервер или оба
  3. 3
    Выберите модуль по таблице соответствия: объект/менеджер/общий модуль/форма
  4. 4
    Установите нужные флажки общего модуля: Сервер, Вызов сервера, Привилегированный режим
  5. 5
    Добавьте ключевое слово Экспорт, если процедура вызывается извне
  6. 6
    Выполните проверку конфигурации для всех режимов компиляции и протестируйте вызов

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

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

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

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

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

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

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

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

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

Вызов процедуры из нужного места
Норма

Процедура доступна и исполняется

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

Ошибка исполнения при обращении к модулю

Флажок «Вызов сервера» у серверного общего модуля
Норма

Установлен, если модуль вызывается с клиента

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

Клиентский вызов падает с ошибкой

Отсутствие интерактивных вызовов на сервере
Норма

Серверные процедуры не содержат Предупреждение/Вопрос

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

Ошибка «Интерактивные операции недоступны»

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

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

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

Можно ли вызвать процедуру модуля формы из другой формы?

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

Зачем нужен модуль сеанса, если есть модуль приложения?

Модуль сеанса работает на сервере и исполняется при любом типе подключения, включая фоновые задания и веб-сервисы, где клиентского приложения нет вообще. Модуль приложения работает только на клиенте при интерактивном запуске. Инициализацию параметров сеанса и прав доступа делают именно в модуле сеанса.

Что означает ошибка «Переменная не определена» в модуле формы?

Чаще всего процедура с директивой &НаСервереБезКонтекста обращается к реквизиту формы — в этом контексте данные формы недоступны. Решение: сменить директиву на &НаСервере или передать нужные значения параметрами. Реже причина — опечатка в имени переменной или отсутствие экспорта у вызываемой процедуры общего модуля.

Когда ставить флажок «Привилегированный режим» у общего модуля?

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

Где размещать код печатной формы документа?

Стандартное место — модуль менеджера документа: процедуры ДобавитьКомандыПечати и Печать. Так печатная форма доступна и из списка, и из карточки документа, и при программном вызове. Размещение печати в модуле формы делает её недоступной вне этой формы.

Итог

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

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