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