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

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

Модули в 1С:Предприятие: какие бывают и зачем нужны

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

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

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

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

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

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

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

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

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

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

Ключевые свойства общего модуля задаются в палитре свойств и определяют контекст компиляции:

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

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

Модули прикладных объектов: объект и менеджер

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

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

  • ОбработкаЗаполнения — заполнение при вводе на основании;
  • ОбработкаПроверкиЗаполнения — дополнительные проверки перед записью;
  • ПередЗаписью и ПриЗаписи — контроль и сопутствующие действия;
  • ОбработкаПроведения — формирование движений по регистрам.

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

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

Модуль формы — самый «контекстно-нагруженный» модуль. Один и тот же модуль формы может компилироваться и на клиенте, и на сервере, поэтому каждая процедура и функция помечается директивой:

  • &НаКлиенте — исполняется на клиенте; доступны элементы формы, диалоги, оповещения;
  • &НаСервере — исполняется на сервере; доступны запросы и данные, но нет клиентского контекста;
  • &НаСервереБезКонтекста — серверный вызов без передачи данных формы; быстрее, но реквизиты формы недоступны;
  • &НаКлиентеНаСервереБезКонтекста — компилируется в обоих контекстах; подходит для простых вычислений без обращения к данным.

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

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

bsl
&НаСервере
Функция ПолучитьОстаток(Номенклатура)
    Запрос = Новый Запрос("ВЫБРАТЬ Остаток ИЗ РегистрНакопления.Товары.Остатки");
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

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

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

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

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

Типичные ошибки
01
Размещение запроса к базе в клиентской процедуре формы — компиляция падает с ошибкой «Переменная не определена» или вызов недоступен в тонком клиенте.
02
Массовая логика в модуле сеанса — каждый вход пользователя в систему замедляется, а исключение в коде блокирует вход всем.
03
Дублирование одной и той же функции в пяти модулях форм вместо одного общего модуля — при изменении алгоритма правки вносят не везде и получают расхождения в расчётах.
04
Включённый флаг «Вызов сервера» у модуля с привилегированным режимом без необходимости — потенциальная дыра в безопасности.

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

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

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

Как выбрать место для кода

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

Дополнительное правило: минимизируйте количество серверных вызовов. Каждый вызов серверной процедуры из клиентского кода — это сетевой обмен. Если обработчик на клиенте дёргает сервер в цикле, интерфейс будет «подвисать». Собирайте данные на клиенте в структуру и передавайте на сервер одним вызовом.

Проверка результата и отладка

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

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

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

Компиляция модуля
Норма

Проверка конфигурации проходит без ошибок во всех нужных режимах

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

Ошибки вида «Процедура или функция не определена» или «Метод недоступен»

Вызов из клиента
Норма

Серверный модуль имеет флаг «Вызов сервера», вызов выполняется

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

Сообщение о нарушении прав доступа к модулю или недоступности

Производительность формы
Норма

Открытие и заполнение формы без заметных пауз

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

Паузы при каждом действии — признак частых серверных вызовов

Вход в систему
Норма

Пользователи входят штатно

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

Ошибка при установке параметров сеанса — проблема в модуле сеанса

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

Итог

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

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

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

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

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

Почему серверный общий модуль не виден из клиентского кода?

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

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

Когда процедуре не нужны реквизиты и данные формы. Вызов без контекста не передаёт данные формы на сервер и обратно, поэтому работает быстрее. Если внутри нужно обратиться к реквизиту формы — используйте &НаСервере или передавайте значения параметрами.

Можно ли вызвать модуль объекта из формы?

Напрямую из клиентской процедуры — нет: модуль объекта исполняется только на сервере. Из процедуры &НаСервере можно получить объект через ДанныеФормыВЗначение() и работать с ним, но чаще логику выносят в серверный общий модуль или модуль менеджера, а форма лишь инициирует вызов.

Что такое глобальный общий модуль и стоит ли его создавать?

Глобальный модуль позволяет вызывать его процедуры без указания имени модуля — просто по имени процедуры. Это сокращает запись, но засоряет глобальный контекст и повышает риск конфликтов имён. В новых разработках глобальные модули создавать не рекомендуется.

Где размещать код, который должен работать и в тонком клиенте, и на сервере?

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