Разработка и Конфигурация · 13 мин
Как работает форма 1С: устройство, события и практика настройки
Как устроена форма 1С: виды форм, жизненный цикл, события, управляемые и обычные формы, основные приёмы настройки и типичные ошибки разработчика.
Форма в 1С — это экранное представление данных, через которое пользователь просматривает и редактирует объекты: документы, справочники, отчёты, обработки. Каждый раз, когда вы открываете карточку контрагента или проводите документ, платформа создаёт форму, заполняет её данными и обрабатывает действия пользователя через систему событий.
Для пользователя форма — просто окно с полями и кнопками. Для разработчика или администратора это объект со сложным жизненным циклом: форма создаётся на сервере, передаётся на клиент, реагирует на события и при закрытии освобождает ресурсы. Понимание этой механики помогает правильно настраивать интерфейс, диагностировать ошибки открытия и писать расширения без конфликтов с типовым кодом.
Материал рассчитан на тех, кто работает с конфигуратором 1С:Предприятие 8.3 и сталкивается с формами либо как разработчик, либо как специалист по внедрению, которому нужно адаптировать типовые экраны под требования заказчика.
Виды форм и когда какая используется
В современных конфигурациях используются управляемые формы, а обычные формы остались в старых решениях и тонком клиенте режима совместимости. Управляемая форма описывается декларативно: разработчик задаёт структуру элементов и реквизитов, а внешний вид платформа строит сама, подстраиваясь под клиентское приложение — тонкий клиент, веб-клиент или мобильную платформу.
Обычная форма, напротив, рисуется разработчиком «вручную»: расположение каждого поля задано координатами. Такой подход даёт точный контроль над внешним видом, но форма работает только в толстом клиенте и не переносится в веб. Поэтому вся новая разработка ведётся на управляемых формах.
По назначению формы делятся на основные типы: форма объекта (карточка элемента справочника или документа), форма списка (таблица записей с отбором и поиском), форма выбора, форма отчёта и произвольные формы обработок. У большинства объектов метаданных эти формы генерируются платформой автоматически — своя форма нужна только тогда, когда стандартного поведения недостаточно.
Управляемые и обычные формы
Стандарт для всех новых конфигураций. Работает в тонком, веб- и мобильном клиенте. Логика делится на клиентскую и серверную части.
Встречается в старых решениях. Точная разметка, но только толстый клиент и нет веб-доступа. Развивать такие формы не рекомендуется.
Платформа строит сама по метаданным. Подходит, когда достаточно типового вида, и экономит время разработки.
Из чего состоит форма: реквизиты, элементы, команды
Управляемая форма состоит из трёх базовых слоёв. Первый — реквизиты формы: данные, которые форма хранит и отображает. Главный реквизит обычно типизирован объектом (например, «ДокументОбъект.РеализацияТоваровУслуг»), а дополнительные реквизиты нужны для служебных полей, таблиц и флагов, которые не сохраняются в базу.
Второй слой — элементы формы: поля ввода, таблицы, кнопки, группы, надписи. Каждый элемент привязан к реквизиту или команде. Важно понимать, что элемент — это только отображение: само значение живёт в реквизите, и программно менять данные нужно через реквизит, а не через элемент.
Третий слой — команды и командный интерфейс. Команды бывают стандартные (записать, провести, закрыть) и свои, созданные разработчиком. Каждой команде назначается обработчик в модуле формы, а кнопка на форме становится лишь визуальным вызовом этой команды.
Жизненный цикл формы: от создания до закрытия
Когда пользователь открывает документ, платформа выполняет последовательность шагов. Сначала на сервере вызывается обработчик ПриСозданииНаСервере — здесь форма получает параметры открытия, читается объект из базы и можно программно настроить видимость элементов. Затем форма передаётся на клиент, и срабатывает ПриОткрытии — первое событие, доступное на клиенте.
При записи объекта цепочка событий длиннее: ПередЗаписью и ПриЗаписи на клиенте, затем серверные ПередЗаписьюНаСервере, ПриЗаписиНаСервере и ПослеЗаписиНаСервере, и наконец клиентское ПослеЗаписи. Знание порядка критично: проверки заполнения логично делать до отправки на сервер, а действия, требующие записанной ссылки, — только после успешной записи.
Завершает жизненный цикл закрытие формы. Если данные были изменены, но не записаны, платформа сама задаст вопрос о сохранении. Обработчик ПередЗакрытием позволяет отменить закрытие программно — например, если не завершена обязательная операция.
- 1Платформа получает команду открытия и параметры (ссылка, режим, отбор)
- 2На сервере создаётся форма, вызывается ПриСозданииНаСервере — здесь читаются данные и настраивается интерфейс
- 3Форма сериализуется и передаётся на клиент
- 4На клиенте вызывается ПриОткрытии — доступны интерактивные действия и оповещения
- 5Пользователь работает с формой; каждое изменение данных может инициировать серверные вызовы
- 6При закрытии срабатывает ПередЗакрытием, затем форма уничтожается
Клиент-серверное взаимодействие: главное ограничение управляемых форм
Ключевая особенность управляемой формы — исполнение кода разделено между клиентом и сервером. Клиент «не видит» базу данных напрямую: любой запрос, вызов объектного метода или обращение к менеджеру объекта требует перехода на сервер. Каждый такой переход — это сетевой вызов, который стоит времени, особенно в веб-клиенте.
Директивы компиляции определяют, где выполняется процедура: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста. Контекстные серверные процедуры имеют доступ к данным формы, но заставляют платформу передавать состояние формы туда и обратно. Внеконтекстные вызовы легче: они получают только переданные параметры, поэтому тяжёлые операции принято выносить именно туда.
Типичная ошибка начинающих — вызывать сервер в цикле: например, для каждой строки таблицы отдельно запрашивать данные из базы. Правильный приём — собрать все нужные параметры на клиенте, один раз вызвать серверную процедуру, выполнить запрос пакетом и вернуть результат.
События элементов и интерактивная логика
Помимо событий самой формы, у каждого элемента есть свои обработчики. У поля ввода чаще всего используются ПриИзменении, НачалоВыбора и ОбработкаВыбора. У табличной части — ПриИзменении, ПередУдалением, ПриОкончанииРедактирования. Через них реализуется пересчёт сумм, подбор значений и контроль ввода.
Для асинхронной логики — вопросов пользователю, открытия диалогов, оповещений — в управляемых формах применяется механизм описаний оповещений: Новый ОписаниеОповещения("ИмяПроцедуры", ЭтотОбъект, ДополнительныеПараметры). Модальные вызовы типа Вопрос() в современном режиме блокируются, поэтому код переписывают на ПоказатьВопрос() с обработчиком результата.
Оповещения между формами — ещё один рабочий инструмент: Оповестить("ЗаписанНовыйЭлемент") из одной формы и обработчик ОбработкаОповещения в другой позволяют, например, обновить список после создания элемента, не открывая его повторно.
Практическая настройка формы в конфигураторе
Чтобы создать свою форму, откройте в конфигураторе объект метаданных, перейдите на закладку «Формы» и добавьте нужный тип. Конструктор предложит выбрать реквизиты для отображения — платформа сама создаст элементы и разместит их в группах. Дальше остаётся настроить порядок, видимость, обязательность заполнения и добавить обработчики.
Для типовых конфигураций предпочтительный путь — расширение конфигурации. Расширение позволяет добавить на форму свои элементы и обработчики, не снимая конфигурацию с поддержки: при обновлении типового решения ваши доработки сохранятся. Ограничение — изменять логику существующих обработчиков можно только через аннотации &Перед, &После и &Вместо.
Проверка результата проста: откройте форму в режиме предприятия, убедитесь, что данные читаются и записываются, события срабатывают в ожидаемом порядке (удобно временно выводить сообщения из обработчиков), а форма корректно отображается в том клиенте, которым пользуются сотрудники — особенно если это веб-клиент.
Как проверить результат
Форма открывается без ошибок, данные объекта отображены
Ошибка в ПриСозданииНаСервере или пустые поля при существующем объекте
Открытие и редактирование без заметных пауз
Задержки при каждом изменении поля — признак лишних серверных вызовов
Запись проходит, связанные действия выполняются после получения ссылки
Ошибки «объект не найден» — логика сработала до записи
Форма выглядит и работает так же, как в тонком клиенте
Съехавшая разметка или недоступные вызовы — использованы неподдерживаемые возможности
Типичные ошибки и ограничения
Большинство проблем с формами сводится к нескольким повторяющимся сценариям. Их знание экономит часы отладки, потому что симптомы часто неочевидны: форма «просто не работает», а причина — в нарушении клиент-серверной модели.
Отдельно стоит помнить об ограничениях платформы: в веб-клиенте недоступна часть функций работы с файловой системой и COM-объектами, в мобильном клиенте — существенная часть интерфейсных возможностей. Если форма проектируется для разных клиентов, проверять её нужно в каждом целевом окружении.
Если форма открывается медленно, первым делом посмотрите ПриСозданииНаСервере: тяжёлые запросы и чтение больших таблиц на старте — самая частая причина. Часто достаточно перенести загрузку второстепенных данных на момент, когда пользователь реально к ним обратится.
Как выбрать подход к доработке формы
Как выбрать действие
Частые вопросы
Чем отличается контекстный серверный вызов от внеконтекстного?
Контекстный вызов (&НаСервере) передаёт на сервер всё состояние формы, поэтому в процедуре доступны реквизиты и элементы, но вызов «тяжелее». Внеконтекстный (&НаСервереБезКонтекста) получает только явно переданные параметры — он быстрее, но работать с данными формы напрямую нельзя, результат нужно возвращать и применять на клиенте.
Почему форма не видит процедуру из общего модуля?
У общего модуля должны быть включены нужные флаги: «Сервер» для серверных вызовов, «Клиент (управляемое приложение)» — для клиентских. Если процедура вызывается с клиента, а модуль серверный, дополнительно нужен флаг «Вызов сервера». Экспортируемость процедуры (слово «Экспорт») тоже обязательна.
Можно ли открыть форму с отбором или параметрами?
Да. Параметры передаются структурой при вызове ОткрытьФорму() или через параметры команды. В форме они доступны в ПриСозданииНаСервере через объект Параметры. Для форм списка так передают отбор, для форм объектов — значения заполнения нового элемента.
Почему изменения в расширении не видны у пользователей?
Чаще всего расширение не подключено в базе или подключено с отключённым флагом «Используется». Проверьте список расширений в режиме предприятия, а также роли и профили безопасности. После подключения расширения пользователям обычно требуется перезапустить сеанс.
Как программно закрыть форму и вернуть результат?
Используйте метод Закрыть() с параметром — переданное значение получит форма-владелец через ОбработкаВыбора или описание оповещения, указанное при открытии. Это стандартный способ организовать выбор значения из вспомогательной формы.
Что делать, если форма зависает при открытии?
Проверьте обработчик ПриСозданииНаСервере: тяжёлые запросы, чтение больших таблиц и вызовы внешних сервисов на старте блокируют открытие. Вынесите загрузку второстепенных данных в фоновое задание или на момент первого обращения, а запросы оптимизируйте по индексам.
Что важно запомнить
Форма 1С — это реквизиты с данными, элементы интерфейса и обработчики событий, разделённые между клиентом и сервером. Правильная работа с формами строится на трёх принципах: минимум серверных вызовов, изменение данных через реквизиты, а не элементы, и доработка типовых форм через расширения, а не прямое редактирование конфигурации.