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

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

Как сделать модуль в 1С: пошаговое руководство

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

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

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

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

Виды модулей в 1С и где им место

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

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

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

Создание общего модуля: пошагово

Откройте конфигуратор и разверните дерево конфигурации. Найдите ветку «Общие», внутри неё — «Общие модули». Кликните правой кнопкой мыши и выберите «Добавить». Платформа создаст пустой объект и откроет палитру свойств.

Задайте имя модуля. Имя должно быть осмысленным и отражать назначение: РаботаСКонтрагентами, РасчетСкидок, ОбменДаннымиКлиент. Избегайте имён вида Модуль1 — через месяц никто, включая вас, не вспомнит, что там лежит. Синоним заполните человекочитаемым названием, он отображается в интерфейсе.

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

После настройки свойств закройте палитру и дважды кликните по модулю — откроется редактор кода. Здесь и пишется вся логика.

Настройка флагов: сервер, клиент, вызов сервера

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

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

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

Написание процедур и функций

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

Пример простого серверного модуля с экспортной функцией:

Функция ПолучитьСтавкуНДС(Организация, Дата) Экспорт

// Запрос к регистру сведений с учётными данными

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| УчетнаяПолитика.СтавкаНДС КАК Ставка

|ИЗ

| РегистрСведений.УчетнаяПолитика.СрезПоследних(&Дата, Организация = &Организация) КАК УчетнаяПолитика";

Запрос.УстановитьПараметр("Дата", Дата);

Запрос.УстановитьПараметр("Организация", Организация);

Результат = Запрос.Выполнить();

Если Результат.Пустой() Тогда

Возврат Неопределено;

КонецЕсли;

Выборка = Результат.Выбрать();

Выборка.Следующий();

Возврат Выборка.Ставка;

КонецФункции

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

Вызов кода модуля из других объектов

Обращение к экспортным методам общего модуля выполняется по схеме ИмяМодуля.ИмяМетода(Параметры). Никаких дополнительных объявлений не требуется — платформа разрешает имена на этапе компиляции. Например, из модуля документа можно написать: Ставка = РасчетНалоговСервер.ПолучитьСтавкуНДС(Организация, Дата);

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

Если при вызове возникает ошибка «Процедура или функция с указанным именем не определена», проверьте три вещи: написано ли имя без опечаток, стоит ли Экспорт у метода и совпадает ли контекст компиляции модуля с контекстом вызова.

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

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

Сохранение конфигурации
Норма

Конфигурация сохраняется без ошибок синтаксиса

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

Окно ошибок с указанием строки модуля

Вызов из внешнего кода
Норма

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

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

«Процедура или функция не определена» — проверьте Экспорт и флаги контекста

Работа в режиме Предприятия
Норма

Функция отрабатывает, данные корректны

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

Ошибка прав доступа — проверьте роли и привилегированный режим

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

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

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

Частые ошибки и ограничения

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

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

FAQ

Можно ли создать модуль без конфигуратора?

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

Чем общий модуль отличается от внешней обработки?

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

Почему функция из модуля не видна в режиме Предприятия?

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

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

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

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

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

Что такое модуль с повторным использованием значений?

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

Итог

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

Общий модуль создаётся в ветке «Общие → Общие модули», требует корректных флагов контекста (Сервер, Клиент, Вызов сервера) и ключевого слова Экспорт у публичных методов. Вызов — по схеме ИмяМодуля.ИмяМетода(). Код одного объекта держите в его модуле, переиспользуемую логику — в общих модулях, типовые модули меняйте через расширения.