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

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

Что такое общий модуль в 1С и как с ним работать

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

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

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

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

Где находятся общие модули и как их создать

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

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

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

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

Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС) Экспорт
	Возврат Сумма + Сумма * СтавкаНДС / 100;
КонецФункции

// Вызов из любого другого модуля:
// Итог = РасчетыСервер.РассчитатьСуммуСНДС(1000, 20);

Флаги свойств: где выполняется код модуля

Флаги в палитре свойств определяют контекст исполнения. Это ключевая настройка общего модуля, и её нужно понимать до написания первой строки кода.

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

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

Выбор контекста модуля

Серверный модуль

Запросы к базе, проведение, обмен данными. Недоступны диалоги и элементы форм.

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

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

Сервер + Клиент

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

Привилегированный режим и безопасность

Флаг «Привилегированный» включает выполнение кода модуля без проверки прав доступа. Это нужно, когда рядовой пользователь должен, например, получить результат расчёта, который читает данные, закрытые для его роли, — типовой пример: получение курсов валют или служебных констант.

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

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

Флаг «Вызов сервера» и обращение с клиента

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

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

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

Глобальные и неглобальные модули

Флаг «Глобальный» делает экспортные процедуры модуля доступными без указания имени модуля — как будто это встроенные функции платформы. Например, функцию ФорматЧисла() из глобального модуля можно вызвать просто по имени.

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

Типичное назначение: как распределять код по модулям

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

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

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

Одинаковый код в 2+ местахДублирование

Вынесите логику в общий модуль и замените копии вызовами

Нужен запрос из формыКлиент не имеет доступа к запросам

Создайте серверный модуль с флагом «Вызов сервера»

Ошибка прав у пользователяОперация требует данных вне его роли

Оцените привилегированный модуль для узкой операции

Медленный старт сеансаТяжёлые глобальные модули

Перенесите код в неглобальные модули, вызываемые по требованию

Типичные ошибки и ограничения

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

Вторая ошибка — передача несериализуемых объектов между клиентом и сервером. Объекты типа «СправочникОбъект», «Запрос», «ТабличныйДокумент» нельзя передать с сервера на клиент. Передавать нужно ссылки, структуры, массивы и примитивные типы.

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

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

Как проверить результат после изменений

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

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

Контрольные точки после настройки модуля

Проверка конфигурации
Норма

Нет ошибок компиляции в режимах «Сервер» и «Тонкий клиент»

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

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

Вызов из формы
Норма

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

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

«Процедура или функция не обнаружена» — проверьте флаги

Работа под ограниченными правами
Норма

Операция завершается без ошибок доступа

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

«Нарушение прав доступа» — нужен привилегированный модуль или доработка ролей

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

Один серверный вызов на операцию

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

Заметные паузы, множество вызовов в замере производительности

Итог

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

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

Частые вопросы

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

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

Почему возникает ошибка «Процедура или функция не обнаружена»?

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

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

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

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

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

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

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

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

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