Работа с формами в 1С:Предприятие 8.3 — одна из ключевых задач для разработчиков и администраторов системы. Новые формы требуются для расширения функционала, улучшения пользовательского интерфейса или адаптации программы под специфические бизнес-процессы. Однако процесс их создания и открытия часто вызывает вопросы, особенно у новичков: где найти конструктор форм, как правильно написать код для вызова, и почему форма может не открываться despite корректных настроек?
В этой статье мы разберём все этапы — от создания формы в конфигураторе до её программного открытия с передачей параметров. Вы узнаете, как работать с управляемыми и обычными формами, какие ошибки чаще всего допускают разработчики, и как избежать типичных проблем. Материал актуален для последних версий платформы 1С:Предприятие 8.3 (включая 8.3.23 и новее), но основные принципы применимы и к более ранним релизам.
Особое внимание уделим программному открытию форм с передачей контекста — это критично для интеграции новых элементов в существующие бизнес-процессы. Также рассмотрим нюансы работы с формами в тонком клиенте, веб-клиенте и мобильном приложении, где ограничения платформы могут влиять на поведение интерфейса.
1. Типы форм в 1С: чем управляемые формы отличаются от обычных
Прежде чем создавать новую форму, важно понять, какой её тип подходит для вашей задачи. В 1С:Предприятие 8.3 существуют два основных типа форм:
- 📄 Обычные формы — унаследованы из ранних версий платформы (8.2 и ранее). Они работают только в толстом клиенте, имеют ограниченные возможности по адаптации под разные устройства и менее гибкие в плане программного управления. Используются преимущественно для поддержки устаревших конфигураций.
- 🎛️ Управляемые формы — современный стандарт, поддерживаемый во всех типах клиентов (тонкий, веб, мобильный). Позволяют динамически изменять интерфейс в зависимости от прав пользователя, разрешения экрана и других параметров. Рекомендуются для новых разработок.
Основные различия между типами форм:
| Критерий | Обычные формы | Управляемые формы |
|---|---|---|
| Поддержка клиентов | Только толстый клиент | Тонкий, веб, мобильный, толстый |
| Адаптивность | Ограниченная | Гибкая (подстраивается под разрешение) |
| Программное управление | Через свойства и методы формы | Через серверные и клиентские процедуры |
| Производительность | Выше (работает локально) | Зависит от типа клиента |
Для большинства современных задач рекомендуется использовать управляемые формы. Они не только универсальнее, но и лучше интегрируются с новыми механизмами платформы, такими как БСП (Библиотека стандартных подсистем) или Расширения конфигурации. Однако если вы поддерживаете устаревшую конфигурацию или работаете с толстым клиентом, обычные формы могут быть оправданны.
2. Создание новой формы в конфигураторе: пошаговая инструкция
Чтобы открыть новую форму, её сначала нужно создать в конфигураторе. Рассмотрим процесс на примере управляемой формы для документа ЗаказПокупателя:
- Откройте конфигуратор в режиме
1С:Предприятие(с правами администратора). - В дереве объектов конфигурации найдите раздел
Документы→ЗаказПокупателя. - Кликните правой кнопкой по документу и выберите
Создать форму→Управляемая форма. - В открывшемся окне укажите имя формы (например,
ФормаЗаказаПокупателяРасширенная) и нажмитеОК.
После создания откроется конструктор формы, где вы можете:
- 🔧 Добавлять элементы управления (поля ввода, кнопки, таблицы) из палитры инструментов.
- 📋 Настраивать свойства элементов (видимость, доступность, привязку к данным).
- 💻 Писать обработчики событий (например,
ПриИзменениидля поля илиПередЗаписьюдля формы).
Важно: если вы создаёте форму для справочника или документа, она автоматически привязывается к объекту метаданных. Для независимых форм (например, для отчётов или обработок) используйте раздел Общие формы в дереве конфигурации.
☑️ Подготовка к созданию формы
3. Программное открытие формы: основные методы
После создания формы её нужно открыть программно. В 1С:Предприятие 8.3 для этого используются разные подходы в зависимости от типа формы и контекста вызова.
3.1. Открытие управляемой формы
Для управляемых форм применяется метод ОткрытьФорму() с указанием имени формы и параметров. Пример для формы документа:
Процедура ОткрытьФормуЗаказа(Заказ)
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Ключ", Заказ.Ссылка);
ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры
Ключевые моменты:
- 🔑
ПараметрыФормы— структура, через которую передаются данные в форму (например, ссылка на документ или фильтры). - 📌 Имя формы указывается в формате
"ТипОбъекта.ИмяОбъекта.ИмяФормы". - 🔄 Для модального открытия используйте параметр
РежимОткрытияФормы.БлокироватьОкноВладельца.
3.2. Открытие обычной формы
Для обычных форм используется метод ПолучитьФорму() с последующим вызовом Открыть():
Процедура ОткрытьОбычнуюФормуЗаказа(Заказ)
Форма = ПолучитьФорму("Документ.ЗаказПокупателя.ФормаОбъекта");
Форма.Объект = Заказ;
Форма.Открыть();
КонецПроцедуры
Обратите внимание: обычные формы требуют явного указания объекта (Форма.Объект = Заказ), тогда как управляемые формы получают его через параметры.
Если форма не открывается, проверьте права пользователя на объект (документ, справочник) — даже с корректным кодом отсутствие прав может блокировать доступ.
4. Передача параметров в форму и работа с ними
Одна из самых распространённых задач — передача данных в форму при её открытии. Например, вы можете захотеть открыть форму документа с предзаполненными полями или передать в неё контекст выполнения (например, текущего клиента).
Для этого используется структура ПараметрыФормы, которая передаётся вторым аргументом в метод ОткрытьФорму(). Пример с передачей нескольких параметров:
Процедура ОткрытьФормуСПараметрами()
Параметры = Новый Структура();
Параметры.Вставить("Клиент", Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка"));
Параметры.Вставить("ДатаНачала", ТекущаяДата());
Параметры.Вставить("Режим", "Просмотр");
ОткрытьФорму("Документ.ЗаказПокупателя.ФормаСоздания", Параметры);
КонецПроцедуры
Чтобы получить переданные параметры внутри формы, используйте свойство Параметры в обработчике ПриСозданииНаСервере():
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Клиент") Тогда
Объект.Контрагент = Параметры.Клиент;
КонецЕсли;
Если Параметры.Свойство("ДатаНачала") Тогда
Объект.Дата = Параметры.ДатаНачала;
КонецЕсли;
КонецПроцедуры
Типичные ошибки при работе с параметрами:
- 🚫 Забывают проверить существование параметра (
Параметры.Свойство("Имя")), что приводит к ошибке, если параметр не передан. - 🔄 Путают серверный и клиентский контекст — обработка параметров должна происходить на сервере (
ПриСозданииНаСервере). - 📝 Передают сложные объекты (например, таблицы значений) без сериализации, что может вызвать ошибки в веб-клиенте.
Как передать таблицу значений в форму?
Для передачи таблицы значений в форму её необходимо преобразовать в массив структур или использовать механизм временного хранилища (ПоместитьВоВременноеХранилище()). Пример:
Таблица = Новый ТаблицаЗначений();
Таблица.Колонки.Добавить("Товар");
Таблица.Колонки.Добавить("Количество");
МассивДляПередачи = Новый Массив();
Для Каждого Строка Из Таблица Цикл
МассивДляПередачи.Добавить(Новый Структура("Товар,Количество", Строка.Товар, Строка.Количество));
КонецЦикла;
Параметры.Вставить("Товары", МассивДляПередачи);
5. Открытие формы из другой формы: взаимодействие между формами
Часто требуется открыть новую форму из уже открытой, например, при нажатии на кнопку в форме документа. В этом случае важно правильно организовать взаимодействие, чтобы передать контекст и обработать результат.
Пример: открытие формы справочника Номенклатура из формы документа ЗаказПокупателя с возвратом выбранного товара:
Процедура КнопкаВыбратьТоварНажатие(Элемент)
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("Владелец", ЭтаФорма);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, ЭтаФорма, , ,
Новый ДействиеПриЗакрытии("ПослеВыбораТовара"));
КонецПроцедуры
Процедура ПослеВыбораТовара(ВыбранныйТовар, ДополнительныеПараметры) Экспорт
Если ВыбранныйТовар <> Неопределено Тогда
Объект.Товары.Добавить();
Объект.Товары[Объект.Товары.Количество()-1].Номенклатура = ВыбранныйТовар;
КонецЕсли;
КонецПроцедуры
Ключевые моменты:
- 🔗 Параметр
Владелецпозволяет получить доступ к форме-владельцу из дочерней формы. - 🔄
ДействиеПриЗакрытии— обработчик, который срабатывает после закрытия дочерней формы и передаёт результат. - 📌 Для модального открытия используйте параметр
РежимОткрытияФормы.БлокироватьОкноВладельца.
Если вам нужно открыть форму без возврата данных (например, справочную информацию), достаточно использовать простой вызов ОткрытьФорму() без обработчика закрытия.
Для взаимодействия между формами всегда используйте механизм ДействиеПриЗакрытии — это гарантирует корректную передачу данных даже при асинхронной работе в веб-клиенте.
6. Типичные ошибки и их решение
При работе с формами в 1С разработчики часто сталкиваются с типичными проблемами. Рассмотрим наиболее распространённые из них и способы их устранения.
⚠️ Внимание: Если форма не открывается в веб-клиенте, проверьте, что все используемые ею объекты (справочники, документы) имеют права на чтение для текущего пользователя. В веб-клиенте ошибки прав доступа могут проявляться иначе, чем в толстом клиенте.
| Ошибка | Возможная причина | Решение |
|---|---|---|
| Форма не открывается без ошибок | Не хватает прав на объект | Проверьте роли пользователя в конфигураторе |
| Параметры не передаются в форму | Ошибка в имени параметра или контексте | Используйте Параметры.Свойство("Имя") для проверки |
| Форма открывается пустой | Не указан объект формы (для обычных форм) | Явно присвойте объект: Форма.Объект = СсылкаНаОбъект |
| Ошибка "Не найден метод" при открытии | Опечатка в имени формы или метода | Проверьте регистр и полное имя формы в конфигураторе |
| Форма открывается, но не отображает данные | Не вызван метод ЗагрузитьДанные() |
Добавьте вызов в ПриОткрытии() |
Ещё одна частая проблема — зависание формы при открытии. Это может происходить из-за:
- 🐢 Длительных операций в обработчике
ПриСозданииНаСервере()(например, сложные запросы к базе). - 🔄 Рекурсивного открытия форм (форма А открывает форму Б, которая снова открывает форму А).
- 📡 Проблем с сетевым подключением в веб-клиенте.
Для диагностики используйте журнал регистрации (Администрирование → Журнал регистрации) и отладчик 1С (Отладка → Начать отладку).
7. Оптимизация работы с формами: советы для разработчиков
Чтобы формы в 1С работали быстро и стабильно, следуйте этим рекомендациям:
- ⚡ Минимизируйте код в
ПриСозданииНаСервере(): переносите тяжелые операции в фоновые задания или используйте отложенную загрузку данных. - 🗃️ Используйте кэширование: если форма часто открывается с одними и теми же параметрами, кэшируйте результаты запросов.
- 🔄 Разделяйте логику: серверные процедуры должны обрабатывать данные, клиентские — только интерфейс.
- 📱 Тестируйте в разных клиентах: форма может работать в толстом клиенте, но тормозить в веб-версии.
Пример оптимизированного кода для загрузки данных в форму:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Загружаем только основные данные, остальное - по требованию
Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда
Объект.Контрагент = ПолучатьКонтрагентаПоУмолчанию();
КонецЕсли;
// Отложенная загрузка табличной части
ЗапланироватьВыполнение(Новый ОписаниеОперации("ЗагрузитьТовары", ЭтаФорма));
КонецПроцедуры
Процедура ЗагрузитьТовары(Форма) Экспорт
Объект.Товары.Загрузить();
КонецПроцедуры
Также обратите внимание на размер формы: если в ней слишком много элементов, это может замедлить её открытие. Используйте вкладки (ПолеВводаСКнопкой) или динамическое отображение элементов в зависимости от ролей пользователя.
Для ускорения работы форм в веб-клиенте отключайте ненужные элементы управления через свойство Видимость в зависимости от контекста.
8. Работа с формами в расширениях конфигурации
Если вы разрабатываете расширение конфигурации, открытие новых форм имеет свои нюансы. В расширениях нельзя напрямую изменять существующие формы основной конфигурации, но можно создавать свои и подменять стандартные.
Пример создания формы в расширении:
- В конфигураторе откройте ваше расширение.
- Добавьте новую форму в разделе
Общие → Формы. - В свойствах формы укажите
ОсновнаяФорма(если подменяете стандартную). - Напишите код для открытия формы из модуля расширения:
Процедура ОткрытьРасширеннуюФормуЗаказа(Заказ)
Параметры = Новый Структура();
Параметры.Вставить("Объект", Заказ);
// Открываем форму из расширения
ОткрытьФорму("Расширение1.ОбщаяФорма.ФормаЗаказаРасширенная", Параметры);
КонецПроцедуры
Важно: при работе с расширениями:
- 🔧 Используйте префиксы для имён форм (например,
Расширение1_ФормаЗаказа), чтобы избежать конфликтов. - 📌 Проверяйте совместимость с основной конфигурацией — изменения в базовой форме могут сломать ваше расширение.
- 🔄 Тестируйте на разных версиях платформы, так как механизм расширений эволюционирует.
⚠️ Внимание: В расширениях нельзя переопределять формы, помеченные как Платформенные (например, формы встроенных отчётов). Попытка сделать это приведёт к ошибке при обновлении конфигурации.
FAQ: Ответы на частые вопросы
Как открыть форму без правки конфигурации?
Если у вас нет доступа к конфигуратору, вы можете создать внешнюю обработку с формой и открывать её через меню Файл → Открыть. Также можно использовать механизм Дополнительные отчёты и обработки, если он подключён в вашей конфигурации.
Почему форма открывается медленно?
Чаще всего это связано с:
- Большим количеством элементов на форме (оптимизируйте макет).
- Сложными запросами в
ПриСозданииНаСервере()(перенесите их в фоновые задания). - Работой в веб-клиенте с большими объёмами данных (используйте постраничную загрузку).
Для диагностики включите профилировщик производительности в конфигураторе (Сервис → Профилировщик).
Можно ли открыть форму из другой базы 1С?
Да, но для этого требуется использовать COM-соединение или HTTP-сервисы. Пример через COM:
Подключение = Новый COMОбъект("V83.ComConnector");
Соединение = Подключение.Connect("File=""C:\Bases\Base1"";Usr=""Администратор"";");
Форма = Соединение.ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта");
Обратите внимание: этот метод работает только в толстом клиенте и требует настроек безопасности.
Как закрыть форму программно?
Для закрытия текущей формы используйте метод Закрыть():
ЭтаФорма.Закрыть();
Если нужно закрыть форму из другой формы, используйте ссылку на объект формы:
Владелец.Закрыть();
Для управляемых форм можно также использовать ЗакрытьССообщением(), чтобы передать результат:
ЭтаФорма.ЗакрытьССообщением(Новый СообщениеПользователю("Данные сохранены"));
Как сделать форму модальной?
Для модального открытия формы используйте параметр РежимОткрытияФормы.БлокироватьОкноВладельца:
ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта", , , , ,
РежимОткрытияФормы.БлокироватьОкноВладельца);
В веб-клиенте модальные окна могут работать иначе — тестируйте поведение в разных браузерах.