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

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

Как работает форма 1С: устройство, события и практика настройки

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

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

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

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

Виды форм и когда какая используется

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

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

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

Управляемые и обычные формы

Управляемая форма

Стандарт для всех новых конфигураций. Работает в тонком, веб- и мобильном клиенте. Логика делится на клиентскую и серверную части.

Обычная форма

Встречается в старых решениях. Точная разметка, но только толстый клиент и нет веб-доступа. Развивать такие формы не рекомендуется.

Автогенерируемая форма

Платформа строит сама по метаданным. Подходит, когда достаточно типового вида, и экономит время разработки.

Из чего состоит форма: реквизиты, элементы, команды

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

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

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

Жизненный цикл формы: от создания до закрытия

Когда пользователь открывает документ, платформа выполняет последовательность шагов. Сначала на сервере вызывается обработчик ПриСозданииНаСервере — здесь форма получает параметры открытия, читается объект из базы и можно программно настроить видимость элементов. Затем форма передаётся на клиент, и срабатывает ПриОткрытии — первое событие, доступное на клиенте.

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

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

Порядок открытия формы объекта
  1. 1
    Платформа получает команду открытия и параметры (ссылка, режим, отбор)
  2. 2
    На сервере создаётся форма, вызывается ПриСозданииНаСервере — здесь читаются данные и настраивается интерфейс
  3. 3
    Форма сериализуется и передаётся на клиент
  4. 4
    На клиенте вызывается ПриОткрытии — доступны интерактивные действия и оповещения
  5. 5
    Пользователь работает с формой; каждое изменение данных может инициировать серверные вызовы
  6. 6
    При закрытии срабатывает ПередЗакрытием, затем форма уничтожается

Клиент-серверное взаимодействие: главное ограничение управляемых форм

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

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

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

События элементов и интерактивная логика

Помимо событий самой формы, у каждого элемента есть свои обработчики. У поля ввода чаще всего используются ПриИзменении, НачалоВыбора и ОбработкаВыбора. У табличной части — ПриИзменении, ПередУдалением, ПриОкончанииРедактирования. Через них реализуется пересчёт сумм, подбор значений и контроль ввода.

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

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

Практическая настройка формы в конфигураторе

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

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

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

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

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

Открытие формы
Норма

Форма открывается без ошибок, данные объекта отображены

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

Ошибка в ПриСозданииНаСервере или пустые поля при существующем объекте

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

Открытие и редактирование без заметных пауз

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

Задержки при каждом изменении поля — признак лишних серверных вызовов

Запись объекта
Норма

Запись проходит, связанные действия выполняются после получения ссылки

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

Ошибки «объект не найден» — логика сработала до записи

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

Форма выглядит и работает так же, как в тонком клиенте

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

Съехавшая разметка или недоступные вызовы — использованы неподдерживаемые возможности

Типичные ошибки и ограничения

Большинство проблем с формами сводится к нескольким повторяющимся сценариям. Их знание экономит часы отладки, потому что симптомы часто неочевидны: форма «просто не работает», а причина — в нарушении клиент-серверной модели.

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

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

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

Как выбрать подход к доработке формы

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

Как выбрать действие

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

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

Чем отличается контекстный серверный вызов от внеконтекстного?

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

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

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

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

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

Почему изменения в расширении не видны у пользователей?

Чаще всего расширение не подключено в базе или подключено с отключённым флагом «Используется». Проверьте список расширений в режиме предприятия, а также роли и профили безопасности. После подключения расширения пользователям обычно требуется перезапустить сеанс.

Как программно закрыть форму и вернуть результат?

Используйте метод Закрыть() с параметром — переданное значение получит форма-владелец через ОбработкаВыбора или описание оповещения, указанное при открытии. Это стандартный способ организовать выбор значения из вспомогательной формы.

Что делать, если форма зависает при открытии?

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

Итог

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

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