Разработка и Конфигурация · 13 мин
Модуль 1С: что это такое и как с ним работать
Что такое модуль в 1С: виды модулей (общие, формы, объекта, приложения), где хранится код, как создать и вызвать процедуру. Практические примеры и разбор ошибок.
Модуль в 1С — это контейнер для программного кода на встроенном языке платформы. Любая логика в конфигурации — расчёт итогов документа, проверка заполнения полей, формирование отчёта — написана внутри какого-либо модуля. Без модулей конфигурация представляла бы собой только структуру данных: справочники, документы и регистры без единой строчки поведения.
Термин «модуль» используется в двух смыслах, что часто путает новичков. В узком смысле это текст программы, привязанный к объекту конфигурации — например, модуль документа или модуль формы. В широком смысле «модулем» называют целый функциональный блок конфигурации: «модуль зарплаты», «модуль обмена данными». Ниже речь идёт о первом значении — о программных модулях как месте размещения кода.
Понимание устройства модулей нужно не только разработчикам. Внедренцу это помогает быстро найти, где происходит расчёт, бухгалтеру со знанием основ — понять, почему программа ведёт себя именно так, администратору — грамотно поставить задачу программисту и проверить результат.
Что такое модуль и где он хранится
Физически модуль — это текстовый фрагмент внутри конфигурации, а не отдельный файл на диске. Открыть его можно в конфигураторе: у большинства объектов в дереве конфигурации есть контекстное меню или кнопки перехода к модулям. При выгрузке конфигурации в файлы каждый модуль становится отдельным файлом с расширением bsl, что удобно для систем контроля версий.
Внутри модуля размещаются процедуры и функции. Процедура выполняет действия и ничего не возвращает, функция обязана вернуть значение через оператор Возврат. Кроме того, в модуле может быть раздел объявления переменных и раздел основной программы — код, который выполняется при инициализации модуля.
Контекст выполнения — ключевое понятие. Одна и та же процедура может работать на компьютере пользователя (толстый или тонкий клиент, веб-клиент) или на сервере 1С. От этого зависит, какие данные ей доступны: например, запросы к базе данных в клиент-серверном режиме выполняются только на сервере.
Основные виды модулей в конфигурации
Платформа предоставляет несколько видов модулей, и каждый предназначен для своей задачи. Неправильный выбор места для кода — одна из самых частых причин ошибок «метод не обнаружен» или лишних серверных вызовов.
| Вид модуля | Где находится | Для чего предназначен |
|---|---|---|
| Общий модуль | Ветка «Общие модули» в дереве конфигурации | Процедуры и функции, вызываемые из разных мест конфигурации |
| Модуль формы | Внутри конкретной формы объекта | Обработчики событий формы и её элементов, вспомогательные процедуры формы |
| Модуль объекта | У справочника, документа и других прикладных объектов | Обработчики событий объекта: запись, проведение, заполнение |
| Модуль менеджера | У прикладных объектов | Логика, работающая с объектом как с типом: создание, печать, начальное заполнение |
| Модуль приложения | Корень конфигурации | Обработчики старта и завершения системы, глобальные переменные клиента |
| Модуль сеанса | Корень конфигурации | Код, выполняемый один раз при установке сеанса, например установка параметров сеанса |
| Модуль команды | У команды объекта или общей команды | Действие при выполнении команды интерфейса |
Чаще всего разработчик работает с общими модулями, модулями форм и модулями объектов. Модули приложения и сеанса в типовых конфигурациях уже заполнены, и менять их без необходимости не стоит — это усложнит обновление.
Общие модули: флаги и правила размещения кода
Общий модуль — основное место для переиспользуемого кода. Если одна и та же проверка нужна и в документе, и в обработке, её выносят в общий модуль, а не копируют. Создать общий модуль можно через дерево конфигурации: правый клик на ветке «Общие модули» → «Добавить».
Поведение общего модуля определяют его свойства-флаги. От них зависит, где компилируется и выполняется код:
- Сервер — код выполняется на сервере, доступны запросы и все серверные возможности;
- Клиент (обычное приложение) и Клиент (управляемое приложение) — код выполняется на стороне пользователя;
- Вызов сервера — разрешает обращаться к серверному модулю с клиента; без этого флага вызов завершится ошибкой;
- Привилегированный режим — код выполняется без проверки прав доступа, что нужно для служебных операций;
- Глобальный — процедуры модуля доступны без указания имени модуля; применять следует редко, чтобы не загрязнять глобальное пространство имён.
Типовая практика — разделять модули по исполнению: отдельно серверные (например, РасчетыСервер), отдельно клиентские (РасчетыКлиент). Смешивание клиентского и серверного кода в одном модуле приводит к лишним вызовам сервера и замедляет работу форм.
Модули формы и модули объекта: где писать обработчики
Модуль формы содержит обработчики событий формы: ПриОткрытии, ПриСозданииНаСервере, обработчики нажатий кнопок и изменений полей. В управляемых формах код жёстко разделён директивами компиляции: &НаКлиенте и &НаСервере. Процедура с директивой &НаКлиенте не может напрямую выполнить запрос к базе — для этого она вызывает серверную процедуру той же формы или общего модуля.
Модуль объекта отвечает за поведение самого объекта при записи и проведении. Здесь размещают обработчики ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения. Важно понимать: модуль объекта выполняется на сервере, и обратиться из него к элементам формы нельзя — форма и объект живут в разных контекстах.
Как выбрать: форма, объект или общий модуль
Простое правило помогает принять решение. Если код управляет тем, что видит пользователь на экране, — это модуль формы. Если код гарантирует корректность данных при любой записи — модуль объекта. Если код нужен в нескольких местах или не привязан к конкретному объекту — общий модуль.
Куда поместить код
Как создать процедуру и вызвать её из другого модуля
Разберём минимальный рабочий сценарий: вынесем расчёт скидки в общий модуль и вызовем его из формы документа. Это типовая задача, на которой удобно понять механику.
- 1В конфигураторе откройте ветку «Общие модули» и добавьте новый модуль, например РасчетыСервер.
- 2В свойствах модуля установите флаги «Сервер» и «Вызов сервера».
- 3Напишите в модуле экспортную функцию с ключевым словом Экспорт, возвращающую результат расчёта.
- 4Обновите конфигурацию базы данных (F7), иначе вызов завершится ошибкой.
- 5В форме документа создайте серверную или клиентскую процедуру и вызовите функцию по имени: РасчетыСервер.РассчитатьСкидку(Сумма).
- 6Проверьте результат в режиме предприятия на тестовом документе.
Ключевое слово Экспорт делает процедуру видимой извне. Без него процедура доступна только внутри своего модуля — это удобно для вспомогательных функций, которые не должны вызываться снаружи.
// Общий модуль РасчетыСервер (Сервер, Вызов сервера)
Функция РассчитатьСкидку(СуммаДокумента) Экспорт
Если СуммаДокумента > 100000 Тогда
Возврат СуммаДокумента * 0.1;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
// Вызов из модуля формы документа:
// Скидка = РасчетыСервер.РассчитатьСкидку(Объект.СуммаДокумента);Обращение к процедуре общего модуля строится по шаблону ИмяМодуля.ИмяПроцедуры(Параметры). Если модуль глобальный, имя модуля можно опустить, но так делать стоит осознанно: глобальные имена могут конфликтовать при обновлении типовой конфигурации.
Типичные ошибки при работе с модулями
Большинство проблем у начинающих связано не с синтаксисом, а с непониманием контекста исполнения. Ошибка «Процедура или функция с указанным именем не определена» почти всегда означает одно из трёх: нет слова Экспорт, модуль недоступен в данном контексте (например, серверный вызывается с клиента без флага «Вызов сервера») или конфигурация базы данных не обновлена.
Отдельного внимания заслуживает вопрос доработки типовых конфигураций. Прямая правка модулей типовой конфигурации снимает её с полной поддержки и усложняет обновление. Современный подход — расширения конфигурации: они позволяют добавить свои модули и переопределить обработчики, не меняя типовой код.
Как проверить результат
Код выполняется, возвращается ожидаемое значение
Ошибка «метод не обнаружен» — проверьте Экспорт и обновление конфигурации БД
Запросы выполняются в серверных процедурах, интерфейсная логика — в клиентских
Клиентская процедура пытается выполнить запрос — ошибка в клиент-серверном режиме
Проверки срабатывают и при записи через форму, и при программной записи
Проверка работает только из формы — она размещена не в модуле объекта
Модули в типовых конфигурациях: как ориентироваться
В типовых решениях (1С:Бухгалтерия, Управление торговлей, ЗУП) сотни общих модулей согласованно именуются. Распространённая схема именования: ИмяПодсистемы для серверной логики, ИмяПодсистемыКлиент для клиентской, ИмяПодсистемыВызовСервера для серверных процедур, доступных с клиента, ИмяПодсистемыПереопределяемый для кода, который предполагается менять под внедрение.
Найти, где выполняется нужное действие, помогает глобальный поиск по конфигурации (Ctrl+Shift+F в конфигураторе). Например, чтобы понять, как документ рассчитывает итог, ищут по имени процедуры из обработчика проведения и спускаются по цепочке вызовов. Отладчик (F5, точки останова по F9) позволяет пройти этот путь пошагово и посмотреть значения переменных.
Прежде чем писать свою процедуру, поищите готовую в общих модулях типовой конфигурации по ключевым словам задачи. Типовые модули уже учитывают права, особенности обменов и обновлений — повторное использование надёжнее собственной реализации с нуля.
Для чтения чужого кода полезно помнить про модули менеджеров: типовая логика создания объектов, печатных форм и начального заполнения часто находится именно там, а не в модуле объекта. Если обработчик в модуле объекта пуст, это не значит, что логики нет — она может быть вынесена в общий модуль подсистемы.
Что важно запомнить
Модуль — это место хранения кода в конфигурации. Вид модуля определяет контекст исполнения: форма отвечает за интерфейс, объект — за целостность данных, общий модуль — за переиспользуемую логику. Экспорт, флаги исполнения и обновление конфигурации БД — три вещи, которые проверяют при ошибке «метод не обнаружен». Типовые модули лучше не править напрямую, а расширять.
Частые вопросы о модулях 1С
Чем модуль отличается от обработки?
Модуль — это часть конфигурации, хранящая код. Обработка — самостоятельный прикладной объект со своими формами, макетами и модулями; она может быть встроена в конфигурацию или существовать как внешний epf-файл. У обработки внутри тоже есть модули: формы и объекта.
Почему возникает ошибка «Процедура или функция не определена», хотя код написан?
Чаще всего причины три: у процедуры нет ключевого слова «Экспорт», конфигурация базы данных не обновлена после изменений (нужно нажать F7), либо вызов идёт из контекста, где модуль недоступен — например, серверный общий модуль вызывается с клиента без флага «Вызов сервера».
Можно ли вызвать процедуру модуля объекта извне?
Экспортные процедуры модуля объекта доступны через сам объект: сначала создают или получают объект (например, методом СоздатьДокумент или ПолучитьОбъект у ссылки), затем вызывают его метод. Напрямую по имени модуля, как общий модуль, обратиться нельзя.
Что такое директивы &НаКлиенте и &НаСервере в модуле формы?
Это указания компилятору, где должна выполняться процедура управляемой формы. Клиентский код работает с интерфейсом, но не имеет прямого доступа к базе данных. Серверный код может выполнять запросы и обращаться к данным объекта. Клиентская процедура вызывает серверную явно, и такой вызов — обращение к серверу, поэтому их стараются минимизировать.
Как доработать типовой модуль, не потеряв изменения при обновлении?
Используйте расширение конфигурации: оно позволяет добавлять собственные общие модули и переопределять обработчики типовых форм и объектов с помощью аннотаций «Вместо», «Перед», «После». Прямая правка типового кода — крайняя мера, она требует ручного переноса изменений при каждом обновлении.
Чем модуль приложения отличается от модуля сеанса?
Модуль сеанса выполняется один раз при установке соединения с информационной базой, до запуска приложения, и обычно устанавливает параметры сеанса. Модуль приложения работает на клиенте и содержит обработчики старта и завершения работы пользователя, а также глобальные клиентские переменные.