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