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