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

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

Что такое модуль в 1С:Предприятие и для чего он нужен

Модуль в 1С — это контейнер программного кода. Разбираем виды модулей, их назначение, контексты выполнения и типичные ошибки разработчиков.

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

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

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

Где физически находится модуль и как его открыть

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

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

При поиске нужного кода удобно пользоваться глобальным поиском по конфигурации (Ctrl+Shift+F): он ищет по текстам всех модулей сразу. Это быстрее, чем вручную открывать каждый объект.

Основные виды модулей и их назначение

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

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

Клиентские и серверные контексты: в чём разница

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

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

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

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

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

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

Флажок «Клиент (обычное приложение)» нужен только если конфигурация ещё поддерживает обычные формы. В современных конфигурациях на управляемых формах его обычно не включают.

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

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

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

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

Простое правило: если код оперирует данными конкретной записи (ЭтотОбъект, реквизиты документа) — ему место в модуле объекта. Если код работает с типом объекта как таковым — в модуле менеджера.

Где размещать код

Модуль формы

Логика интерфейса: реакция на кнопки, видимость элементов, ввод данных. Не подходит для тяжёлых запросов напрямую с клиента.

Модуль объекта

События конкретной записи: проведение, запись, заполнение. Недоступен без открытого экземпляра объекта.

Общий модуль

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

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

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

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

Третья ошибка — забытое ключевое слово Экспорт в общем модуле. Без него процедура видна только внутри самого модуля, и попытка вызвать её извне даёт ошибку «Процедура или функция не определена». При этом внутри модуля вызов работает, что сбивает с толку при отладке.

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

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

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

Второй шаг — отладка. Поставьте точку останова в нужной процедуре, запустите отладку (F5) и воспроизведите действие пользователя. В табло или через вычисление выражений проверьте значения переменных. Для серверного кода убедитесь, что в конфигураторе разрешена отладка и на сервере включён режим отладки.

Третий шаг — проверка под реальными правами. Код, отлаженный под полными правами, может падать у рядового пользователя из-за ограничений ролей. Прогоните сценарий под учётной записью с типовыми правами.

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

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

Синтаксическая проверка модуля
Норма

Ошибок нет при проверке во всех режимах (клиент, сервер, веб-клиент)

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

Ошибки компиляции в отдельных режимах — код упадёт у части пользователей

Вызов общего модуля из формы
Норма

Функция вызывается и возвращает ожидаемое значение

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

Ошибка «процедура не определена» — нет Экспорт или флажка «Вызов сервера»

Работа под ограниченными правами
Норма

Сценарий выполняется без ошибок доступа

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

«Нарушение прав доступа» — нужна доработка ролей или привилегированный режим

Модули при доработке типовых конфигураций

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

Если расширение по каким-то причинам не подходит, минимизируйте вмешательство: в типовом модуле оставьте одну строку — вызов своей процедуры из собственного общего модуля. Тогда при обновлении достаточно восстановить одну строку, а не переносить сотни строк кода.

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

Чем модуль формы отличается от модуля объекта?

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

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

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

Можно ли выполнять запрос к базе данных на клиенте?

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

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

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

Как доработать типовой модуль, чтобы не потерять изменения при обновлении?

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

Сколько общих модулей должно быть в конфигурации?

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

Итог

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

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