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