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