Разработка и Конфигурация · 12 мин
Модуль формы в 1С: что это и как с ним работать
Модуль формы 1С: что это такое, где находится, как устроен код формы, какие директивы компиляции использовать и как не допустить типичных ошибок разработчика.
Модуль формы в 1С — это контейнер программного кода на встроенном языке, который привязан к конкретной форме объекта конфигурации: справочника, документа, отчёта, обработки или общей формы. В нём описывается логика поведения формы: что происходит при её открытии, при нажатии кнопок, при изменении реквизитов, при записи объекта. Без модуля форма остаётся статичным набором элементов, а с модулем она реагирует на действия пользователя.
Разработчик сталкивается с модулем формы в первый же день работы с управляемым приложением: именно сюда платформа помещает обработчики событий вроде «ПриСозданииНаСервере» и «ПриОткрытии». Понимание устройства этого модуля — где он исполняется, какие директивы компиляции существуют и чем клиентский код отличается от серверного — критично для производительности и стабильности прикладного решения.
Ключевая особенность управляемых форм в том, что один модуль компилируется в нескольких контекстах одновременно: на сервере и на клиенте. Отсюда вытекают главные вопросы практики: какие процедуры где выполняются, как передать данные между контекстами и почему вызов сервера из клиента — дорогая операция, которую нужно минимизировать.
Где находится модуль формы и как его открыть
Модуль формы доступен только в конфигураторе. Чтобы открыть его, найдите нужный объект в дереве конфигурации (например, справочник «Номенклатура» или документ «Заказ клиента»), разверните ветку «Формы», выберите конкретную форму и нажмите «Открыть». В редакторе формы перейдите на вкладку «Модуль» в нижней части окна — там и находится код.
Если у объекта ещё нет формы, её нужно создать: в свойствах объекта нажмите кнопку с лупой у поля «Форма объекта» или «Основная форма», пройдите конструктор формы — и платформа автоматически создаст форму вместе с пустым модулем. Для обычных (неуправляемых) форм модуль открывается аналогично, но структура кода в нём проще, так как нет разделения контекстов.
Отдельный случай — внешние обработки и отчёты. У них модуль формы хранится внутри файла.epf или.erf, и открыть его можно через меню «Файл → Открыть» с последующим переходом к форме обработки.
Устройство модуля: обработчики событий и собственные процедуры
Содержимое модуля формы условно делится на три части. Первая — раздел объявления переменных, где объявляются переменные уровня модуля (в управляемых формах их использование ограничено и требует директивы). Вторая — обработчики событий формы и её элементов: стандартные процедуры с зарезервированными именами, которые платформа вызывает автоматически. Третья — собственные процедуры и функции разработчика, которые вызываются из обработчиков или друг из друга.
К типовым обработчикам событий формы относятся: «ПриСозданииНаСервере» (инициализация данных, заполнение реквизитов формы), «ПриОткрытии» (настройка видимости элементов, проверки на клиенте), «ПередЗаписью» и «ПослеЗаписи» (контроль и действия вокруг записи объекта), «ОбработкаОповещения» (реакция на сообщения от других форм). Обработчики элементов формы привязываются к конкретным кнопкам, полям и таблицам — например, «Нажатие» у команды или «ПриИзменении» у поля ввода.
Правильный способ создать обработчик — не набирать имя вручную, а выбрать событие в палитре свойств формы или элемента. Тогда платформа сама сгенерирует заготовку процедуры с корректной сигнатурой и нужной директивой компиляции, что исключает ошибки несовпадения параметров.
- 1Откройте форму в конфигураторе и выделите форму целиком или нужный элемент
- 2В палитре свойств найдите раздел «События» и выберите нужное событие
- 3Нажмите кнопку с лупой — платформа создаст заготовку процедуры в модуле
- 4Допишите логику внутри процедуры и сохраните конфигурацию
- 5Запустите режим предприятия и проверьте срабатывание обработчика
Директивы компиляции: &НаКлиенте, &НаСервере и их комбинации
Главная особенность модуля управляемой формы — директивы компиляции, которые указывают платформе, в каком контексте компилировать и исполнять процедуру. Директива &НаКлиенте означает выполнение на компьютере пользователя: здесь доступны интерактивные действия, работа с файлами, диалоги. Директива &НаСервере означает выполнение на сервере 1С: здесь доступны запросы к базе данных, обращения к прикладным объектам, привилегированный режим.
Директивы &НаСервереБезКонтекста используются для процедур, которым не нужны данные самой формы — такие вызовы дешевле, потому что платформа не сериализует и не передаёт весь контекст формы на сервер. Если процедуре нужен только объект данных, его передают параметром, а не обращаются к реквизитам формы. Директива &НаКлиентеНаСервереБезКонтекста применяется для универсальных вспомогательных функций, доступных в обоих контекстах, но её возможности ограничены — в таком коде недоступны ни клиентские, ни серверные специфические объекты.
Каждый вызов серверной процедуры из клиентской — это сетевой обмен. Если в цикле обработки таблицы вызывать серверную функцию на каждую строку, форма начнёт заметно тормозить. Правильный подход: собрать данные на клиенте в массив или структуру, передать их одним вызовом на сервер, обработать там целиком и вернуть результат.
Выбор директивы компиляции
Интерактив, файлы, предупреждения пользователю. Нет доступа к запросам и объектам БД напрямую.
Запросы, чтение и запись объектов, доступ к реквизитам формы. Дорогой вызов из клиента.
Серверная логика без данных формы. Дешевле вызова с контекстом, данные передаются параметрами.
Простые универсальные функции без обращения к БД и интерфейсу. Самые жёсткие ограничения.
Практический пример: код модуля формы
Типичный фрагмент модуля формы документа выглядит так: при создании формы на сервере выполняется начальная настройка, при изменении поля на клиенте запускается пересчёт, а тяжёлая операция выносится на сервер без контекста. Ниже — упрощённый, но рабочий образец структуры.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьВидимостьЭлементов();
КонецПроцедуры
&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
ПересчитатьСуммуСтроки();
КонецПроцедуры
&НаКлиенте
Процедура ПересчитатьСуммуСтроки()
Строка = Элементы.Товары.ТекущиеДанные;
Если Строка <> Неопределено Тогда
Строка.Сумма = Строка.Количество * Строка.Цена;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЦенуНоменклатуры(Номенклатура, Дата)
// запрос к регистру сведений с ценами
КонецФункции
Обратите внимание: пересчёт суммы выполнен на клиенте, потому что это простая арифметика и обращение к базе не требуется — выносить его на сервер было бы ошибкой производительности. А получение цены вынесено в серверную функцию без контекста, так как нужен запрос к регистру сведений, недоступный на клиенте.
&НаКлиенте
Процедура КомандаЗаполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
// обращение к данным объекта
КонецПроцедурыОграничения и типичные ошибки при работе с модулем формы
Модуль формы — не место для бизнес-логики, которая может понадобиться вне формы. Если правило расчёта нужно и при интерактивной работе, и при обмене данными, и в фоновом задании, его следует размещать в общем модуле или в модуле объекта, а из формы только вызывать. Дублирование логики в модулях форм — один из самых распространённых источников расхождений в поведении программы.
Ещё одна группа ошибок связана с контекстами: попытка вызвать на клиенте запрос или обратиться к менеджеру справочника приведёт к ошибке компиляции или выполнения. Обратная ситуация — вызов клиентских методов (например, «ПоказатьПредупреждение») из серверной процедуры — также невозможна: сервер не имеет пользовательского интерфейса. Результат серверной обработки нужно возвращать на клиент и уже там показывать пользователю.
Модуль формы и другие модули: как выбрать место для кода
В конфигурации 1С существует несколько видов модулей, и выбор правильного места для кода — вопрос архитектуры. Модуль формы отвечает только за поведение интерфейса: видимость элементов, реакцию на действия пользователя, подготовку данных к отображению. Модуль объекта (документа, справочника) содержит логику самого объекта: обработку проведения, контроль при записи, заполнение по умолчанию — она срабатывает независимо от того, открыта форма или нет.
Общие модули предназначены для переиспользуемого кода: процедур и функций, которые вызываются из разных объектов. Модуль менеджера объекта хранит операции над объектом как над типом — например, создание печатных форм или получение данных для отчётов. Правило простое: если код не зависит от открытой формы, ему не место в модуле формы.
Куда поместить код
Как проверить работу кода модуля формы
Основной инструмент проверки — отладчик конфигуратора. Установите точку останова в нужной строке модуля, запустите отладку (меню «Отладка → Начать отладку»), откройте форму в режиме предприятия и выполните действие, которое должно вызвать обработчик. Отладчик остановится на точке, и вы сможете посмотреть значения переменных через «Вычислить выражение» (Shift+F9) или табло.
Для тонких клиентских сценариев без сервера достаточно файловой базы с включённой отладкой.
Как проверить результат
Точка останова в процедуре останавливает выполнение при нужном действии
Точка не срабатывает — проверьте имя обработчика и привязку события в палитре свойств
Серверная процедура вызывается из клиентской и возвращает результат
Ошибка «Процедура не обнаружена» — проверьте директиву компиляции и видимость (Экспорт)
Форма открывается и реагирует без заметных пауз
Задержки при каждом действии — ищите серверные вызовы в циклах
Частые вопросы о модуле формы
Чем модуль формы отличается от модуля объекта?
Модуль формы отвечает за поведение интерфейса и выполняется только пока форма открыта. Модуль объекта содержит логику самого объекта (обработку проведения, контроль записи) и срабатывает при любых операциях с объектом, включая обмен данными и фоновые задания, когда формы нет вовсе.
Почему серверная процедура не видна из клиентского кода?
Чаще всего причина в отсутствии ключевого слова «Экспорт» в объявлении серверной процедуры. Без него процедура доступна только внутри своего контекста. Также проверьте, что директива компиляции указана корректно и нет ошибок компиляции модуля.
Можно ли вызвать процедуру модуля одной формы из другой формы?
Напрямую — нет, модуль формы недоступен извне. Для взаимодействия форм используются оповещения (Оповестить и обработчик ОбработкаОповещения), передача параметров при открытии формы или вынос общей логики в общий модуль.
Что такое вызов сервера «без контекста» и когда он нужен?
Это серверная процедура с директивой &НаСервереБезКонтекста, которой не передаются данные формы. Такой вызов дешевле, потому что платформа не сериализует всю форму. Используйте его, когда процедуре достаточно параметров-значений, а реквизиты формы не нужны.
Почему обработчик события не срабатывает, хотя код написан?
Типичные причины: процедура создана вручную и не привязана к событию в палитре свойств, имя процедуры не совпадает с привязкой, либо в параметрах обработчика ошибка. Надёжнее всего пересоздать обработчик через палитру свойств — платформа сама сформирует корректную заготовку.
Где должен находиться код заполнения табличной части?
Если заполнение инициируется кнопкой на форме — команда и клиентский обработчик размещаются в модуле формы, а сама логика заполнения с запросами к базе выносится на сервер. Если заполнение должно работать и без формы (например, при загрузке из обмена), логику размещают в модуле объекта или общем модуле.
Что важно запомнить
Модуль формы — это код поведения конкретной формы, исполняемый в клиентском и серверном контекстах согласно директивам компиляции. Держите в нём только интерфейсную логику, минимизируйте серверные вызовы, а переиспользуемую бизнес-логику выносите в модули объектов и общие модули.