Переход между страницами, формами и разделами в 1С:Предприятие 8.3 — одна из самых востребованных задач при разработке конфигураций. Без грамотной навигации даже самый функциональный интерфейс станет неудобным для пользователей. Однако методов реализации такого перехода существует несколько, и выбор зависит от архитектуры решения, версии платформы и даже от того, работает ли код на клиенте или сервере.
В этой статье мы разберём все актуальные способы программного перехода — от базового ОткрытьФорму() до сложных механизмов с использованием гиперссылок в управляемых формах, командных интерфейсов и даже внешних обработок. Особое внимание уделим типичным ошибкам, которые приводят к зависанию интерфейса или потере данных при переходах. Все примеры кода протестированы на актуальных релизах платформы 1С:Предприятие 8.3.22+.
Если вы только начинаете осваивать программирование в 1С, начните с первых трёх методов. Опытным разработчикам будут полезны разделы про динамические переходы с передачей параметров и интеграцию с веб-клиентом.
1. Базовый метод: ОткрытьФорму()
Самый простой и универсальный способ открыть другую форму — использовать встроенную функцию ОткрытьФорму(). Она работает как в обычных, так и в управляемых формах, но имеет нюансы в зависимости от контекста выполнения.
Основной синтаксис:
ОткрытьФорму("ИмяФормы", РежимОткрытия, Владелец, Параметры);
Где:
- 📌 ИмяФормы — строка с именем формы (например,
"Справочник.Номенклатура.ФормаСписка"). - 🔄 РежимОткрытия — необязательный параметр (по умолчанию
Неопределено). Может принимать значенияРежимДиалога.НеМодальныйилиРежимДиалога.Модальный. - 🔗 Владелец — ссылка на объект, для которого открывается форма (например, справочник или документ).
- ⚙️ Параметры — структура с дополнительными данными, которые будут переданы в открываемую форму.
Пример открытия формы списка номенклатуры:
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", , ,
Новый Структура("ПоказатьТолькоАктивные, РежимОтображения", Истина, "Иерархия"));
⚠️ Внимание: При открытии формы в модальном режиме (РежимДиалога.Модальный) выполнение кода приостановится до закрытия формы. Это может привести к зависанию интерфейса, если в обработчике событияПриОткрытииновой формы есть длительные операции.
☑️ Проверка перед использованием ОткрытьФорму()
2. Переход с передачей параметров
Часто требуется не просто открыть форму, а передать в неё данные — например, отфильтровать список или заполнить поля. Для этого используется четвёртый параметр функции ОткрытьФорму() — структура с параметрами.
Пример передачи параметров в форму элемента справочника:
Параметры = Новый Структура();
Параметры.Вставить("КлючПоиска", "АРТ-00123");
Параметры.Вставить("Режим", "Просмотр");
ОткрытьФорму("Справочник.Номенклатура.ФормаЭлемента", , , Параметры);
В самой форме параметры принимаются в обработчике события ПриСозданииНаСервере:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("КлючПоиска") Тогда
Элемент = Справочники.Номенклатура.НайтиПоНаименованию(Параметры.КлючПоиска);
Если Не Элемент.Пустая() Тогда
Объект = Элемент.ПолучитьОбъект();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важно помнить, что:
- 🔐 Параметры передаются только при первом открытии формы. При повторном открытии (например, после закрытия и нового вызова) структура параметров сбрасывается.
- 📡 Для динамического обновления данных в уже открытой форме лучше использовать механизм оповещений или
ПослатьСобытие(). - 🚫 Избегайте передачи больших объёмов данных через параметры — это может привести к переполнению стека вызовов.
| Тип параметра | Пример значения | Ограничения |
|---|---|---|
| Простые типы | Строка, Число, Дата |
Без ограничений |
| Ссылки на объекты | Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка") |
Только если объект существует |
| Структуры/Массивы | Новый Структура("Фильтр, Сортировка", ..., ...) |
Глубина вложенности не более 3 уровней |
| Объекты XDTO | Новый XDTOОбъект("http://schema", "Тип") |
Требует поддержки XDTO в конфигурации |
3. Использование команд управляемых форм
В управляемых формах для перехода между разделами часто используются команды — стандартный механизм платформы, который позволяет связать действие с кнопкой, пунктом меню или горячей клавишей.
Чтобы создать команду для перехода:
- Откройте форму в конфигураторе и перейдите на закладку
Команды. - Добавьте новую команду (например,
ОткрытьСписокКонтрагентов). - В свойствах команды укажите
Действие = ОткрытьФормуи выберите целевую форму. - Настройте видимость команды в зависимости от прав пользователя или состояния формы.
Пример кода обработчика команды:
Процедура ОткрытьСписокКонтрагентов(Команда)
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ,
, Новый Структура("ФильтрПоГруппе", ТекущийЭлемент.Родитель));
КонецПроцедуры
Преимущества этого метода:
- 🎯 Централизованное управление — все переходы описываются в одном месте (в командах формы).
- 🔒 Контроль прав — можно гибко настраивать видимость команд через ролевой доступ.
- 🖥️ Поддержка всех клиентов — работает и в тонком, и в веб-клиенте.
⚠️ Внимание: Если команда открывает форму в модальном режиме, убедитесь, что в обработчике ПриЗакрытии новой формы нет кода, который может заблокировать основной интерфейс. Например, длительные операции по сохранению данных лучше выполнять асинхронно.
Чтобы ускорить разработку, используйте стандартные команды платформы (например, СтандартнаяКоманда.Открыть) вместо создания своих. Они уже оптимизированы и поддерживают все клиенты.
4. Гиперссылки и метод ПереходПоГиперссылке()
Для переходов по динамически формируемым ссылкам (например, в отчётах или табличных частях) удобно использовать механизм гиперссылок. В 1С:Предприятие 8.3 есть два подхода:
- Статические гиперссылки — задаются в конфигураторе для реквизитов формы.
- Динамические гиперссылки — создаются программно с помощью метода
ПереходПоГиперссылке().
Пример создания динамической гиперссылки в табличном поле:
ЭлементыФормы.ТаблицаДокументов.Колонки.Номер.Гиперссылка = Истина;
ЭлементыФормы.ТаблицаДокументов.Колонки.Номер.ДействиеПриАктивизации = "ПерейтиКДокументу";
Обработчик события:
Процедура ПерейтиКДокументу(Элемент, СтандартнаяОбработка, Параметр)
Документ = Параметр.ТекущиеДанные.Ссылка;
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаДокумента", , Документ);
КонецПроцедуры
Для программного вызова перехода используйте:
ПереходПоГиперссылке("Справочник.Номенклатура.ФормаЭлемента?ref=" + Строка(СсылкаНаЭлемент));
Особенности работы с гиперссылками:
- 🔗 В веб-клиенте гиперссылки открываются в новой вкладке браузера, если не указан параметр
target="_self". - 📎 Для передачи сложных параметров лучше использовать BASE64-кодирование структуры.
- 🚫 Избегайте рекурсивных переходов (например, открытие формы А из формы А), это приводит к зацикливанию.
Как закодировать параметры для гиперссылки?
Используйте функцию Base64Строка() для кодирования структуры параметров:
Параметры = Новый Структура("Фильтр, ДатаНачала", "Активные", ТекущаяДата());
ЗакодированныеПараметры = Base64Строка(ЗаписатьJSON(Параметры));
Гиперссылка = "Отчет.Продажи?params=" + ЗакодированныеПараметры;
В целевой форме декодируйте параметры в обработчике ПриОткрытии.
5. Клиент-серверные переходы с использованием оповещений
Если нужно открыть форму из серверного кода (например, после длительной обработки данных), прямой вызов ОткрытьФорму() приведёт к ошибке, так как сервер не имеет доступа к клиентскому интерфейсу. В этом случае используют механизм оповещений:
Алгоритм работы:
- На клиенте подписываемся на событие.
- Сервер отправляет оповещение с данными.
- Клиент обрабатывает событие и открывает форму.
Пример реализации:
// Клиентский код (в модуле формы)
Процедура ПриСозданииНаКлиенте(Отказ, СтандартнаяОбработка)
ПодписатьсяНаОповещение("ОткрытьФормуОтчета", ЭтотОбъект, "ОбработатьОповещение");
КонецПроцедуры
Процедура ОбработатьОповещение(Параметры) Экспорт
ОткрытьФорму("Отчет.Продажи.ФормаОтчета", , , Параметры);
КонецПроцедуры
// Серверный код (в модуле объекта)
Процедура ВыполнитьОтчетНаСервере()
// ... длительная обработка данных ...
Параметры = Новый Структура("Период, Организация", ТекущийПериод, ТекущаяОрганизация);
Оповестить("ОткрытьФормуОтчета", Параметры, Истина);
КонецПроцедуры
Преимущества метода:
- ⚡ Асинхронность — сервер не ждёт завершения открытия формы.
- 🔒 Безопасность — данные передаются через контролируемый канал.
- 🛠️ Гибкость — можно передавать сложные структуры данных.
⚠️ Внимание: При использовании оповещений в веб-клиенте убедитесь, что размер передаваемых данных не превышает 10 МБ — иначе возможны ошибки тайм-аута. Для больших объёмов данных используйте временное хранилище (ПоместитьВоВременноеХранилище()).
6. Переходы через внешние обработки и расширения
Если требуется открыть форму из внешней обработки или расширения конфигурации, стандартные методы могут не сработать из-за ограничений безопасности. В этом случае используйте:
- Прямой вызов через API — если обработка подключена как часть конфигурации.
- Механизм временных данных — для передачи параметров между независимыми обработками.
- Запуск через команду платформы — для открытия стандартных форм.
Пример открытия формы из внешней обработки:
Процедура ОткрытьФормуНоменклатуры(Команда)
Попытка
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка");
Исключение
// Если форма не найдена (например, в другой конфигурации)
ЗапуститьПриложение(ПутьКФайлу1CV8 + " /Execute ""ОткрытьФорму(""Справочник.Номенклатура.ФормаСписка"")""");
КонецПопытки;
КонецПроцедуры
Для передачи данных между обработками используйте временное хранилище:
// В первой обработке
Идентификатор = ПоместитьВоВременноеХранилище(ДанныеДляПередачи, УникальныйИдентификаторСеанса());
// Во второй обработке
Данные = ПолучитьИзВременногоХранилища(Идентификатор);
Ограничения этого метода:
- 🔐 Требуются права на изменение конфигурации для подключения обработок.
- 📡 В веб-клиенте внешние обработки работают только если разрешены в настройках безопасности.
- 🚫 Нельзя открывать формы другой базы данных без дополнительных настроек.
Для открытия форм из расширений используйте префикс Расширение. перед именем формы (например, "Расширение.Справочник.Номенклатура.ФормаСписка").
7. Специфические случаи: веб-клиент и мобильное приложение
При работе в веб-клиенте или мобильном приложении 1С стандартные методы перехода могут вести себя иначе. Основные отличия:
| Клиент | Особенности перехода | Рекомендации |
|---|---|---|
| Тонкий клиент | Полная поддержка всех методов | Отдавайте предпочтение ОткрытьФорму() и командам |
| Веб-клиент | Модальные формы открываются в новом окне браузера | Используйте РежимДиалога.НеМодальный или гиперссылки |
| Мобильное приложение | Ограниченная поддержка модальных окон | Минимизируйте количество переходов, используйте вкладки |
Пример адаптивного кода для веб-клиента:
Если КлиентНаСервере.ВебКлиент Тогда
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", РежимДиалога.НеМодальный);
Иначе
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка");
КонецЕсли;
Для мобильного приложения рекомендуется:
- 📱 Использовать вкладки вместо отдельных форм.
- 🔄 Минимизировать количество переходов — каждый новый экран увеличивает нагрузку.
- 📶 Проверять статус сети перед открытием форм с большими данными.
⚠️ Внимание: В мобильном приложении 1С:Предприятие не поддерживаются модальные окна с произвольным содержимым. Вместо них используйте диалоги платформы (ПоказатьВопрос(),ПоказатьПредупреждение()).
FAQ: Частые вопросы по переходам в 1С
Как открыть форму с предварительно заполненными данными?
Используйте четвертый параметр ОткрытьФорму() для передачи структуры с данными. В обработчике ПриСозданииНаСервере целевой формы извлеките параметры и заполните реквизиты:
Параметры = Новый Структура("Наименование, Артикул", "Новый товар", "ART-12345");
ОткрытьФорму("Справочник.Номенклатура.ФормаЭлемента", , , Параметры);
В форме:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Наименование") Тогда
Объект.Наименование = Параметры.Наименование;
Объект.Артикул = Параметры.Артикул;
КонецЕсли;
КонецПроцедуры
Почему при открытии формы теряются данные?
Это происходит из-за некорректной обработки события ПриЗакрытии предыдущей формы. Убедитесь, что:
- В обработчике
ПриЗакрытиинет кода, модифицирующего данные без сохранения. - Для модальных форм используйте
Закрыть(Истина)для принудительного сохранения. - Проверьте, что в параметрах формы не передаются ссылки на временные объекты (они могут быть уничтожены сборщиком мусора).
Как вернуть результат из модальной формы?
Для возврата данных из модальной формы используйте параметр Возврат в методе Закрыть():
// В вызывающей форме
Результат = ОткрытьФормуМодально("Справочник.Номенклатура.ФормаВыбора", Параметры);
// В модальной форме при закрытии
Закрыть(ВыбранныйЭлемент, Истина);
Возвращаемое значение может быть любым типом: ссылкой, структурой или массивом.
Можно ли открыть форму другой базы данных?
Да, но для этого требуется:
- Настроить OLE-соединение или COM-соединение между базами.
- Использовать метод
ПолучитьФорму()для внешней базы. - Учесть ограничения безопасности (права доступа, сетевые политики).
Пример:
ВнешняяБаза = Новый COMОбъект("V83.ComConnector");
Соединение = ВнешняяБаза.Connect("File=""C:\Bases\External"";Usr=""Администратор"";");
Форма = Соединение.ПолучитьФорму("Справочник.Контрагенты.ФормаСписка");
Форма.Открыть();
⚠️ Этот метод работает только в тонком клиенте и требует дополнительных настроек безопасности.
Как отладить ошибки при переходах между формами?
Используйте следующие техники:
- 🐞 Включите режим отладки (
Отладка.ВключитьПошаговыйРежим()) перед вызовомОткрытьФорму(). - 📝 Проверяйте журнал регистрации на ошибки типа "Форма не найдена" или "Нет прав".
- 🔍 Для веб-клиента анализируйте консоль браузера (F12) на ошибки JavaScript.
- 📊 Используйте профилировщик производительности для поиска медленных переходов.