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

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

Модули в 1С: что это такое и как они устроены

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

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

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

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

Что такое модуль и как он устроен

Структура любого модуля состоит из трёх частей: раздела описания переменных, раздела процедур и функций, и раздела основной программы (тела модуля). Тело модуля выполняется при инициализации — например, при открытии формы или создании объекта. Переменные, объявленные с ключевым словом Экспорт, доступны извне модуля.

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

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

Основные виды модулей в конфигурации

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

Вид модуляНазначениеГде выполняется
Общий модульПереиспользуемые процедуры и функцииСервер и/или клиент (по настройке)
Модуль объектаЛогика объекта: запись, проведение, проверкиПреимущественно сервер
Модуль формыИнтерфейсная логика: обработчики событий элементовКлиент и сервер (директивы)
Модуль приложенияСобытия запуска и завершения системыКлиент
Модуль сеансаИнициализация параметров сеансаСервер
Модуль менеджераЛогика, не привязанная к конкретному экземпляру объектаСервер

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

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

Общие модули: сердце переиспользуемой логики

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

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

Рекомендуемая практика — разделять логику на серверные и клиентские модули по смыслу. В типовых конфигурациях принято именование с суффиксами: РаботаСФайлами (серверный), РаботаСФайламиКлиент (клиентский), РаботаСФайламиВызовСервера (серверный, доступный с клиента). Такое разделение сразу показывает контекст исполнения.

Контекст исполнения: клиент или сервер

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

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

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

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

&НаСервереБезКонтекста
Функция РассчитатьСуммуНаСервере(ДокументСсылка)
	Возврат ДокументСсылка.Товары.Итог("Сумма");
КонецФункции

Как создать и заполнить общий модуль

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

Порядок действий
  1. 1
    В конфигураторе откройте ветку «Общие» → «Общие модули» и добавьте новый модуль
  2. 2
    Дайте осмысленное имя без пробелов, например РасчетыСервер
  3. 3
    В палитре свойств установите флажки контекста: Сервер, Вызов сервера (если нужен вызов с клиента)
  4. 4
    Напишите экспортные процедуры и функции с ключевым словом Экспорт
  5. 5
    Сохраните конфигурацию и проверьте синтаксис через «Конфигурация → Проверка конфигурации»
  6. 6
    Вызовите функцию из нужного места: Модуль.Функция(Параметры)
  7. 7
    Протестируйте выполнение под пользователем с реальными правами

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

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

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

Типичные ошибки
01
Размещение серверной логики (запросы, объектная работа) в клиентском методе формы — ошибка компиляции или выполнения
02
Дублирование одного и того же кода в десятке модулей объектов вместо выноса в общий модуль — исправления приходится вносить везде
03
Включение привилегированного режима «на всякий случай» — обход прав доступа и риск утечки данных
04
Частые серверные вызовы в цикле из клиентского кода — форма работает медленно при сетевом доступе
05
Использование глобальных переменных модуля для хранения состояния — в клиент-серверном режиме значения теряются между вызовами
06
Забытое слово Экспорт — процедура недоступна из других модулей, ошибка «Процедура или функция не обнаружена»

Отдельная группа ошибок — обращение к данным формы из серверного метода без контекста. Методы с директивой &НаСервереБезКонтекста не видят реквизиты формы; данные нужно передавать параметрами. Это ускоряет работу, но требует продуманного интерфейса функций.

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

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

После создания или изменения модуля убедитесь, что код работает именно там, где задумано, и не ломает смежную функциональность.

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

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

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

Проверка конфигурации завершается без ошибок в модуле

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

Сообщения о необнаруженных процедурах или недопустимых операциях в контексте

Вызов из других модулей
Норма

Экспортные функции вызываются, параметры передаются корректно

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

Ошибка «Процедура или функция с указанным именем не определена»

Контекст выполнения
Норма

Серверный код выполняется на сервере, клиентский — на клиенте

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

Ошибки вида «Использование модального окна запрещено» или недоступность объектов

Права доступа
Норма

Под обычным пользователем операции выполняются или корректно отклоняются

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

Нарушение прав доступа там, где раньше работало, или доступ к лишним данным

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

Итог

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

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

Частые вопросы

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

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

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

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

Что означает флажок «Вызов сервера» у общего модуля?

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

Можно ли хранить данные в переменных общего модуля?

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

Что такое привилегированный режим модуля и когда он нужен?

Это режим, в котором код модуля выполняется без проверки прав доступа к объектам базы. Он нужен для служебных операций, которые пользователь должен инициировать, но не имеет прямых прав на данные — например, запись служебного регистра при проведении документа. Использовать его следует точечно, осознавая риски безопасности.

Как доработать модуль типовой конфигурации, чтобы не сломать обновление?

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