Разработка и Конфигурация · 11 мин
Модули в 1С: что это такое и как они устроены
Что такое модули в 1С, чем отличаются общие модули от модулей объекта и формы, где выполняется код и как избежать типичных ошибок при разработке.
Модуль в 1С — это контейнер для программного кода на встроенном языке платформы. В нём размещают процедуры и функции, которые описывают логику работы прикладного решения: расчёт цен, проверку заполнения документов, формирование отчётов, обмен данными. Без модулей конфигурация 1С — это просто набор объектов метаданных без поведения.
Каждый модуль привязан к определённому контексту исполнения: сервер, тонкий клиент, веб-клиент, внешнее соединение. От этого зависит, где физически выполняется код и какие объекты платформы ему доступны. Непонимание контекста — главная причина ошибок у начинающих разработчиков: код, отлично работающий в толстом клиенте, может не выполниться на сервере или в веб-клиенте.
Модули бывают нескольких видов, и каждый имеет своё назначение. Общие модули хранят переиспользуемую логику, модули объектов описывают поведение конкретного справочника или документа, модули форм отвечают за интерфейсное взаимодействие. Разберём каждый вид и правила работы с ними.
Что такое модуль и как он устроен
Структура любого модуля состоит из трёх частей: раздела описания переменных, раздела процедур и функций, и раздела основной программы (тела модуля). Тело модуля выполняется при инициализации — например, при открытии формы или создании объекта. Переменные, объявленные с ключевым словом Экспорт, доступны извне модуля.
Процедуры и функции тоже могут быть экспортными — тогда их можно вызывать из других модулей. Например, функция РассчитатьСкидку(), объявленная в общем модуле с признаком Экспорт, доступна из модуля любого документа. Без Экспорт процедура остаётся внутренней, «приватной» для своего модуля.
Код в модулях пишется на встроенном языке 1С. Синтаксис допускает русские и английские ключевые слова, но в коммерческих разработках принят русский вариант — он используется в типовых конфигурациях. Платформа сама компилирует модуль при сохранении конфигурации и сообщает о синтаксических ошибках.
Основные виды модулей в конфигурации
Платформа 1С:Предприятие 8 предоставляет несколько типов модулей, и у каждого — строго определённая роль. Путаница между ними приводит к тому, что код оказывается недоступен там, где нужен, или выполняется не в том контексте.
| Вид модуля | Назначение | Где выполняется |
|---|---|---|
| Общий модуль | Переиспользуемые процедуры и функции | Сервер и/или клиент (по настройке) |
| Модуль объекта | Логика объекта: запись, проведение, проверки | Преимущественно сервер |
| Модуль формы | Интерфейсная логика: обработчики событий элементов | Клиент и сервер (директивы) |
| Модуль приложения | События запуска и завершения системы | Клиент |
| Модуль сеанса | Инициализация параметров сеанса | Сервер |
| Модуль менеджера | Логика, не привязанная к конкретному экземпляру объекта | Сервер |
Модуль объекта существует у справочников, документов, планов счетов и других прикладных объектов. В нём размещают обработчики событий: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения. Именно здесь описывается, что происходит с данными при записи документа и какие движения он формирует по регистрам.
Модуль формы содержит обработчики событий формы и её элементов: ПриОткрытии, ПриСозданииНаСервере, обработчики нажатий кнопок и изменения полей. Форма — единственное место, где код может выполняться и на клиенте, и на сервере, поэтому каждый метод помечается директивой компиляции.
Общие модули: сердце переиспользуемой логики
Общие модули находятся в ветке «Общие» дерева конфигурации. В них выносят код, который нужен в нескольких местах: расчёт налогов, работа со строками, проверка контрагентов, интеграционные функции. Это предотвращает дублирование и упрощает сопровождение — исправление вносится в одном месте.
Ключевые свойства общего модуля настраиваются в палитре свойств. Флажок «Сервер» означает, что код выполняется на сервере; «Клиент (обычное приложение)» и «Клиент (управляемое приложение)» — на клиенте. Флажок «Вызов сервера» разрешает обращаться к серверному модулю с клиента. Свойство «Привилегированный режим» отключает проверку прав доступа внутри модуля — это нужно, например, для регламентных операций от имени пользователей с ограниченными правами.
Рекомендуемая практика — разделять логику на серверные и клиентские модули по смыслу. В типовых конфигурациях принято именование с суффиксами: РаботаСФайлами (серверный), РаботаСФайламиКлиент (клиентский), РаботаСФайламиВызовСервера (серверный, доступный с клиента). Такое разделение сразу показывает контекст исполнения.
Контекст исполнения: клиент или сервер
В управляемом приложении код формы делится на клиентскую и серверную части с помощью директив компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Директива определяет, где будет скомпилирован и выполнен метод.
На клиенте доступны интерактивные действия: предупреждения, диалоги выбора файла, работа с элементами формы. На сервере — прямые запросы к базе данных, объектная работа со справочниками и документами, проведение. Попытка выполнить запрос к базе в клиентском методе вызовет ошибку компиляции или выполнения.
Основной принцип: минимизируйте серверные вызовы. Каждый вызов сервера с клиента — это сетевой обмен, и при медленном канале форма будет «подвисать». Собирайте данные пакетно: один серверный вызов, возвращающий структуру с нужными значениями, лучше пяти отдельных вызовов.
&НаКлиенте
Процедура РассчитатьСумму(Команда)
Результат = РассчитатьСуммуНаСервере(Объект.Ссылка);
ПоказатьОповещениеПользователя("Сумма: " + Результат);
КонецПроцедуры
&НаСервереБезКонтекста
Функция РассчитатьСуммуНаСервере(ДокументСсылка)
Возврат ДокументСсылка.Товары.Итог("Сумма");
КонецФункцииКак создать и заполнить общий модуль
Создание общего модуля выполняется в конфигураторе и занимает несколько минут. Важно сразу правильно выставить свойства, потому что их изменение позже может потребовать пересмотра всех мест вызова.
- 1В конфигураторе откройте ветку «Общие» → «Общие модули» и добавьте новый модуль
- 2Дайте осмысленное имя без пробелов, например РасчетыСервер
- 3В палитре свойств установите флажки контекста: Сервер, Вызов сервера (если нужен вызов с клиента)
- 4Напишите экспортные процедуры и функции с ключевым словом Экспорт
- 5Сохраните конфигурацию и проверьте синтаксис через «Конфигурация → Проверка конфигурации»
- 6Вызовите функцию из нужного места: Модуль.Функция(Параметры)
- 7Протестируйте выполнение под пользователем с реальными правами
После создания проверьте, что модуль компилируется без ошибок: меню «Конфигурация → Проверка конфигурации», включите проверку «Логическая целостность» и «Поиск некорректных ссылок». Ошибки в общих модулях могут проявиться только при вызове, поэтому полезно прогнать основные сценарии вручную.
Типичные ошибки при работе с модулями
Большинство проблем с модулями связано не с синтаксисом, а с контекстом и архитектурой. Ниже — ошибки, которые встречаются чаще всего.
Отдельная группа ошибок — обращение к данным формы из серверного метода без контекста. Методы с директивой &НаСервереБезКонтекста не видят реквизиты формы; данные нужно передавать параметрами. Это ускоряет работу, но требует продуманного интерфейса функций.
Если процедура используется более чем в двух местах конфигурации — это сигнал вынести её в общий модуль. Копипаста при доработках типовых конфигураций — главный источник проблем при обновлении: типовой код меняется, а ваши скопированные фрагменты остаются старыми.
Как проверить результат и что запомнить
После создания или изменения модуля убедитесь, что код работает именно там, где задумано, и не ломает смежную функциональность.
Как проверить результат
Проверка конфигурации завершается без ошибок в модуле
Сообщения о необнаруженных процедурах или недопустимых операциях в контексте
Экспортные функции вызываются, параметры передаются корректно
Ошибка «Процедура или функция с указанным именем не определена»
Серверный код выполняется на сервере, клиентский — на клиенте
Ошибки вида «Использование модального окна запрещено» или недоступность объектов
Под обычным пользователем операции выполняются или корректно отклоняются
Нарушение прав доступа там, где раньше работало, или доступ к лишним данным
При доработке модулей типовой конфигурации помните о поддержке: изменённые типовые модули усложняют обновление. По возможности используйте расширения конфигурации — они позволяют добавлять свои общие модули и переопределять обработчики без снятия конфигурации с поддержки.
Что важно запомнить
Модуль — это контейнер кода с конкретным контекстом исполнения. Общие модули хранят переиспользуемую логику, модули объектов — поведение данных, модули форм — интерфейсную логику. Перед написанием кода определите контекст (клиент/сервер), минимизируйте серверные вызовы и выносите повторяющийся код в общие модули.
Частые вопросы
Чем общий модуль отличается от модуля объекта?
Модуль объекта привязан к конкретному справочнику или документу и описывает его поведение: запись, проведение, заполнение. Общий модуль не привязан к объекту и содержит универсальные процедуры, доступные отовсюду. Код, нужный в нескольких объектах, размещают в общем модуле.
Почему возникает ошибка «Процедура или функция не обнаружена»?
Чаще всего причины три: забыто ключевое слово Экспорт у вызываемой процедуры, общий модуль недоступен в текущем контексте (например, серверный модуль без флажка «Вызов сервера» вызывается с клиента) или опечатка в имени модуля/процедуры. Проверьте свойства модуля и сигнатуру вызова.
Что означает флажок «Вызов сервера» у общего модуля?
Он разрешает обращаться к процедурам серверного общего модуля из клиентского кода. Без этого флажка попытка вызвать серверный модуль с клиента приведёт к ошибке компиляции. Включайте его только для модулей, которые действительно должны вызываться извне.
Можно ли хранить данные в переменных общего модуля?
Технически переменные объявить можно, но хранить в них состояние между вызовами нельзя: в клиент-серверном режиме каждый серверный вызов может выполняться в новом контексте, и значения теряются. Для хранения состояния используются параметры сеанса, константы, регистры сведений или реквизиты формы.
Что такое привилегированный режим модуля и когда он нужен?
Это режим, в котором код модуля выполняется без проверки прав доступа к объектам базы. Он нужен для служебных операций, которые пользователь должен инициировать, но не имеет прямых прав на данные — например, запись служебного регистра при проведении документа. Использовать его следует точечно, осознавая риски безопасности.
Как доработать модуль типовой конфигурации, чтобы не сломать обновление?
Оптимальный способ — расширение конфигурации: в нём можно создавать собственные общие модули и переопределять обработчики типовых форм через аннотации «Вместо», «Перед», «После». Прямое изменение типовых модулей снимает их с поддержки и усложняет каждое последующее обновление.