Разработка и Конфигурация · 10 мин
Как сделать модуль в 1С: пошаговое руководство
Как создать общий модуль в 1С: виды модулей, настройка флагов, написание процедур и функций, вызов из других объектов, типичные ошибки и проверка результата.
Модуль в 1С — это контейнер программного кода на встроенном языке платформы. Практически каждый объект конфигурации имеет свой модуль, а для переиспользуемой логики существуют общие модули. Понимание того, какой модуль где живёт и когда выполняется, — базовый навык, без которого невозможно ни доработать типовую конфигурацию, ни написать собственную.
Чаще всего под фразой «сделать модуль» подразумевают создание общего модуля: отдельного объекта в дереве конфигурации, процедуры и функции которого доступны из любого места программы. Именно этот сценарий разобран ниже пошагово, а также рассмотрены модули объектов, форм и менеджеров — чтобы вы могли выбрать правильное место для своего кода.
Работать потребуется в конфигураторе. Перед любыми изменениями в рабочей базе сделайте выгрузку информационной базы или хотя бы сохраните конфигурацию в файл — откатить неудачную правку без копии будет сложно.
Виды модулей в 1С и где им место
Платформа 1С:Предприятие 8 размещает код в нескольких типах модулей, и выбор правильного — половина задачи. Общий модуль подходит для логики, которая нужна в разных объектах: расчёты, проверки, работа со строками и датами. Модуль объекта (справочника, документа) хранит обработчики событий самого объекта — ПередЗаписью, ПриЗаписи, ОбработкаПроведения.
Модуль формы содержит код, привязанный к интерфейсу: обработчики нажатий кнопок, изменения полей, события ПриСозданииНаСервере. Модуль менеджера объекта отвечает за операции с коллекцией объектов — например, печатные формы и обработку получения данных выбора. Модуль приложения и модуль сеанса выполняются при старте системы и при установке соединения.
Если сомневаетесь, куда положить код, применяйте простое правило: логика одного объекта — в модуль объекта, логика формы — в модуль формы, всё, что вызывается из двух и более мест, — в общий модуль.
Создание общего модуля: пошагово
Откройте конфигуратор и разверните дерево конфигурации. Найдите ветку «Общие», внутри неё — «Общие модули». Кликните правой кнопкой мыши и выберите «Добавить». Платформа создаст пустой объект и откроет палитру свойств.
Задайте имя модуля. Имя должно быть осмысленным и отражать назначение: РаботаСКонтрагентами, РасчетСкидок, ОбменДаннымиКлиент. Избегайте имён вида Модуль1 — через месяц никто, включая вас, не вспомнит, что там лежит. Синоним заполните человекочитаемым названием, он отображается в интерфейсе.
- 1Откройте конфигуратор и ветку «Общие → Общие модули»
- 2Нажмите «Добавить», задайте имя и синоним
- 3Установите флаги: Сервер, Клиент (обычное приложение), Клиент (управляемое приложение), Вызов сервера — по необходимости
- 4Напишите процедуры и функции, экспортные — с ключевым словом Экспорт
- 5Сохраните конфигурацию (F7) и обновите конфигурацию базы данных при необходимости
- 6Проверьте вызов: ИмяМодуля.ИмяФункции() из нужного места кода
После настройки свойств закройте палитру и дважды кликните по модулю — откроется редактор кода. Здесь и пишется вся логика.
Настройка флагов: сервер, клиент, вызов сервера
Флаги в свойствах общего модуля определяют контекст исполнения кода, и ошибки здесь — самая частая причина сообщений «Процедура или функция не обнаружена». Флаг «Сервер» означает, что модуль компилируется на сервере 1С и может обращаться к базе данных напрямую. Флаги «Клиент (управляемое приложение)» и «Клиент (обычное приложение)» делают код доступным на клиенте.
Флаг «Вызов сервера» разрешает обращаться к серверному модулю с клиента. Без него клиентский код просто не увидит серверные процедуры. Флаг «Привилегированный режим» отключает проверку прав доступа — используйте его осознанно, только для служебных операций, иначе создадите дыру в безопасности.
Принятое в типовых конфигурациях соглашение: серверные модули называют без суффикса или с суффиксом «Сервер», клиентские — с суффиксом «Клиент», модули повторного использования — «ПовтИсп». Следование этому соглашению сильно упрощает чтение чужого кода.
Написание процедур и функций
Внутри модуля код организуется в процедуры и функции. Процедура выполняет действия и не возвращает значение, функция обязательно возвращает результат через оператор Возврат. Чтобы процедура или функция была видна снаружи модуля, после её заголовка добавьте ключевое слово Экспорт — без него метод останется приватным и доступным только внутри модуля.
Пример простого серверного модуля с экспортной функцией:
Функция ПолучитьСтавкуНДС(Организация, Дата) Экспорт
// Запрос к регистру сведений с учётными данными
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| УчетнаяПолитика.СтавкаНДС КАК Ставка
|ИЗ
| РегистрСведений.УчетнаяПолитика.СрезПоследних(&Дата, Организация = &Организация) КАК УчетнаяПолитика";
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Организация", Организация);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ставка;
КонецФункции
Обратите внимание на обработку пустого результата: если данных нет, функция возвращает Неопределено, а вызывающий код должен это учитывать. Игнорирование таких проверок — типичный источник ошибок «Попытка приведения значения» в рабочих базах.
Вызов кода модуля из других объектов
Обращение к экспортным методам общего модуля выполняется по схеме ИмяМодуля.ИмяМетода(Параметры). Никаких дополнительных объявлений не требуется — платформа разрешает имена на этапе компиляции. Например, из модуля документа можно написать: Ставка = РасчетНалоговСервер.ПолучитьСтавкуНДС(Организация, Дата);
Из модуля формы управляемого приложения вызов серверной функции делается так же, но помните о директивах компиляции. Обработчики формы помечаются &НаКлиенте, &НаСервере или &НаСервереБезКонтекста. Клиентский обработчик может вызвать серверный общий модуль, только если у того стоит флаг «Вызов сервера».
Если при вызове возникает ошибка «Процедура или функция с указанным именем не определена», проверьте три вещи: написано ли имя без опечаток, стоит ли Экспорт у метода и совпадает ли контекст компиляции модуля с контекстом вызова.
Как проверить результат
Конфигурация сохраняется без ошибок синтаксиса
Окно ошибок с указанием строки модуля
Метод находится, код выполняется, возвращается ожидаемое значение
«Процедура или функция не определена» — проверьте Экспорт и флаги контекста
Функция отрабатывает, данные корректны
Ошибка прав доступа — проверьте роли и привилегированный режим
Модули объектов и форм: когда нужны они
Не всякий код стоит выносить в общий модуль. Если логика относится к жизненному циклу конкретного объекта — например, проверка заполнения табличной части документа перед проведением, — её место в модуле объекта. Откройте нужный документ в конфигураторе, перейдите на вкладку «Прочее» и нажмите «Модуль объекта». Там доступны предопределённые обработчики: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения.
Модуль формы открывается из редактора формы кнопкой с изображением модуля или через контекстное меню. В нём размещают обработчики интерактивных событий: изменение поля, нажатие команды, выбор значения. Помните, что модуль формы живёт, пока открыта форма, — общее состояние в нём хранить нельзя.
Частые ошибки и ограничения
Отдельно стоит упомянуть доработку типовых конфигураций. Прямое изменение типовых общих модулей затрудняет обновление: при каждом апдейте придётся вручную сливать изменения. Предпочтительные варианты — создать свой общий модуль и вызывать его из расширения конфигурации или использовать механизм расширений с аннотациями &После, &Перед, &Вместо.
FAQ
Можно ли создать модуль без конфигуратора?
Нет, создание объектов конфигурации, включая общие модули, возможно только в конфигураторе. В режиме Предприятия можно создавать лишь внешние обработки и отчёты, которые тоже содержат модули, но хранятся отдельными файлами.
Чем общий модуль отличается от внешней обработки?
Общий модуль — часть конфигурации, его код доступен всем объектам системы. Внешняя обработка — отдельный файл .epf, который открывают вручную или подключают через механизм дополнительных отчётов и обработок. Для переиспользуемой логики подходит общий модуль, для разовых сервисных операций — обработка.
Почему функция из модуля не видна в режиме Предприятия?
Чаще всего конфигурацию не обновили после изменений: нажмите F7 в конфигураторе и обновите конфигурацию базы данных. Вторая причина — отсутствие Экспорт у метода или несовпадение контекстов (клиент вызывает серверный модуль без флага «Вызов сервера»).
Можно ли хранить данные в переменных общего модуля?
Технически переменные модуля объявить можно, но полагаться на них нельзя: время жизни модуля и моменты повторной инициализации зависят от платформы и режима работы. Для кэширования используйте модули с повторным использованием возвращаемых значений, для данных — базу.
Как изменить типовой модуль, не ломая обновления?
Используйте расширение конфигурации: создайте расширение, заимствуйте нужный модуль и переопределите методы аннотациями &Перед, &После или &Вместо. Либо вынесите свою логику в отдельный общий модуль и вызывайте его из расширения.
Что такое модуль с повторным использованием значений?
Это общий модуль, у которого в свойствах задано повторное использование возвращаемых значений («На время вызова» или «На время сеанса»). Платформа кэширует результаты функций, что ускоряет обращения к неизменяющимся данным — например, к настройкам учётной политики.
Что важно запомнить
Общий модуль создаётся в ветке «Общие → Общие модули», требует корректных флагов контекста (Сервер, Клиент, Вызов сервера) и ключевого слова Экспорт у публичных методов. Вызов — по схеме ИмяМодуля.ИмяМетода(). Код одного объекта держите в его модуле, переиспользуемую логику — в общих модулях, типовые модули меняйте через расширения.