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

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

Общий модуль в 1С: что это и как с ним работать

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

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

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

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

Чем общий модуль отличается от других модулей конфигурации

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

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

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

Флаги свойств: где будет выполняться код

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

ФлагЧто означаетКогда ставить
СерверМодуль компилируется и выполняется на сервере 1СЗапросы к БД, расчёты, проведение, любая работа с данными
Клиент (обычное приложение)Выполняется в толстом клиентеТолько для поддержки старых конфигураций
Клиент (управляемое приложение)Выполняется в тонком и веб-клиентеДиалоги, работа с файлами на компьютере пользователя, оповещения
Вызов сервераМодуль можно вызывать с клиента, но выполняется он на сервереКогда клиентскому коду нужны данные с сервера
Привилегированный режимКод выполняется без проверки прав доступаОперации, которые пользователь не может делать напрямую (служебные записи, обмены)

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

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

Как создать общий модуль: пошаговый порядок

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

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

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

bsl
// Общий модуль РасчетыСервер, флаги: Сервер

Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС) Экспорт
	Возврат Сумма + Сумма * СтавкаНДС / 100;
КонецФункции

Серверные, клиентские и модули вызова сервера: как разделить код

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

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

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

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

Куда поместить код

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

Именование и организация модулей по стандарту

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

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

Не создавайте один огромный модуль «ОбщийМодуль» на несколько тысяч строк. Такой код трудно искать, тестировать и переносить. Группируйте методы по предметной области: работа со строками — отдельно, расчёты — отдельно, интеграция с внешними сервисами — отдельно.

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

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

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

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

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

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

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

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

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

Нет ошибок компиляции ни в одном контексте

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

Ошибки вида «переменная не определена» или «процедура не обнаружена» в отдельных режимах

Вызов функции из формы
Норма

Результат возвращается за один серверный вызов

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

В замере производительности видны десятки вызовов сервера на одно действие

Права пользователя
Норма

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

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

Ошибка «Нарушение прав доступа» у пользователей без полных прав

Поведение в веб-клиенте
Норма

Функциональность работает так же, как в тонком клиенте

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

В веб-клиенте метод недоступен или ведёт себя иначе

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

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

Ограничения и когда общий модуль не нужен

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

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

Итог

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

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

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

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

Да, если контексты совместимы. Из клиентской части формы доступны клиентские модули и серверные модули с флагом «Вызов сервера». Из серверной части формы (методы с директивой &НаСервере) — любые серверные модули. Вызов записывается как ИмяМодуля.ИмяМетода(Параметры).

Чем «Вызов сервера» отличается от «Привилегированный режим»?

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

Почему конфигуратор пишет «Процедура или функция не обнаружена», хотя она есть в модуле?

Три типичные причины: в объявлении метода пропущено ключевое слово «Экспорт»; у модуля не установлен флаг контекста, из которого идёт вызов (например, нет «Вызов сервера» при обращении с клиента); либо ошибка в имени модуля или метода. Проверьте эти три пункта по порядку.

Сохраняются ли значения переменных общего модуля между вызовами?

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

Нужно ли обновлять конфигурацию базы данных после добавления общего модуля?

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

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

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