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

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

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

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

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

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

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

Что такое модуль и как он устроен

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

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

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

Основные виды модулей и их назначение

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

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

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

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

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

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

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

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

Модуль объекта и модуль менеджера: логика данных

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

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

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

Модуль формы: поведение интерфейса

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

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

Порядок действий при добавлении обработчика в форму
  1. 1
    Откройте форму объекта в конфигураторе и выберите нужный элемент или событие формы
  2. 2
    В палитре свойств найдите событие (например, «ПриИзменении») и нажмите кнопку открытия — платформа создаст заготовку обработчика в модуле формы
  3. 3
    Выберите директиву исполнения: &НаКлиенте для реакции интерфейса, &НаСервере для работы с данными
  4. 4
    Реализуйте логику и проверьте форму в режиме предприятия на тестовой базе

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

Выбор места для кода определяется тремя вопросами: откуда код будет вызываться, какие данные ему нужны и где он должен исполняться — на клиенте или сервере.

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

Как выбрать действие

Код нужен в нескольких объектах или формахСоздайте общий модуль с подходящими флагами (Сервер / Клиент) и экспортными процедурами
Логика относится к записи и проведению конкретного документаРазместите обработчики в модуле объекта этого документа
Нужно отреагировать на действие пользователя в интерфейсеИспользуйте модуль формы с директивами &НаКлиенте и &НаСервере
Требуется операция над видом объектов целиком (печать, создание)Добавьте экспортную функцию в модуль менеджера объекта
Нужно выполнить действие при старте системы или входе пользователяИспользуйте модуль приложения или модуль сеанса

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

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

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

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

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

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

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

Компиляция модуля в конфигураторе
Норма

Ошибок нет, все обращения к процедурам разрешаются

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

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

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

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

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

Ошибка при вызове либо код молча не выполняется

Поведение при записи объекта разными способами
Норма

Проверки срабатывают и из формы, и при обмене, и из обработки

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

Проверка работает только при интерактивной записи — логика сидит в форме

Скорость работы формы
Норма

Форма реагирует на ввод без видимых задержек

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

Каждое изменение поля вызывает паузу — лишние серверные вызовы

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

Итог

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

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

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

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

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

Чем модуль объекта отличается от модуля формы того же документа?

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

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

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

Когда стоит использовать расширение вместо изменения модулей конфигурации?

Когда конфигурация типовая и планируется её обновление. Расширение позволяет добавить свои общие модули и переопределить обработчики, не трогая код поставщика, поэтому обновления проходят без ручного сопоставления изменений.

Нужно ли программировать в модулях, чтобы пользоваться 1С?

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

Что такое подписка на событие и зачем она, если есть модуль объекта?

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