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

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

Для чего нужен модуль формы в 1С

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

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

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

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

Какие задачи решает модуль формы

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

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

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

Структура модуля формы и директивы компиляции

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

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

ДирективаГде выполняетсяЧто доступноКогда применять
&НаКлиентеКлиентское приложениеЭлементы формы, диалоги, файлыРеакция на действия пользователя, интерактив
&НаСервереСервер 1СЗапросы, объекты, реквизиты формыЧтение и расчёт данных с обращением к форме
&НаСервереБезКонтекстаСервер 1СЗапросы, объектыМассовые операции с данными без привязки к форме
&НаКлиентеНаСервереБезКонтекстаОбе стороныТолько переданные параметрыВспомогательные расчёты без обращения к данным

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

Ключевые события формы и порядок их вызова

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

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

Как добавить обработчик события формы
  1. 1
    Откройте форму в конфигураторе и выделите корневой элемент дерева элементов или нужное поле
  2. 2
    В палитре свойств найдите раздел событий и нажмите кнопку с лупой рядом с нужным событием
  3. 3
    Конфигуратор создаст заготовку процедуры в модуле формы с правильной директивой
  4. 4
    Допишите тело процедуры и проверьте результат, запустив форму в режиме предприятия

Клиент-серверное взаимодействие в модуле формы

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

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

bsl
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
    РеквизитыКонтрагента = ПолучитьДанныеКонтрагента(Объект.Контрагент);
    ЗаполнитьЗначенияСвойств(Объект, РеквизитыКонтрагента);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьДанныеКонтрагента(Контрагент)
    Результат = Новый Структура("Договор, АдресДоставки");
    // запрос к справочнику и заполнение структуры
    Возврат Результат;
КонецФункции

Что размещать в модуле формы, а что — в других модулях

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

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

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

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

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

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

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

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

Типичные ошибки
01
Проверки данных в модуле формы — при программной записи объекта они не сработают, переносите контроль в модуль объекта
02
Серверный вызов внутри цикла по строкам табличной части — форма зависает, собирайте данные и вызывайте сервер один раз
03
Диалог Вопрос() в процедуре &НаСервере — код падает с ошибкой, интерактив возможен только на клиенте
04
Дублирование одной функции в модулях нескольких форм — при изменении логики правится одна копия, остальные расходятся

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

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

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

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

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

Синтаксический контроль модуля
Норма

Ошибок нет, директивы расставлены корректно

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

Ошибки обращения к реквизитам формы из бесконтекстных процедур

Открытие формы в режиме предприятия
Норма

Форма открывается, элементы отображаются как задумано

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

Исключение при открытии или лишние видимые поля

Программная запись объекта без формы
Норма

Все проверки и заполнение срабатывают

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

Объект записывается с некорректными данными

Скорость работы формы
Норма

Изменение полей происходит без видимых задержек

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

Подвисания из-за частых серверных вызовов

Вопросы и ответы

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

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

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

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

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

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

Где лучше инициализировать данные: ПриСозданииНаСервере или ПриОткрытии?

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

Нужен ли модуль формы, если форма полностью типовая?

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

Итог

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

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