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