Разработка и Конфигурация · 12 мин
Для чего нужен модуль в 1С и как правильно выбрать место для кода
Зачем нужен модуль в 1С: виды модулей конфигурации, где хранится код, чем общий модуль отличается от модуля объекта и как выбрать правильное место для процедур.
Модуль в 1С — это контейнер для программного кода на встроенном языке платформы. Любая логика, которая выходит за рамки типового поведения конфигурации: расчёт скидки, проверка заполнения реквизитов, формирование печатной формы, обмен данными, — пишется именно в модулях. Без модулей конфигурация остаётся набором объектов с настройками по умолчанию, и ни одно осмысленное действие пользователя не будет обработано так, как требует бизнес.
Практическая проблема начинающего разработчика обычно не в синтаксисе языка, а в вопросе «куда положить код». В 1С существует около десятка видов модулей, у каждого свой контекст исполнения: одни работают только на сервере, другие на клиенте, третьи привязаны к конкретному объекту или форме. Код, размещённый не в том модуле, либо вообще не выполнится, либо будет работать медленно и с ошибками доступа к данным.
Ниже разобрано, какие виды модулей существуют, чем они отличаются, как выбрать правильный модуль под конкретную задачу и какие ошибки при размещении кода встречаются чаще всего.
Что такое модуль и как он устроен
Модуль состоит из трёх зон: раздела описания переменных, раздела процедур и функций и раздела основной программы (кода, который выполняется при инициализации модуля). На практике основная часть — это процедуры и функции: именованные блоки кода, которые вызываются из других модулей, из обработчиков событий или напрямую платформой.
Ключевое понятие — контекст исполнения. Модуль формы знает про реквизиты и элементы этой формы, модуль объекта — про данные конкретного документа или справочника, общий модуль не привязан ни к чему и доступен отовсюду. Попытка обратиться к реквизиту формы из общего модуля закончится ошибкой компиляции, потому что контексты не пересекаются.
Вторая важная характеристика — директивы компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Они указывают платформе, где должен исполняться код. От этого зависит, какие данные доступны и какие объекты можно использовать: например, запросы к базе данных выполняются только на сервере.
Основные виды модулей и их назначение
Платформа 1С:Предприятие 8 предоставляет несколько видов модулей, каждый под свой класс задач. Понимание различий — основа грамотной архитектуры доработок.
| Вид модуля | Где находится | Для чего нужен |
|---|---|---|
| Общий модуль | Ветка «Общие модули» конфигурации | Процедуры и функции, вызываемые из любых мест конфигурации |
| Модуль объекта | Внутри документа, справочника, отчёта и т.д. | Логика самого объекта: заполнение, проверка, обработка проведения |
| Модуль формы | Внутри формы объекта | Реакция на действия пользователя, работа с элементами формы |
| Модуль менеджера | Внутри объекта метаданных | Операции над коллекцией объектов: создание, печать, подбор |
| Модуль приложения | Корень конфигурации | Обработчики старта и завершения системы |
| Модуль сеанса | Корень конфигурации | Инициализация параметров сеанса, разграничение прав |
| Модуль команды | Внутри команды интерфейса | Действие при нажатии команды: открыть форму, вызвать обработку |
Чаще всего разработчик работает с тремя видами: общими модулями, модулями объектов и модулями форм. Остальные задействуются точечно — например, модуль сеанса нужен, когда при входе пользователя требуется вычислить параметры доступа.
Общий модуль: где хранить переиспользуемый код
Общий модуль — основной инструмент для кода, который нужен в нескольких местах. Если одна и та же проверка контрагента требуется и в документе реализации, и в заказе, и в отчёте, её выносят в общий модуль и вызывают отовсюду. Это избавляет от дублирования: исправление вносится в одном месте.
У общего модуля есть важные свойства, которые задаются в палитре свойств конфигуратора:
- Сервер — модуль исполняется на сервере, может выполнять запросы и обращаться к базе данных;
- Клиент (управляемое приложение) — исполняется на клиенте, доступны диалоги и работа с файлами пользователя;
- Вызов сервера — разрешает вызывать серверный модуль с клиента; без этого флага клиентский код не увидит серверные процедуры;
- Привилегированный режим — код выполняется без проверки прав доступа; применяют осторожно и только для служебных операций.
Экспортные процедуры и функции (с ключевым словом Экспорт) видны извне, остальные — только внутри модуля. Принято выносить в экспорт только осознанный программный интерфейс, а вспомогательные функции оставлять приватными: так проще сопровождать код.
Модуль объекта и модуль менеджера: логика данных
Модуль объекта исполняется в контексте конкретной записи: документа, элемента справочника, набора записей регистра. Здесь размещают обработчики событий жизненного цикла объекта — ОбработкаЗаполнения, ПередЗаписью, ОбработкаПроверкиЗаполнения, ОбработкаПроведения. Если нужно, чтобы при проведении документа формировались движения по регистрам, код пишется именно в обработчике проведения модуля объекта.
Модуль менеджера работает не с одним объектом, а с типом в целом. Типичные задачи: функция печати для всего вида документов, создание объекта по шаблону, получение представления. Платформа вызывает модуль менеджера, например, когда пользователь запускает печать из списка документов.
Простое правило выбора: логика «что происходит с этим документом» — в модуль объекта, логика «что можно сделать с документами этого вида» — в модуль менеджера. Смешение приводит к путанице и затрудняет поиск кода при сопровождении.
Модуль формы: поведение интерфейса
Модуль формы отвечает за всё, что видит и нажимает пользователь: обработчики нажатия кнопок, изменение полей, открытие и закрытие формы, условное оформление. В управляемых формах код делится директивами на клиентский и серверный, и это принципиально: на клиенте нельзя выполнить запрос к базе, на сервере нельзя показать диалог или предупреждение.
Типовой сценарий: пользователь меняет значение поля на клиенте, клиентский обработчик вызывает серверную процедуру для пересчёта данных, результат возвращается и отображается. Каждый такой вызов — обращение к серверу, поэтому частые «походы» на сервер при каждом нажатии клавиши заметно тормозят форму. Пересчёты, не требующие данных базы, стараются выполнять на клиенте.
- 1Откройте форму объекта в конфигураторе и выберите нужный элемент или событие формы
- 2В палитре свойств найдите событие (например, «ПриИзменении») и нажмите кнопку открытия — платформа создаст заготовку обработчика в модуле формы
- 3Выберите директиву исполнения: &НаКлиенте для реакции интерфейса, &НаСервере для работы с данными
- 4Реализуйте логику и проверьте форму в режиме предприятия на тестовой базе
Как выбрать правильный модуль для задачи
Выбор места для кода определяется тремя вопросами: откуда код будет вызываться, какие данные ему нужны и где он должен исполняться — на клиенте или сервере.
Как выбрать действие
При сомнениях полезно посмотреть, как устроена типовая конфигурация: в типовых решениях 1С переиспользуемая логика вынесена в общие модули с говорящими именами (например, модули с суффиксами «Сервер», «Клиент», «ВызовСервера»), а модули объектов содержат только специфику самого объекта. Повторение этой структуры в собственных доработках упрощает обновление и сопровождение.
Типичные ошибки при работе с модулями
Отдельно стоит упомянуть изменение модулей типовой конфигурации напрямую. При обновлении такие правки конфликтуют с изменениями поставщика и требуют ручного сопоставления. Предпочтительные варианты — расширения конфигурации, подписки на события и собственные общие модули: они переживают обновления без вмешательства.
Как проверить, что код размещён правильно
Как проверить результат
Ошибок нет, все обращения к процедурам разрешаются
Сообщения «Процедура или функция не обнаружена» или «Переменная не определена»
У общего модуля включены флаги «Сервер» и «Вызов сервера», вызов выполняется
Ошибка при вызове либо код молча не выполняется
Проверки срабатывают и из формы, и при обмене, и из обработки
Проверка работает только при интерактивной записи — логика сидит в форме
Форма реагирует на ввод без видимых задержек
Каждое изменение поля вызывает паузу — лишние серверные вызовы
Практический приём — трассировка в отладчике: поставьте точку останова в модуле и проверьте, попадает ли туда выполнение при ожидаемом действии. Если обработчик не вызывается, почти всегда причина в неправильно выбранном событии или в том, что код размещён не в том модуле.
Что важно запомнить
Модуль — это место хранения кода, а вид модуля определяет контекст и место исполнения. Переиспользуемую логику выносят в общие модули, логику объекта — в его модуль, реакции интерфейса — в модуль формы. Правильный выбор модуля избавляет от ошибок компиляции, дублирования и проблем при обновлении.
Частые вопросы о модулях в 1С
Можно ли вызвать процедуру одного общего модуля из другого?
Да, если процедура объявлена с ключевым словом Экспорт и модули совместимы по месту исполнения. Серверный модуль может вызывать другой серверный, клиентский — клиентский. Вызов серверного модуля из клиентского возможен только при включённом флаге «Вызов сервера».
Чем модуль объекта отличается от модуля формы того же документа?
Модуль объекта работает с данными документа и срабатывает при любой записи — из формы, обмена или программно. Модуль формы отвечает только за поведение интерфейса и выполняется, пока форма открыта. Проверки корректности данных надёжнее размещать в модуле объекта.
Что означает ошибка «Процедура или функция с указанным именем не определена»?
Чаще всего вызываемая процедура не экспортная, находится в модуле с несовместимым контекстом (например, клиентский код обращается к серверному модулю без «Вызова сервера») или в имени допущена опечатка. Проверьте наличие слова Экспорт и свойства общего модуля.
Когда стоит использовать расширение вместо изменения модулей конфигурации?
Когда конфигурация типовая и планируется её обновление. Расширение позволяет добавить свои общие модули и переопределить обработчики, не трогая код поставщика, поэтому обновления проходят без ручного сопоставления изменений.
Нужно ли программировать в модулях, чтобы пользоваться 1С?
Для работы пользователя — нет: типовые конфигурации поставляются с готовой логикой. Навыки работы с модулями нужны разработчику или внедренцу, когда требуется доработать поведение системы под специфику компании.
Что такое подписка на событие и зачем она, если есть модуль объекта?
Подписка на событие — механизм, который вызывает обработчик из общего модуля при событиях объектов (например, «ПередЗаписью») без изменения модулей самих объектов. Это удобно для сквозных проверок сразу для многих видов документов и для доработок типовых конфигураций.