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

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

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

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

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

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

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

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

Модуль формы доступен только в конфигураторе. Чтобы открыть его, найдите нужный объект в дереве конфигурации (например, справочник «Номенклатура» или документ «Заказ клиента»), разверните ветку «Формы», выберите конкретную форму и нажмите «Открыть». В редакторе формы перейдите на вкладку «Модуль» в нижней части окна — там и находится код.

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

Отдельный случай — внешние обработки и отчёты. У них модуль формы хранится внутри файла.epf или.erf, и открыть его можно через меню «Файл → Открыть» с последующим переходом к форме обработки.

Устройство модуля: обработчики событий и собственные процедуры

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

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

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

Как добавить обработчик события
  1. 1
    Откройте форму в конфигураторе и выделите форму целиком или нужный элемент
  2. 2
    В палитре свойств найдите раздел «События» и выберите нужное событие
  3. 3
    Нажмите кнопку с лупой — платформа создаст заготовку процедуры в модуле
  4. 4
    Допишите логику внутри процедуры и сохраните конфигурацию
  5. 5
    Запустите режим предприятия и проверьте срабатывание обработчика

Директивы компиляции: &НаКлиенте, &НаСервере и их комбинации

Главная особенность модуля управляемой формы — директивы компиляции, которые указывают платформе, в каком контексте компилировать и исполнять процедуру. Директива &НаКлиенте означает выполнение на компьютере пользователя: здесь доступны интерактивные действия, работа с файлами, диалоги. Директива &НаСервере означает выполнение на сервере 1С: здесь доступны запросы к базе данных, обращения к прикладным объектам, привилегированный режим.

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

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

Выбор директивы компиляции

&НаКлиенте

Интерактив, файлы, предупреждения пользователю. Нет доступа к запросам и объектам БД напрямую.

&НаСервере

Запросы, чтение и запись объектов, доступ к реквизитам формы. Дорогой вызов из клиента.

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

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

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

Простые универсальные функции без обращения к БД и интерфейсу. Самые жёсткие ограничения.

Практический пример: код модуля формы

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

УстановитьВидимостьЭлементов();

КонецПроцедуры

&НаКлиенте

Процедура КоличествоПриИзменении(Элемент)

ПересчитатьСуммуСтроки();

КонецПроцедуры

&НаКлиенте

Процедура ПересчитатьСуммуСтроки()

Строка = Элементы.Товары.ТекущиеДанные;

Если Строка <> Неопределено Тогда

Строка.Сумма = Строка.Количество * Строка.Цена;

КонецЕсли;

КонецПроцедуры

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

Функция ПолучитьЦенуНоменклатуры(Номенклатура, Дата)

// запрос к регистру сведений с ценами

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

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

bsl
&НаКлиенте
Процедура КомандаЗаполнить(Команда)
	ЗаполнитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНаСервере()
	// обращение к данным объекта
КонецПроцедуры

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

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

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

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

Модуль формы и другие модули: как выбрать место для кода

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

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

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

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

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

Как проверить работу кода модуля формы

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

Для тонких клиентских сценариев без сервера достаточно файловой базы с включённой отладкой.

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

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

Срабатывание обработчика
Норма

Точка останова в процедуре останавливает выполнение при нужном действии

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

Точка не срабатывает — проверьте имя обработчика и привязку события в палитре свойств

Контекст выполнения
Норма

Серверная процедура вызывается из клиентской и возвращает результат

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

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

Производительность формы
Норма

Форма открывается и реагирует без заметных пауз

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

Задержки при каждом действии — ищите серверные вызовы в циклах

Частые вопросы о модуле формы

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

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

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

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

Можно ли вызвать процедуру модуля одной формы из другой формы?

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

Что такое вызов сервера «без контекста» и когда он нужен?

Это серверная процедура с директивой &НаСервереБезКонтекста, которой не передаются данные формы. Такой вызов дешевле, потому что платформа не сериализует всю форму. Используйте его, когда процедуре достаточно параметров-значений, а реквизиты формы не нужны.

Почему обработчик события не срабатывает, хотя код написан?

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

Где должен находиться код заполнения табличной части?

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

Итог

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

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