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

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

Общие модули в 1С: назначение, виды и практика создания

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

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

Найти общие модули можно в конфигураторе: в дереве конфигурации это ветка «Общие» → «Общие модули». Каждый модуль представляет собой текст на встроенном языке 1С без привязки к конкретному объекту данных. Вызов процедуры из общего модуля выглядит так: ИмяМодуля.ИмяПроцедуры(Параметры); — без создания экземпляров и без дополнительного объявления.

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

Зачем нужны общие модули и когда их создавать

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

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

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

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

Контекст исполнения определяется флагами в свойствах модуля. Понимание этих вариантов — ключ к правильной архитектуре.

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

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

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

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

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

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

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

Сервер + Вызов сервера

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

Только Сервер

Для внутренней серверной логики, недоступной клиенту. Безопаснее и быстрее, но из формы не вызвать.

Клиент (управляемое приложение)

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

Сервер + Клиент одновременно

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

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

Создание модуля занимает пару минут, но важно сразу задать правильные свойства — переделывать потом придётся вместе с исправлением всех мест вызова.

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

Пример минимального серверного модуля «РасчётЦенСервер»:

// Общий модуль РасчетЦенСервер

// Свойства: Сервер = Да, Вызов сервера = Да

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

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

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

КонецЕсли;

Возврат Цена * (100 - ПроцентСкидки) / 100;

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

Вызов из модуля формы документа: НоваяЦена = РасчетЦенСервер.РассчитатьЦенуСоСкидкой(Цена, 10);. Ключевое слово «Экспорт» обязательно — без него функция останется внутренней и вызов извне даст ошибку «Процедура или функция с указанным именем не определена».

Флаги свойств: что означает каждый

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

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

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

Требования к коду и именование

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

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

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

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

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

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

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

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

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

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

Проверка конфигурации (Конфигурация → Проверка конфигурации)
Норма

Ошибок компиляции модулей нет

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

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

Вызов функции из формы или другого объекта
Норма

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

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

Ошибка «Процедура или функция с указанным именем не определена» — проверьте «Экспорт» и флаги контекста

Поведение под пользователем с ограниченными правами
Норма

Данные возвращаются в рамках прав пользователя

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

Пользователь видит данные, к которым у него нет доступа — проверьте «Привилегированный режим»

Скорость работы формы при вызовах модуля
Норма

Отклик интерфейса без заметных пауз

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

Форма подвисает — вероятно, много отдельных серверных вызовов в цикле

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

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

Чем общий модуль отличается от модуля объекта?

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

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

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

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

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

Что выбрать для кеширования: «На время вызова» или «На время сеанса»?

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

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

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

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

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

Итог

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

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