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

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

Как создать общий модуль в 1С: практическое руководство

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

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

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

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

Что такое общий модуль и когда он нужен

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

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

Не стоит помещать в общий модуль код, который относится к одному конкретному объекту. Логику проведения конкретного документа правильнее держать в модуле объекта этого документа, а в общий модуль выносить только универсальные операции.

Как добавить общий модуль в конфигураторе

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

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

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

Функция ПолучитьВерсиюОбработки() Экспорт

Возврат "1.0";

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

Порядок создания модуля
  1. 1
    Откройте конфигуратор и ветку «Общие → Общие модули»
  2. 2
    Добавьте новый модуль, задайте имя и синоним
  3. 3
    Настройте флаги контекста: Сервер, Клиент, Вызов сервера
  4. 4
    Напишите экспортные процедуры и функции
  5. 5
    Обновите конфигурацию базы данных (F7)
  6. 6
    Вызовите функцию из другого объекта и проверьте результат

Настройка свойств: сервер, клиент и вызов сервера

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

СвойствоНазначениеКогда включать
Клиент (управляемое приложение)Код исполняется на клиенте в управляемых формахДля логики, работающей с формами, диалогами, файлами на компьютере пользователя
СерверКод исполняется на сервере 1СДля запросов к базе, проведения, обменов — почти всегда
Вызов сервераРазрешает обращаться к серверному модулю с клиентаТолько если клиентскому коду реально нужны данные с сервера
Клиент (обычное приложение)Исполнение в обычных формахТолько для конфигураций, ещё работающих в обычном режиме
Привилегированный режимКод выполняется без проверки прав доступаДля системных операций, где права пользователя не должны блокировать работу

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

Разделение кода: клиентские и серверные модули

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

Типовое разделение модулей

МодульКлиент

Флаги: Клиент (управляемое приложение). Работа с формами, оповещениями, файловыми диалогами. Не имеет доступа к базе напрямую.

МодульВызовСервера

Флаги: Сервер + Вызов сервера. Тонкая прослойка: принимает параметры с клиента, вызывает серверный модуль, возвращает результат.

МодульСервер

Флаги: Сервер, без вызова сервера. Вся работа с данными, запросы, проведение. Недоступен с клиента напрямую.

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

Для небольших самописных конфигураций допустимо обойтись двумя модулями — клиентским и серверным с вызовом сервера. Но как только появляется логика, которую нельзя показывать клиенту (проверки прав, работа с паролями, обмены), выносите её в закрытый серверный модуль.

Написание кода: процедуры, функции и область видимости

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

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

Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС) Экспорт

Если НЕ ЗначениеЗаполнено(СтавкаНДС) Тогда

Возврат Сумма;

КонецЕсли;

Возврат Сумма + СуммаНДС(Сумма, СтавкаНДС);

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

Функция СуммаНДС(Сумма, Ставка)

Возврат Сумма * Ставка / 100;

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

Обращение из другого объекта выполняется просто по имени модуля: Итог = РасчетСумм.РассчитатьСуммуСНДС(СуммаДокумента, 20);. Обратите внимание: в общем модуле недоступны экспортные переменные форм и контекст конкретного объекта — передавайте все нужные данные через параметры.

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

Обновление конфигурации и проверка результата

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

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

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

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

Модуль виден в дереве конфигурации
Норма

Модуль в ветке «Общие модули», без значка ошибки

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

Модуль отсутствует или помечен как неактуальный

Компиляция при обновлении (F7)
Норма

Обновление завершается без сообщений об ошибках

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

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

Вызов экспортной функции
Норма

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

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

«Процедура или функция не определена»

Контекст исполнения
Норма

Серверный код работает на сервере, клиентский — на клиенте

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

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

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

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

Вторая ошибка — попытка использовать запросы или обращение к базе в клиентском модуле. Код компилируется, но падает в момент исполнения. Перенесите такую логику в серверный модуль и передавайте на клиент только готовый результат.

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

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

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

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

Нет. Изменения в общем модуле вступают в силу только после обновления конфигурации базы данных (F7). В файловых базах это происходит мгновенно, в клиент-серверных может потребоваться завершение активных сеансов, если обновление блокируется.

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

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

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

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

Как скрыть код общего модуля от пользователей?

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

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

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

Итог

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

Общий модуль создаётся в ветке «Общие → Общие модули», его доступность определяется флагами «Сервер», «Клиент» и «Вызов сервера». Разделяйте логику на клиентские и серверные модули, помечайте вызываемые извне методы словом «Экспорт» и обновляйте конфигурацию базы данных после любых изменений.