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

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

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

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

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

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

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

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

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

Модули объектов (справочников, документов, регистров) содержат код, связанный с данными объекта: обработчики проведения, заполнения, проверки. Модули форм отвечают за поведение интерфейса: обработчики событий элементов, команд, открытия формы. Модуль приложения и модуль сеанса исполняются при старте системы.

Как создать общий модуль: пошагово

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

Создание общего модуля
  1. 1
    Откройте конфигуратор и дерево конфигурации
  2. 2
    Перейдите в ветку «Общие» → «Общие модули»
  3. 3
    Добавьте новый модуль и задайте имя, например РаботаСДокументами
  4. 4
    В свойствах установите флаги: «Сервер» — для работы с данными, «Вызов сервера» — если модуль вызывается с клиента
  5. 5
    Напишите процедуры и функции в тексте модуля
  6. 6
    Проверьте синтаксис: Конфигурация → Проверка конфигурации
  7. 7
    Запустите режим предприятия и вызовите код для проверки

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

Структура кода: процедуры, функции, директивы

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

bsl
Функция ПолучитьСуммуДокумента(СсылкаНаДокумент) Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ СУММА(Т.Сумма) КАК Сумма ИЗ Документ.Реализация.Товары КАК Т ГДЕ Т.Ссылка = &Ссылка";
	Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
	Результат = Запрос.Выполнить().Выбрать();
	Если Результат.Следующий() Тогда
		Возврат Результат.Сумма;
	Иначе
		Возврат 0;
	КонецЕсли;

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

В модулях форм перед каждым методом указывается директива компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Директива определяет, где код исполняется. Работа с базой данных (запросы, обращение к объектам) возможна только на сервере — попытка выполнить её на клиенте вызовет ошибку компиляции или исполнения.

Клиент и сервер: правила взаимодействия

Управляемое приложение 1С разделяет исполнение кода: клиент отвечает за интерфейс, сервер — за данные. Вызов сервера с клиента — это сетевой обмен, поэтому частые серверные вызовы в цикле резко замедляют работу. Собирайте данные на клиенте и передавайте на сервер одним вызовом.

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

Где размещать код

&НаСервере / серверный общий модуль

Запросы к базе, проведение, расчёты по данным. Нет доступа к элементам формы и диалогам.

&НаКлиенте / клиентский модуль

Реакция на действия пользователя, диалоги, работа с файлами на компьютере пользователя. Нет доступа к базе напрямую.

&НаСервереБезКонтекста

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

Модуль объекта: обработчики событий

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

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

Отладка и проверка модуля

После написания кода включите отладку: Отладка → Начать отладку, предварительно разрешив её в свойствах конфигурации или через параметр сервера. Установите точку останова клавишей F9 на нужной строке, выполните действие в режиме предприятия и проверьте значения переменных через табло (Shift+F9).

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

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

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

Синтаксическая проверка
Норма

Ошибок и предупреждений нет

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

Сообщения о необъявленных переменных или недоступных методах

Вызов функции из нужного контекста
Норма

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

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

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

Поведение в отладчике
Норма

Значения переменных соответствуют ожиданиям на каждом шаге

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

Переменные пусты или содержат неожиданные типы данных

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

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

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

Итог

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

Выбирайте вид модуля по месту исполнения логики, разделяйте клиентский и серверный код, экспортируйте нужные методы, проверяйте синтаксис и отлаживайте код до переноса в рабочую базу. Типовые модули дорабатывайте через расширения.

Частые вопросы

Чем процедура отличается от функции в 1С?

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

Где писать код, который нужен и на клиенте, и на сервере?

Создайте общий модуль с флагами «Клиент» и «Сервер» либо вынесите общую логику в модуль с директивой &НаКлиентеНаСервереБезКонтекста в форме. Учтите: в таком коде нельзя обращаться к базе данных и к контексту формы.

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

Чаще всего метод не помечен словом Экспорт, имя написано с опечаткой или общий модуль не скомпилирован в нужном контексте (например, серверный модуль вызывается с клиента без флага «Вызов сервера»). Проверьте эти три причины по порядку.

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

Существует среда разработки EDT на базе Eclipse, где конфигурация хранится в виде файлов проекта и поддерживается контроль версий. Для небольших доработок достаточно конфигуратора, для командной разработки удобнее EDT.

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

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

Что такое модуль менеджера и когда он нужен?

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