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

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

1С Common: что это такое и зачем нужны общие модули

Разбираем, что означает Common в 1С: общие модули, их свойства (сервер, клиент, привилегированный режим), назначение, ошибки настройки и практические примеры.

Запрос «1С common» чаще всего означает общие модули (Common modules) — объект конфигурации 1С:Предприятие, в котором размещают процедуры и функции, доступные из любой точки прикладного решения. В дереве конфигуратора они находятся в ветке «Общие» → «Общие модули», а в англоязычном синтаксисе встроенного языка раздел так и называется — Common modules.

Общий модуль не имеет собственной формы, таблицы или интерфейса. Это контейнер кода: в него выносят прикладную логику, которая нужна одновременно в документах, справочниках, отчётах и регистрах, чтобы не дублировать один и тот же текст в десятках мест. Обращение к процедуре выполняется по имени модуля, например РаботаСНоменклатурой.ПолучитьЦену(Номенклатура).

Кроме общих модулей, слово Common встречается в 1С и в других контекстах: общие реквизиты (Common attributes), общие команды, общие формы и общие картинки. Все они объединены одной идеей — объект создаётся один раз и переиспользуется во всей конфигурации. Ниже разберём устройство общих модулей, их свойства и типичные ошибки настройки.

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

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

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

Свойства модуля: где выполняется код

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

СвойствоЧто означаетКогда включать
СерверКод выполняется на сервере 1СЗапросы к базе, проведение, работа с правами
Клиент (обычное приложение)Код на клиенте в толстом клиентеРедко, для старых решений
Клиент (управляемое приложение)Код на тонком/веб-клиентеИнтерфейсные проверки, диалоги
Вызов сервераМодуль можно вызывать с клиентаКогда клиенту нужны серверные данные
Привилегированный режимКод без проверки прав доступаСлужебные операции, обмены

Типовые сценарии использования

Вынос повторяющейся логики

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

Разделение клиентского и серверного кода

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

Обработчики подписок и регламентных заданий

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

bsl
// Общий модуль РасчетЦен, Сервер = Истина
Функция ПолучитьЦену(Номенклатура, Дата) Экспорт
	Запрос = Новый Запрос("ВЫБРАТЬ Цена ИЗ РегистрСведений.Цены.СрезПоследних(&Дата, Номенклатура = &Ном)");
	Запрос.УстановитьПараметр("Дата", Дата);
	Запрос.УстановитьПараметр("Ном", Номенклатура);
	Выборка = Запрос.Выполнить().Выбрать();
	Возврат ?(Выборка.Следующий(), Выборка.Цена, 0);
КонецФункции

Как создать и настроить общий модуль

Порядок действий
  1. 1
    Откройте конфигуратор, ветка Общие → Общие модули → Добавить
  2. 2
    Задайте имя без пробелов, отражающее назначение (например, ОбменСБанком)
  3. 3
    Установите флажки: Сервер для серверной логики, Вызов сервера при обращении с клиента
  4. 4
    Напишите процедуры с ключевым словом Экспорт в заголовке
  5. 5
    Обновите конфигурацию базы данных (F7) и проверьте вызов из тестового документа

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

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

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

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

Вызов процедуры из модуля документа
Норма

Код выполняется, возвращается ожидаемое значение

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

Ошибка «процедура не определена» — нет Экспорт или неверные флажки

Запуск на тонком клиенте
Норма

Серверный вызов отрабатывает, интерфейс не зависает надолго

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

Ошибка о недоступности контекста — модуль не помечен «Вызов сервера»

Регламентное задание
Норма

Задание завершается успешно в журнале регистрации

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

Ошибка исполнения — модуль не серверный

Другие объекты Common в конфигурации

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

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

Типичные ошибки и ограничения

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

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

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

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

Когда общий модуль не нужен

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

Для обработчиков команд формы используйте модуль формы, а не общий клиентский модуль, если обработчик нужен только этой форме. Общие модули оправданы там, где код реально вызывается минимум из двух–трёх независимых мест.

Итог

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

Common в 1С — это общие модули и другие переиспользуемые объекты ветки «Общие». Ключ к корректной работе — правильные флажки Сервер/Клиент/Вызов сервера, слово Экспорт у публичных процедур и осторожность с привилегированным режимом.

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

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

Модуль объекта привязан к конкретному документу или справочнику и работает с его данными через контекст «ЭтотОбъект». Общий модуль не имеет привязки и получает все данные только через параметры вызова. Логику одного объекта держат в его модуле, общую — выносят в общий модуль.

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

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

Что даёт свойство «Повторное использование возвращаемых значений»?

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

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

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

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

Жёсткого ограничения нет. Ориентир — один модуль на одну предметную задачу: работа с почтой, расчёт цен, обмен с сайтом. Модули-«свалки» на сотни несвязанных процедур усложняют поддержку сильнее, чем большое количество небольших модулей.

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

Это модуль с флажком «Глобальный»: его экспортные процедуры доступны без указания имени модуля, как встроенные функции. Такие модули работают только на клиенте. Злоупотреблять ими не стоит — глобальные имена легко конфликтуют с именами из других модулей и затрудняют чтение кода.