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

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

Модуль 1С: что это такое и как с ним работать

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

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

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

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

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

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

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

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

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

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

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

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

Общие модули: флаги и правила размещения кода

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

Поведение общего модуля определяют его свойства-флаги. От них зависит, где компилируется и выполняется код:

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

Типовая практика — разделять модули по исполнению: отдельно серверные (например, РасчетыСервер), отдельно клиентские (РасчетыКлиент). Смешивание клиентского и серверного кода в одном модуле приводит к лишним вызовам сервера и замедляет работу форм.

Модули формы и модули объекта: где писать обработчики

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

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

Как выбрать: форма, объект или общий модуль

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

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

Куда поместить код

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

Как создать процедуру и вызвать её из другого модуля

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

Порядок действий
  1. 1
    В конфигураторе откройте ветку «Общие модули» и добавьте новый модуль, например РасчетыСервер.
  2. 2
    В свойствах модуля установите флаги «Сервер» и «Вызов сервера».
  3. 3
    Напишите в модуле экспортную функцию с ключевым словом Экспорт, возвращающую результат расчёта.
  4. 4
    Обновите конфигурацию базы данных (F7), иначе вызов завершится ошибкой.
  5. 5
    В форме документа создайте серверную или клиентскую процедуру и вызовите функцию по имени: РасчетыСервер.РассчитатьСкидку(Сумма).
  6. 6
    Проверьте результат в режиме предприятия на тестовом документе.

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

bsl
// Общий модуль РасчетыСервер (Сервер, Вызов сервера)
Функция РассчитатьСкидку(СуммаДокумента) Экспорт
	Если СуммаДокумента > 100000 Тогда
		Возврат СуммаДокумента * 0.1;
	Иначе
		Возврат 0;
	КонецЕсли;
КонецФункции

// Вызов из модуля формы документа:
// Скидка = РасчетыСервер.РассчитатьСкидку(Объект.СуммаДокумента);

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

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

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

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

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

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

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

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

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

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

Ошибка «метод не обнаружен» — проверьте Экспорт и обновление конфигурации БД

Место исполнения кода
Норма

Запросы выполняются в серверных процедурах, интерфейсная логика — в клиентских

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

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

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

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

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

Проверка работает только из формы — она размещена не в модуле объекта

Модули в типовых конфигурациях: как ориентироваться

В типовых решениях (1С:Бухгалтерия, Управление торговлей, ЗУП) сотни общих модулей согласованно именуются. Распространённая схема именования: ИмяПодсистемы для серверной логики, ИмяПодсистемыКлиент для клиентской, ИмяПодсистемыВызовСервера для серверных процедур, доступных с клиента, ИмяПодсистемыПереопределяемый для кода, который предполагается менять под внедрение.

Найти, где выполняется нужное действие, помогает глобальный поиск по конфигурации (Ctrl+Shift+F в конфигураторе). Например, чтобы понять, как документ рассчитывает итог, ищут по имени процедуры из обработчика проведения и спускаются по цепочке вызовов. Отладчик (F5, точки останова по F9) позволяет пройти этот путь пошагово и посмотреть значения переменных.

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

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

Итог

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

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

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

Чем модуль отличается от обработки?

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

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

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

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

Экспортные процедуры модуля объекта доступны через сам объект: сначала создают или получают объект (например, методом СоздатьДокумент или ПолучитьОбъект у ссылки), затем вызывают его метод. Напрямую по имени модуля, как общий модуль, обратиться нельзя.

Что такое директивы &НаКлиенте и &НаСервере в модуле формы?

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

Как доработать типовой модуль, не потеряв изменения при обновлении?

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

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

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