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

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

Что такое модуль приложения в 1С и как с ним работать

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

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

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

Знание устройства модулей помогает быстрее находить нужный код при доработке, правильно выбирать место для новых процедур и не нарушать логику типовых конфигураций при обновлении. Это особенно важно при поддержке решений на платформе 1С:Предприятие 8.3, где код строго разделён по контекстам исполнения — клиент и сервер.

Что такое модуль в платформе 1С:Предприятие

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

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

Виды модулей в конфигурации 1С

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

Тип модуляГде находитсяНазначение
Модуль приложенияКорень конфигурацииСобытия запуска и завершения сеанса в управляемом приложении
Модуль сеансаКорень конфигурацииИнициализация параметров сеанса, выполняется на сервере при старте
Общие модулиВетка «Общие модули»Библиотеки процедур и функций, доступные из любого места
Модуль объектаВнутри справочника, документа и т.п.Логика объекта: запись, проведение, проверка заполнения
Модуль менеджераВнутри объекта метаданныхОперации над коллекцией объектов, создание, печать
Модуль формыВнутри формыРеакция на действия пользователя, работа с элементами формы
Модуль командыВнутри командыДействие при выполнении команды интерфейса

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

Модуль приложения: что в нём размещают

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

  • ПриНачалеРаботыСистемы — выполняется при запуске клиентского приложения. Здесь обычно проверяют версию платформы, открывают стартовую форму, запускают фоновые проверки, показывают пользователю напоминания.
  • ПриЗавершенииРаботыСистемы — срабатывает при закрытии приложения, позволяет задать вопрос пользователю или отменить завершение.
  • ПриВыбореРезультатаГлобальногоПоиска, ОбработкаОтображенияОшибки и другие — для тонкой настройки поведения клиента.

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

Общие модули: основа прикладной логики

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

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

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

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

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

Клиент и сервер: где исполняется код модуля

Главная особенность управляемого приложения — разделение исполнения. Клиентская часть работает на компьютере пользователя и отвечает за интерфейс, серверная — на сервере 1С и работает с базой данных. Код модуля компилируется только в тех контекстах, которые отмечены в его свойствах.

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

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

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

Как найти нужный модуль и безопасно доработать код

Когда нужно понять, где находится логика конкретного поведения, начинайте с формы: откройте её модуль и найдите обработчик нужной кнопки или события. Оттуда по вызовам (Ctrl+клик или F12 по имени процедуры) можно перейти в общие модули и модули объектов. Глобальный поиск по конфигурации (Ctrl+Shift+F) находит процедуру по фрагменту имени или текста сообщения об ошибке.

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

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

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

Проверка результата после изменений

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

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

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

Компиляция модуля
Норма

Проверка конфигурации проходит без ошибок в нужных контекстах

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

Сообщения «Процедура или функция не обнаружена», «Переменная не определена»

Вызов с клиента
Норма

Серверная процедура отрабатывает, данные возвращаются

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

Ошибка «Метод объекта не обнаружен» — проверьте флаг «Вызов сервера»

Поведение при запуске
Норма

Приложение стартует без задержек и лишних окон

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

Долгое открытие — в модуле приложения тяжёлый код

FAQ: частые вопросы о модулях в 1С

Чем модуль приложения отличается от модуля сеанса?

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

Почему моя процедура из общего модуля «не обнаружена»?

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

Можно ли вызвать процедуру модуля объекта извне?

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

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

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

Как доработать типовой модуль, чтобы изменения не пропали при обновлении?

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

Где посмотреть, какие модули есть в конфигурации?

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

Итог

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

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