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

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

Для чего нужен общий модуль в 1С

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

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

Главная задача общего модуля — централизация логики. Расчёт скидки, формирование номера документа, проверка заполнения реквизитов, обращение к внешнему сервису — всё это оформляется один раз в общем модуле и вызывается отовсюду через простое обращение вида ИмяМодуля.ИмяФункции().

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

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

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

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

Какие задачи решают общие модули

Первая и самая частая задача — устранение дублирования кода. Если правило расчёта используется в документе «Реализация», в отчёте по продажам и в обработке массового изменения цен, оно выносится в общий модуль. Исправление алгоритма делается в одном месте, и все вызовы автоматически получают актуальную логику.

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

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

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

Один и тот же код в 3+ местахНужен общий модуль

Найдите повторяющиеся фрагменты и вынесите их в экспортную функцию

Форма не может выполнить запросНужен серверный модуль

Проверьте, установлен ли флажок «Сервер» и «Вызов сервера»

Ошибка прав доступа у пользователяНужен привилегированный режим

Определите, какие операции должны выполняться без проверки прав

Виды общих модулей по контексту исполнения

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

СвойствоГде исполняетсяТиповое применение
СерверНа сервере 1СЗапросы, запись данных, основная бизнес-логика
Клиент (управляемое приложение)На компьютере пользователяРабота с файлами, диалоги, оповещения
Сервер + Вызов сервераНа сервере, доступен клиентуПрослойка между формой и данными
Привилегированный режимНа сервере без проверки правОбмены, регламентные задания, системные операции
Клиент (обычное приложение)Толстый клиентУнаследованные решения на обычных формах

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

Серверные модули и вызов сервера

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

Клиентские модули

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

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

Создание модуля занимает несколько минут, но продумать структуру стоит заранее. Имя модуля должно отражать его назначение: РасчетЦен, РаботаСФайламиКлиент, ОбменДаннымиСервер. Принятая в отрасли практика — добавлять к имени суффикс контекста (Клиент, Сервер, ВызовСервера), чтобы по имени было понятно, где исполняется код.

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

Пример минимального серверного модуля с одной экспортной функцией:

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

Функция РассчитатьСкидку(СуммаДокумента, ПроцентСкидки) Экспорт

Если ПроцентСкидки < 0 Или ПроцентСкидки > 100 Тогда

ВызватьИсключение "Недопустимый процент скидки";

КонецЕсли;

Возврат СуммаДокумента * ПроцентСкидки / 100;

КонецФункции

Обращение из модуля формы документа выглядит так: СуммаСкидки = РасчетСкидок.РассчитатьСкидку(Объект.СуммаДокумента, 10);. Никакого создания экземпляра объекта не требуется — общие модули существуют в единственном экземпляре.

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

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

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

Сравнение вариантов

Общий модуль

Подходит для кода, используемого несколькими объектами. Ограничение: нет контекста конкретного объекта, данные передаются параметрами

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

Подходит для логики самого объекта: обработка проведения, заполнение. Не доступен из других объектов

Модуль менеджера

Подходит для операций над коллекцией объектов: создание, печать, подбор. Вызывается через Справочники.Имя или Документы.Имя

Модуль формы

Подходит для интерфейсной логики конкретной формы. Не переиспользуется, живёт только с формой

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

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

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

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

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

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

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

Далее проверьте вызовы из реальных мест использования. Удобный способ — глобальный поиск по имени модуля (Ctrl+Shift+F): он покажет все точки обращения. Если функцию удалили или переименовали, а вызов остался, пользователь получит ошибку «Метод объекта не обнаружен» в самый неподходящий момент.

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

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

Синтаксический контроль конфигурации
Норма

Ошибок компиляции во всех режимах нет

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

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

Вызов из клиентской формы
Норма

Функция выполняется и возвращает результат

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

Ошибка «Вызов сервера запрещён» или «Метод недоступен»

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

Операция выполняется под пользователем с типовыми правами

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

Нарушение прав доступа при обычной работе

Когда общий модуль не нужен

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

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

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

Как выбрать действие

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

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

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

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

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

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

Что означает свойство «Повторное использование возвращаемых значений»?

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

Почему из формы не виден серверный общий модуль?

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

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

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

Чем общий модуль отличается от внешней обработки?

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

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

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