Работа с формами в 1С:Предприятие 8.3 — одна из самых востребованных задач среди разработчиков. Часто требуется открыть дополнительную форму прямо из текущей: будь то справочник, документ, отчёт или произвольный диалог. Однако неопытные программисты сталкиваются с типичными ошибками: формы не открываются, передаются некорректные параметры, или возникают проблемы с правами доступа. Эта статья поможет разобраться, как правильно организовать взаимодействие между формами, избегая распространённых подводных камней.
Мы рассмотрим три основных способа открытия форм: через метод ОткрытьФорму(), программное создание объекта формы и использование командной панели. Особое внимание уделим передаче параметров, работе в тонком и толстом клиенте, а также нюансам управляемых форм. В конце статьи вы найдёте разбор типичных ошибок и советы по оптимизации кода.
1. Базовый метод: ОткрытьФорму()
Самый универсальный способ открыть форму из другой формы — использовать встроенный метод глобального контекста ОткрытьФорму(). Он работает во всех типах клиентов и поддерживает передачу параметров. Синтаксис метода:
ОткрытьФорму(<ИмяФормы>, <Параметры>, <РежимОткрытия>, <Уникальность>);
Основные параметры метода:
- 📌
<ИмяФормы>— строка с именем формы (например,"Справочник.Номенклатура.Форма.ФормаЭлемента"). Можно использоватьТипВнешнейОбработки()для внешних форм. - 🔧
<Параметры>— структура с данными, которые нужно передать в открываемую форму. Доступны через параметрПараметрыв модуле формы. - 🖥️
<РежимОткрытия>— необязательный параметр для управления модальностью (Неопределено,Независимый,БлокироватьОкно). - 🔄
<Уникальность>— флаг для предотвращения дублирования форм (Ложьпо умолчанию).
Пример открытия формы элемента справочника Номенклатура с передачей отбора:
ПараметрыФормы = Новый Структура("Отбор, РежимРедактирования", Новый Структура("ВидыНоменклатуры", ВидыНоменклатуры.Товар), Ложь);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы, Неопределено, Истина);
⚠️ Внимание: В тонком клиенте методОткрытьФорму()выполняется асинхронно. Если вам нужно дождаться завершения работы формы, используйтеОткрытьФормуМодально()или обрабатывайте событиеПриЗакрытии.
2. Программное создание объекта формы
Для более гибкой работы с формами можно создать объект формы вручную, настроить его свойства и только потом открыть. Этот подход полезен, когда требуется:
- 🎨 Динамически изменять элементы управления до отображения.
- 🔗 Передавать сложные параметры, включая объекты и коллекции.
- 🔒 Контролировать права доступа на уровне формы.
Пример создания и открытия формы документа РеализацияТоваровУслуг:
ФормаДокумента = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента");
ФормаДокумента.Параметры.НовыйДокумент = Истина;
ФормаДокумента.Параметры.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
ФормаДокумента.Открыть();
Ключевое отличие от ОткрытьФорму() — возможность манипулировать свойствами формы до её отображения. Например, можно скрыть ненужные кнопки или изменить заголовок:
ФормаДокумента.ЭлементыФормы.КоманднаяПанель.Видимость = Ложь;
ФормаДокумента.Заголовок = "Новый заказ для " + ФормаДокумента.Параметры.Контрагент.Наименование;
☑️ Подготовка к программному открытию формы
3. Передача параметров между формами
Один из самых частых вопросов — как корректно передать данные из одной формы в другую. Параметры передаются через структуру в метод ОткрытьФорму() или напрямую в объект формы. В принимающей форме они доступны через свойство Параметры.
Типичные ошибки при передаче параметров:
- 🚫 Использование несериализуемых объектов (например,
ДокументОбъектвместо ссылки). - 🔄 Забывают проверять существование параметров в принимающей форме.
- 📦 Передача больших массивов данных, что тормозит открытие формы.
Пример безопасной передачи параметров:
// В исходной форме:
Параметры = Новый Структура;
Параметры.Вставить("ИдентификаторЗаказа", ТекущийДокумент.Ссылка.УникальныйИдентификатор());
Параметры.Вставить("ДатаСоздания", ТекущаяДата());
ОткрытьФорму("Документ.ЗаказПокупателя.Форма.ФормаПечати", Параметры);
// В форме-приёмнике (модуль формы):
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЗначениеЗаполнено(Параметры.ИдентификаторЗаказа) Тогда
ДокументОбъект = Параметры.ИдентификаторЗаказа.ПолучитьОбъект();
ДатаПечати = Параметры.ДатаСоздания;
КонецЕсли;
КонецПроцедуры
⚠️ Внимание: При передаче ссылок на объекты (например, ДокументСсылка.ЗаказПокупателя) убедитесь, что у пользователя есть права на чтение этих объектов. В противном случае форма откроется с ошибкой доступа.
| Тип параметра | Пример значения | Особенности передачи |
|---|---|---|
| Простые типы | 123, "Текст", Истина |
Передаются без ограничений |
| Ссылки на объекты | Справочники.Номенклатура.Ссылка |
Требуют проверки прав доступа |
| Коллекции (Массив, СписокЗначений) | Новый Массив(1, 2, 3) |
Могут тормозить форму при большом объёме |
| Структуры | Новый Структура("Ключ, Значение") |
Удобны для группировки параметров |
| Объекты (ДокументОбъект, СправочникОбъект) | Документы.ЗаказПокупателя.СоздатьДокумент() |
Не рекомендуется передавать напрямую — лучше передавать ссылку и получать объект на сервере |
4. Открытие форм в управляемом приложении
В управляемых формах (тонкий клиент, веб-клиент) есть свои нюансы. Например, нельзя напрямую обращаться к элементам формы из другого модуля. Вместо этого используют:
- 🔗
ПолучитьФорму()+ настройка параметров. - 📋 Команды формы для открытия связанных объектов.
- 🖼️ Клиентские и серверные процедуры для обмена данными.
Пример открытия формы списка справочника Контрагенты с отбором по группе:
Команда = Команды.ОткрытьСписокКонтрагентов();
ПараметрыВыполнения = Новый Структура("Группа", Справочники.ГруппыКонтрагентов.Покупатели);
Команда.Выполнить(ПараметрыВыполнения);
Для создания модальных диалогов в управляемом приложении используют ОткрытьФормуМодально():
Результат = ОткрытьФормуМодально("Обработка.ПодборТоваров.Форма.ФормаОбработки", Параметры);
Если Результат = Неопределено Тогда
Сообщить("Подбор отменён пользователем");
Иначе
// Обработка результата
КонецЕсли;
В управляемых формах избегайте длительных операций в клиентских процедурах. Переносите тяжелую логику на сервер с помощью функции ВыполнитьНаСервере()
5. Распространённые ошибки и их решения
Даже опытные разработчики сталкиваются с проблемами при открытии форм. Вот самые частые ошибки и способы их исправления:
Ошибка 1: Форма не открывается без сообщений
- 🔍 Причина: Неверное имя формы или отсутствие прав.
- ✅ Решение: Проверьте имя формы в конфигураторе (
Все функции → Формы). Убедитесь, что у пользователя есть роль с правом на открытие этой формы.
Ошибка 2: Параметры не передаются
- 🔍 Причина: Ошибка в имени параметра или попытка передать несериализуемый объект.
- ✅ Решение: Используйте
Сообщить(Параметры)в принимающей форме для отладки. Передавайте только ссылки или простые типы.
Ошибка 3: Форма открывается дважды
- 🔍 Причина: Параметр
Уникальностьустановлен вЛожьили двойной вызовОткрытьФорму(). - ✅ Решение: Установите
Уникальность = Истинаили добавьте проверку на существование формы.
Как отладить открытие формы?
1. Включите режим отладки в конфигураторе (Отладка → Начать отладку).
2. Поставьте точку останова в модуле формы на процедуре ПриОткрытии.
3. Проверьте значение Параметры через Сообщить() или отладчик.
4. Убедитесь, что форма не блокируется антивирусом или групповой политикой (актуально для толстого клиента).
6. Оптимизация и лучшие практики
Чтобы код открытия форм был поддерживаемым и эффективным, следуйте этим рекомендациям:
1. Используйте константы для имён форм
Заведите в общем модуле константы с именами часто используемых форм:
Перем ИменаФорм Export;
ИменаФорм.ФормаЭлементаНоменклатура = "Справочник.Номенклатура.Форма.ФормаЭлемента";
ИменаФорм.ФормаСпискаКонтрагентов = "Справочник.Контрагенты.Форма.ФормаСписка";
2. Разделяйте клиентскую и серверную логику
В управляемых формах выносите подготовку параметров на сервер:
Процедура ОткрытьФормуПодбора(Команда)
Параметры = ПодготовитьПараметрыПодбораНаСервере();
ОткрытьФорму(ИменаФорм.ФормаПодбораТоваров, Параметры);
КонецПроцедуры
&НаСервере
Функция ПодготовитьПараметрыПодбораНаСервере()
Параметры = Новый Структура;
Параметры.Вставить("Склад", ТекущийДокумент.Склад);
Параметры.Вставить("Контрагент", ТекущийДокумент.Контрагент);
Возврат Параметры;
КонецФункции
3. Обрабатывайте закрытие формы
Если вам нужно получить данные из закрываемой формы, используйте событие ПриЗакрытии:
Процедура ПриЗакрытии(Отказ, СтандартнаяОбработка)
Если ЗначениеЗаполнено(РезультатФормы) Тогда
ВладелецФормы.ОбработатьРезультатПодбора(РезультатФормы);
КонецЕсли;
КонецПроцедуры
Всегда проверяйте существование параметров в принимающей форме через ЗначениеЗаполнено(). Это предотвратит ошибки, если форма будет открыта без параметров (например, вручную через меню).
FAQ: Частые вопросы по работе с формами в 1С
Можно ли открыть форму из фонового задания?
Нет, фоновые задания выполняются на сервере без привязки к клиентскому сеансу. Для открытия формы требуется пользовательский интерфейс. В качестве обходного пути можно:
- Создать уведомление для пользователя с предложением открыть форму.
- Использовать
ПоказатьОповещениеПользователя()с кнопкой, которая вызовет открытие формы.
Пример:
ТекстОповещения = Новый ОписаниеОповещения("Подбор товаров завершён", "Открыть форму подбора?", Новый Структура("Действие, Параметры", "ОткрытьФормуПодбора", Параметры));
ПоказатьОповещениеПользователя(ТекстОповещения);
Как открыть форму с заданным отбором?
Для формы списка передайте отбор через параметр Отбор:
Параметры = Новый Структура;
Параметры.Отбор = Новый Структура("ВидыНоменклатуры, Поставщик", ВидыНоменклатуры.Товар, Справочники.Контрагенты.Поставщик1);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаСписка", Параметры);
В форме-приёмнике отбор применяется автоматически, если параметр назван Отбор.
Почему форма открывается медленно?
Основные причины:
- 🐢 Передача больших массивов данных в параметрах (например, таблица значений с тысячами строк).
- 🔄 Сложная логика в процедуре
ПриОткрытииформы. - 📡 Медленное сетевое соединение (актуально для тонкого клиента).
Решения:
- Передавайте только идентификаторы объектов, а данные загружайте на сервере по требованию.
- Используйте
ОтложенноеВыполнениедля некритичных операций. - Оптимизируйте запросы в модуле формы.
Как закрыть форму из другой формы?
Для закрытия формы программно используйте метод Закрыть(). Если нужно закрыть форму из другой формы, передайте ссылку на объект формы через параметры:
// В исходной форме:
Параметры = Новый Структура("РодительскаяФорма", ЭтаФорма);
ОткрытьФорму("Обработка.Подтверждение.Форма.ФормаОбработки", Параметры);
// В дочерней форме:
Процедура ЗакрытьРодительскуюФорму(Результат)
Параметры.РодительскаяФорма.Закрыть(Результат);
КонецПроцедуры
В управляемом приложении альтернативный способ — использовать ЗакрытьМодальноеОкно() для модальных форм.
Работает ли ОткрытьФорму() в мобильном приложении 1С?
Да, но с ограничениями:
- ✅ Поддерживаются только управляемые формы.
- ❌ Не работают формы, требующие
Толстого клиента. - ⚠️ Открытие форм может блокироваться настройками безопасности мобильного устройства.
Пример для мобильного клиента:
Параметры = Новый Структура("Режим", "Мобильный");
ОткрытьФорму("Обработка.СканерШтрихкодов.Форма.ФормаОбработки", Параметры, , Истина);