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

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

Как обратиться к функции общего модуля в 1С

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

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

Чтобы вызов прошел успешно, должны совпасть три условия: функция объявлена с ключевым словом Экспорт, флаги модуля разрешают выполнение в нужном контексте (клиент или сервер), а контекст вызова имеет доступ к этому модулю. Ниже разобран синтаксис, настройка флагов, различия клиентских и серверных вызовов и типичные ошибки.

Синтаксис обращения к функции общего модуля

Базовый синтаксис вызова выглядит так: ИмяОбщегоМодуля.ИмяФункции(Параметр1, Параметр2). Имя модуля указывается без кавычек и без пробелов, точно как оно задано в дереве конфигурации в ветке «Общие — Общие модули». Точка отделяет имя модуля от имени функции, далее в круглых скобках перечисляются параметры.

Пример объявления функции в общем модуле «РаботаСоСтроками»:

Функция УбратьЛишниеПробелы(ИсходнаяСтрока) Экспорт

Возврат СокрЛП(ИсходнаяСтрока);

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

Обращение к этой функции из любого другого модуля конфигурации:

ОчищенноеНаименование = РаботаСоСтроками.УбратьЛишниеПробелы(НаименованиеИзФормы);

Если функция возвращает значение, результат присваивается переменной или используется в выражении. Если нужен вызов процедуры (ничего не возвращает), синтаксис тот же, но результат не присваивается: ОбщегоНазначения.ЗаписатьВЖурнал(ТекстСобытия);.

Ключевое слово «Экспорт» — обязательное условие

Функция в общем модуле видна извне только если в её объявлении после списка параметров стоит слово Экспорт. Без него функция считается внутренней: она доступна только внутри самого общего модуля, и попытка обратиться к ней снаружи вызовет ошибку «Процедура или функция с указанным именем не определена».

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

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

Настройка флагов общего модуля

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

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

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

Вызов серверной функции с клиента

В управляемом приложении код разделен на клиентский и серверный. Если функция работает с базой данных (запросы, обращение к ссылкам объектов), она должна находиться в серверном общем модуле. Чтобы вызвать её из клиентской процедуры формы, у модуля должны стоять флаги «Сервер» и «Вызов сервера».

Пример вызова из клиентской процедуры управляемой формы:

&НаКлиенте

Процедура РассчитатьНажатие(Команда)

Итог = РасчетыСервер.РассчитатьСуммуДокумента(Объект.Ссылка);

Элементы.ИтоговаяСумма.Заголовок = Строка(Итог);

КонецПроцедуры

Важное ограничение: между клиентом и сервером передаются только сериализуемые значения — примитивные типы, структуры, массивы, ссылки. Нельзя передать на сервер, например, элемент формы или объект типа «ДанныеФормыСтруктура» напрямую. Если нужно обработать данные формы, их предварительно преобразуют в структуру или передают ссылку на объект.

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

Типичные ошибки
01
Вызов серверной функции в цикле по строкам таблицы — каждая итерация порождает отдельный серверный вызов, форма заметно тормозит. Решение: передать всю коллекцию одним вызовом.
02
Передача на сервер несериализуемых данных (элементы формы, COM-объекты) — вызов завершается ошибкой преобразования данных.
03
Попытка вызвать серверный модуль без флага «Вызов сервера» — клиент просто не видит модуль, возникает ошибка «Переменная не определена».

Обращение к функции из модуля объекта и формы

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

СуммаНДС = РасчетыСервер.РассчитатьНДС(СуммаДокумента, СтавкаНДС);

...

КонецПроцедуры

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

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

Сравнение вариантов размещения кода

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

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

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

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

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

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

Как проверить, что вызов работает

Самый быстрый способ проверки — отладчик конфигуратора. Поставьте точку останова на строке вызова и внутри функции общего модуля, запустите отладку (F5) и выполните действие в режиме предприятия. Если выполнение заходит внутрь функции — вызов настроен правильно. Если останавливается с ошибкой до входа в функцию — проблема в имени, Экспорт или флагах.

Дополнительно убедитесь, что имя модуля в вызове совпадает с именем в дереве конфигурации с точностью до буквы: переименование модуля без исправления всех вызовов — частый источник ошибок после рефакторинга. Найти все места обращения помогает поиск по конфигурации (Ctrl+Shift+F) по строке «ИмяМодуля.».

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

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

Объявление функции
Норма

Функция ИмяФункции(...) Экспорт

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

Слово Экспорт отсутствует — ошибка «не определена»

Флаги модуля
Норма

Для вызова с клиента стоят Сервер и Вызов сервера

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

Только Сервер — клиент не видит модуль

Конфигурация базы данных
Норма

Обновлена после изменений модуля

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

Изменения только в конфигураторе, база работает на старом коде

Отладчик
Норма

Выполнение заходит внутрь функции

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

Ошибка до входа в функцию — проблема имени или контекста

Типичные ошибки и их устранение

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

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

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

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

FAQ

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

Да, если обработка работает в той же информационной базе. Общие модули конфигурации доступны внешним обработкам и отчетам по тому же синтаксису ИмяМодуля.ИмяФункции(). Учитывайте контекст: в клиентской части обработки для управляемого приложения доступны только клиентские модули и серверные с флагом «Вызов сервера».

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

Модуль менеджера привязан к конкретному объекту конфигурации (например, Документы.РеализацияТоваров) и предназначен для логики этого объекта. Общий модуль не привязан ни к чему и хранит код, нужный многим объектам. Если функция используется только одним видом документов — логичнее разместить её в модуле менеджера, если многими — в общем модуле.

Почему функция видна в конфигураторе, но выдает ошибку в режиме предприятия?

Наиболее вероятная причина — конфигурация базы данных не обновлена после изменения модуля. Вторая по частоте — контекст выполнения: в режиме предприятия код выполняется на тонком клиенте или сервере, где модуль может быть недоступен из-за флагов, хотя синтаксическая проверка в конфигураторе проходила в другом контексте.

Как передать в функцию общего модуля таблицу значений с формы?

Таблица значений, связанная с реквизитом формы, напрямую на сервер не передается. В серверной процедуре формы преобразуйте её методом РеквизитФормыВЗначение или соберите данные в массив структур и передайте его как параметр серверной функции. После обработки верните результат обратно структурой или массивом.

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

Да, общие модули свободно вызывают друг друга по тому же синтаксису, при условии совместимости контекстов: серверный модуль может вызвать другой серверный, клиентский — другой клиентский. Следите, чтобы не возникало циклических зависимостей, когда модуль А вызывает модуль Б, а модуль Б — модуль А: это усложняет сопровождение и может приводить к ошибкам компиляции в неочевидных сценариях.

Что делать, если функций много и имена модулей длинные?

Присваивайте результат вызова переменной с понятным именем и группируйте функции по смыслу в отдельные модули (РаботаСоСтроками, РасчетыСервер, ОбменДанными). Длинное имя модуля — не проблема, если оно отражает назначение; гораздо хуже короткие непонятные имена, по которым невозможно найти нужную функцию.

Итог

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

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