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