Переход между страницами, формами и разделами в 1С:Предприятие 8.3 — одна из самых востребованных задач при разработке конфигураций. Без грамотной навигации даже самый функциональный интерфейс станет неудобным для пользователей. Однако методов реализации такого перехода существует несколько, и выбор зависит от архитектуры решения, версии платформы и даже от того, работает ли код на клиенте или сервере.

В этой статье мы разберём все актуальные способы программного перехода — от базового ОткрытьФорму() до сложных механизмов с использованием гиперссылок в управляемых формах, командных интерфейсов и даже внешних обработок. Особое внимание уделим типичным ошибкам, которые приводят к зависанию интерфейса или потере данных при переходах. Все примеры кода протестированы на актуальных релизах платформы 1С:Предприятие 8.3.22+.

Если вы только начинаете осваивать программирование в 1С, начните с первых трёх методов. Опытным разработчикам будут полезны разделы про динамические переходы с передачей параметров и интеграцию с веб-клиентом.

📊 Какой механизм перехода вы используете чаще?
ОткрытьФорму()
Команды управляемой формы
Гиперссылки
ПереходПоГиперссылке()
Другой

1. Базовый метод: ОткрытьФорму()

Самый простой и универсальный способ открыть другую форму — использовать встроенную функцию ОткрытьФорму(). Она работает как в обычных, так и в управляемых формах, но имеет нюансы в зависимости от контекста выполнения.

Основной синтаксис:

ОткрытьФорму("ИмяФормы", РежимОткрытия, Владелец, Параметры);

Где:

  • 📌 ИмяФормы — строка с именем формы (например, "Справочник.Номенклатура.ФормаСписка").
  • 🔄 РежимОткрытия — необязательный параметр (по умолчанию Неопределено). Может принимать значения РежимДиалога.НеМодальный или РежимДиалога.Модальный.
  • 🔗 Владелец — ссылка на объект, для которого открывается форма (например, справочник или документ).
  • ⚙️ Параметры — структура с дополнительными данными, которые будут переданы в открываемую форму.

Пример открытия формы списка номенклатуры:

ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", , ,

Новый Структура("ПоказатьТолькоАктивные, РежимОтображения", Истина, "Иерархия"));

⚠️ Внимание: При открытии формы в модальном режиме (РежимДиалога.Модальный) выполнение кода приостановится до закрытия формы. Это может привести к зависанию интерфейса, если в обработчике события ПриОткрытии новой формы есть длительные операции.

☑️ Проверка перед использованием ОткрытьФорму()

Выполнено: 0 / 4

2. Переход с передачей параметров

Часто требуется не просто открыть форму, а передать в неё данные — например, отфильтровать список или заполнить поля. Для этого используется четвёртый параметр функции ОткрытьФорму() — структура с параметрами.

Пример передачи параметров в форму элемента справочника:

Параметры = Новый Структура();

Параметры.Вставить("КлючПоиска", "АРТ-00123");

Параметры.Вставить("Режим", "Просмотр");

ОткрытьФорму("Справочник.Номенклатура.ФормаЭлемента", , , Параметры);

В самой форме параметры принимаются в обработчике события ПриСозданииНаСервере:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("КлючПоиска") Тогда

Элемент = Справочники.Номенклатура.НайтиПоНаименованию(Параметры.КлючПоиска);

Если Не Элемент.Пустая() Тогда

Объект = Элемент.ПолучитьОбъект();

КонецЕсли;

КонецЕсли;

КонецПроцедуры

Важно помнить, что:

  • 🔐 Параметры передаются только при первом открытии формы. При повторном открытии (например, после закрытия и нового вызова) структура параметров сбрасывается.
  • 📡 Для динамического обновления данных в уже открытой форме лучше использовать механизм оповещений или ПослатьСобытие().
  • 🚫 Избегайте передачи больших объёмов данных через параметры — это может привести к переполнению стека вызовов.
Тип параметра Пример значения Ограничения
Простые типы Строка, Число, Дата Без ограничений
Ссылки на объекты Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка") Только если объект существует
Структуры/Массивы Новый Структура("Фильтр, Сортировка", ..., ...) Глубина вложенности не более 3 уровней
Объекты XDTO Новый XDTOОбъект("http://schema", "Тип") Требует поддержки XDTO в конфигурации

3. Использование команд управляемых форм

В управляемых формах для перехода между разделами часто используются команды — стандартный механизм платформы, который позволяет связать действие с кнопкой, пунктом меню или горячей клавишей.

Чтобы создать команду для перехода:

  1. Откройте форму в конфигураторе и перейдите на закладку Команды.
  2. Добавьте новую команду (например, ОткрытьСписокКонтрагентов).
  3. В свойствах команды укажите Действие = ОткрытьФорму и выберите целевую форму.
  4. Настройте видимость команды в зависимости от прав пользователя или состояния формы.

Пример кода обработчика команды:

Процедура ОткрытьСписокКонтрагентов(Команда)

ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ,

, Новый Структура("ФильтрПоГруппе", ТекущийЭлемент.Родитель));

КонецПроцедуры

Преимущества этого метода:

  • 🎯 Централизованное управление — все переходы описываются в одном месте (в командах формы).
  • 🔒 Контроль прав — можно гибко настраивать видимость команд через ролевой доступ.
  • 🖥️ Поддержка всех клиентов — работает и в тонком, и в веб-клиенте.
⚠️ Внимание: Если команда открывает форму в модальном режиме, убедитесь, что в обработчике ПриЗакрытии новой формы нет кода, который может заблокировать основной интерфейс. Например, длительные операции по сохранению данных лучше выполнять асинхронно.
💡

Чтобы ускорить разработку, используйте стандартные команды платформы (например, СтандартнаяКоманда.Открыть) вместо создания своих. Они уже оптимизированы и поддерживают все клиенты.

4. Гиперссылки и метод ПереходПоГиперссылке()

Для переходов по динамически формируемым ссылкам (например, в отчётах или табличных частях) удобно использовать механизм гиперссылок. В 1С:Предприятие 8.3 есть два подхода:

  1. Статические гиперссылки — задаются в конфигураторе для реквизитов формы.
  2. Динамические гиперссылки — создаются программно с помощью метода ПереходПоГиперссылке().

Пример создания динамической гиперссылки в табличном поле:

ЭлементыФормы.ТаблицаДокументов.Колонки.Номер.Гиперссылка = Истина;

ЭлементыФормы.ТаблицаДокументов.Колонки.Номер.ДействиеПриАктивизации = "ПерейтиКДокументу";

Обработчик события:

Процедура ПерейтиКДокументу(Элемент, СтандартнаяОбработка, Параметр)

Документ = Параметр.ТекущиеДанные.Ссылка;

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаДокумента", , Документ);

КонецПроцедуры

Для программного вызова перехода используйте:

ПереходПоГиперссылке("Справочник.Номенклатура.ФормаЭлемента?ref=" + Строка(СсылкаНаЭлемент));

Особенности работы с гиперссылками:

  • 🔗 В веб-клиенте гиперссылки открываются в новой вкладке браузера, если не указан параметр target="_self".
  • 📎 Для передачи сложных параметров лучше использовать BASE64-кодирование структуры.
  • 🚫 Избегайте рекурсивных переходов (например, открытие формы А из формы А), это приводит к зацикливанию.
Как закодировать параметры для гиперссылки?

Используйте функцию Base64Строка() для кодирования структуры параметров:

Параметры = Новый Структура("Фильтр, ДатаНачала", "Активные", ТекущаяДата());

ЗакодированныеПараметры = Base64Строка(ЗаписатьJSON(Параметры));

Гиперссылка = "Отчет.Продажи?params=" + ЗакодированныеПараметры;

В целевой форме декодируйте параметры в обработчике ПриОткрытии.

5. Клиент-серверные переходы с использованием оповещений

Если нужно открыть форму из серверного кода (например, после длительной обработки данных), прямой вызов ОткрытьФорму() приведёт к ошибке, так как сервер не имеет доступа к клиентскому интерфейсу. В этом случае используют механизм оповещений:

Алгоритм работы:

  1. На клиенте подписываемся на событие.
  2. Сервер отправляет оповещение с данными.
  3. Клиент обрабатывает событие и открывает форму.

Пример реализации:

// Клиентский код (в модуле формы)

Процедура ПриСозданииНаКлиенте(Отказ, СтандартнаяОбработка)

ПодписатьсяНаОповещение("ОткрытьФормуОтчета", ЭтотОбъект, "ОбработатьОповещение");

КонецПроцедуры

Процедура ОбработатьОповещение(Параметры) Экспорт

ОткрытьФорму("Отчет.Продажи.ФормаОтчета", , , Параметры);

КонецПроцедуры

// Серверный код (в модуле объекта)

Процедура ВыполнитьОтчетНаСервере()

// ... длительная обработка данных ...

Параметры = Новый Структура("Период, Организация", ТекущийПериод, ТекущаяОрганизация);

Оповестить("ОткрытьФормуОтчета", Параметры, Истина);

КонецПроцедуры

Преимущества метода:

  • Асинхронность — сервер не ждёт завершения открытия формы.
  • 🔒 Безопасность — данные передаются через контролируемый канал.
  • 🛠️ Гибкость — можно передавать сложные структуры данных.
⚠️ Внимание: При использовании оповещений в веб-клиенте убедитесь, что размер передаваемых данных не превышает 10 МБ — иначе возможны ошибки тайм-аута. Для больших объёмов данных используйте временное хранилище (ПоместитьВоВременноеХранилище()).

6. Переходы через внешние обработки и расширения

Если требуется открыть форму из внешней обработки или расширения конфигурации, стандартные методы могут не сработать из-за ограничений безопасности. В этом случае используйте:

  1. Прямой вызов через API — если обработка подключена как часть конфигурации.
  2. Механизм временных данных — для передачи параметров между независимыми обработками.
  3. Запуск через команду платформы — для открытия стандартных форм.

Пример открытия формы из внешней обработки:

Процедура ОткрытьФормуНоменклатуры(Команда)

Попытка

ОткрытьФорму("Справочник.Номенклатура.ФормаСписка");

Исключение

// Если форма не найдена (например, в другой конфигурации)

ЗапуститьПриложение(ПутьКФайлу1CV8 + " /Execute ""ОткрытьФорму(""Справочник.Номенклатура.ФормаСписка"")""");

КонецПопытки;

КонецПроцедуры

Для передачи данных между обработками используйте временное хранилище:

// В первой обработке

Идентификатор = ПоместитьВоВременноеХранилище(ДанныеДляПередачи, УникальныйИдентификаторСеанса());

// Во второй обработке

Данные = ПолучитьИзВременногоХранилища(Идентификатор);

Ограничения этого метода:

  • 🔐 Требуются права на изменение конфигурации для подключения обработок.
  • 📡 В веб-клиенте внешние обработки работают только если разрешены в настройках безопасности.
  • 🚫 Нельзя открывать формы другой базы данных без дополнительных настроек.
💡

Для открытия форм из расширений используйте префикс Расширение. перед именем формы (например, "Расширение.Справочник.Номенклатура.ФормаСписка").

7. Специфические случаи: веб-клиент и мобильное приложение

При работе в веб-клиенте или мобильном приложении 1С стандартные методы перехода могут вести себя иначе. Основные отличия:

Клиент Особенности перехода Рекомендации
Тонкий клиент Полная поддержка всех методов Отдавайте предпочтение ОткрытьФорму() и командам
Веб-клиент Модальные формы открываются в новом окне браузера Используйте РежимДиалога.НеМодальный или гиперссылки
Мобильное приложение Ограниченная поддержка модальных окон Минимизируйте количество переходов, используйте вкладки

Пример адаптивного кода для веб-клиента:

Если КлиентНаСервере.ВебКлиент Тогда

ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", РежимДиалога.НеМодальный);

Иначе

ОткрытьФорму("Справочник.Контрагенты.ФормаСписка");

КонецЕсли;

Для мобильного приложения рекомендуется:

  • 📱 Использовать вкладки вместо отдельных форм.
  • 🔄 Минимизировать количество переходов — каждый новый экран увеличивает нагрузку.
  • 📶 Проверять статус сети перед открытием форм с большими данными.
⚠️ Внимание: В мобильном приложении 1С:Предприятие не поддерживаются модальные окна с произвольным содержимым. Вместо них используйте диалоги платформы (ПоказатьВопрос(), ПоказатьПредупреждение()).

FAQ: Частые вопросы по переходам в 1С

Как открыть форму с предварительно заполненными данными?

Используйте четвертый параметр ОткрытьФорму() для передачи структуры с данными. В обработчике ПриСозданииНаСервере целевой формы извлеките параметры и заполните реквизиты:

Параметры = Новый Структура("Наименование, Артикул", "Новый товар", "ART-12345");

ОткрытьФорму("Справочник.Номенклатура.ФормаЭлемента", , , Параметры);

В форме:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("Наименование") Тогда

Объект.Наименование = Параметры.Наименование;

Объект.Артикул = Параметры.Артикул;

КонецЕсли;

КонецПроцедуры

Почему при открытии формы теряются данные?

Это происходит из-за некорректной обработки события ПриЗакрытии предыдущей формы. Убедитесь, что:

  • В обработчике ПриЗакрытии нет кода, модифицирующего данные без сохранения.
  • Для модальных форм используйте Закрыть(Истина) для принудительного сохранения.
  • Проверьте, что в параметрах формы не передаются ссылки на временные объекты (они могут быть уничтожены сборщиком мусора).
Как вернуть результат из модальной формы?

Для возврата данных из модальной формы используйте параметр Возврат в методе Закрыть():

// В вызывающей форме

Результат = ОткрытьФормуМодально("Справочник.Номенклатура.ФормаВыбора", Параметры);

// В модальной форме при закрытии

Закрыть(ВыбранныйЭлемент, Истина);

Возвращаемое значение может быть любым типом: ссылкой, структурой или массивом.

Можно ли открыть форму другой базы данных?

Да, но для этого требуется:

  1. Настроить OLE-соединение или COM-соединение между базами.
  2. Использовать метод ПолучитьФорму() для внешней базы.
  3. Учесть ограничения безопасности (права доступа, сетевые политики).

Пример:

ВнешняяБаза = Новый COMОбъект("V83.ComConnector");

Соединение = ВнешняяБаза.Connect("File=""C:\Bases\External"";Usr=""Администратор"";");

Форма = Соединение.ПолучитьФорму("Справочник.Контрагенты.ФормаСписка");

Форма.Открыть();

⚠️ Этот метод работает только в тонком клиенте и требует дополнительных настроек безопасности.

Как отладить ошибки при переходах между формами?

Используйте следующие техники:

  • 🐞 Включите режим отладки (Отладка.ВключитьПошаговыйРежим()) перед вызовом ОткрытьФорму().
  • 📝 Проверяйте журнал регистрации на ошибки типа "Форма не найдена" или "Нет прав".
  • 🔍 Для веб-клиента анализируйте консоль браузера (F12) на ошибки JavaScript.
  • 📊 Используйте профилировщик производительности для поиска медленных переходов.