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