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

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

Что такое модуль в 1С и для чего он нужен

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

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

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

Ниже разберём виды модулей, их назначение, правила выбора места для кода и типичные ошибки при работе с ними.

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

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

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

Основные виды модулей в конфигурации

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

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

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

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

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

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

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

Модуль объекта и модуль формы: в чём разница

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

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

Где размещать код

Общий модуль

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

Модуль объекта

Логика относится к данным объекта: проведение, заполнение, контроль. Не подходит для интерфейсных действий.

Модуль формы

Реакция на действия пользователя и управление элементами формы. Тяжёлые серверные операции здесь размещать не стоит.

Типичная схема взаимодействия

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

Как выбрать модуль для новой процедуры

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

Маршрут решения

Как выбрать место для кода

Процедура нужна в нескольких объектах и работает с базой данныхСоздайте общий серверный модуль с флагом «Вызов сервера»
Код формирует движения документа при проведенииРазместите его в модуле объекта документа, обработчик ОбработкаПроведения
Нужно показать пользователю вопрос или открыть другую формуИспользуйте клиентскую процедуру в модуле формы с директивой &НаКлиенте
Код выполняется при старте системы (проверки, предупреждения)Используйте модуль приложения или обработчики подсистемы запуска

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

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

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

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

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

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

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

Процедура объявлена с Экспорт, модуль доступен в данном контексте

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

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

Серверный вызов из формы
Норма

У общего модуля включён «Вызов сервера», функция возвращает сериализуемые данные

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

Ошибка вызова или передача несериализуемых типов (например, запрос) на клиента

Обработчик события формы
Норма

Процедура привязана к событию элемента через палитру свойств или создана автоматически

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

Процедура написана вручную, но не связана с событием — не вызывается

Типичные ошибки при работе с модулями

Большинство проблем с модулями сводится к неправильному выбору контекста и нарушению правил видимости. Ниже — ошибки, которые встречаются чаще всего.

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

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

Практические рекомендации по организации кода

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

При изучении чужой конфигурации начинайте с общих модулей: именно там сосредоточена бизнес-логика. Поиск по всей конфигурации (Ctrl+Shift+F в конфигураторе) по имени процедуры быстро покажет, откуда она вызывается и в каких модулях есть похожий код.
ПЗ
Практическое замечание

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

Итог

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

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

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

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

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

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

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

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

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

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

Да, но только в процедуре с директивой &НаСервере или &НаСервереБезКонтекста. Из клиентской процедуры формы запрос выполнить нельзя — нужно вызвать серверную процедуру, которая выполнит запрос и вернёт результат.

Что такое модуль менеджера объекта и когда он нужен?

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

Чем отличается &НаСервере от &НаСервереБезКонтекста?

Процедура &НаСервере имеет доступ к данным формы (реквизитам, элементам) и может их изменять. Процедура &НаСервереБезКонтекста работает быстрее и дешевле по ресурсам, но не видит данные формы — всё необходимое нужно передавать через параметры. Для вычислений, не требующих данных формы, предпочтителен второй вариант.