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