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

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

📊 Какой тип клиента 1С вы используете чаще?
Толстый клиент
Тонкий клиент
Веб-клиент
Мобильное приложение

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

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

ОткрытьФорму(<ИмяФормы>, <Параметры>, <РежимОткрытия>, <Уникальность>);

Основные параметры метода:

  • 📌 <ИмяФормы> — строка с именем формы (например, "Справочник.Номенклатура.Форма.ФормаЭлемента"). Можно использовать ТипВнешнейОбработки() для внешних форм.
  • 🔧 <Параметры> — структура с данными, которые нужно передать в открываемую форму. Доступны через параметр Параметры в модуле формы.
  • 🖥️ <РежимОткрытия> — необязательный параметр для управления модальностью (Неопределено, Независимый, БлокироватьОкно).
  • 🔄 <Уникальность> — флаг для предотвращения дублирования форм (Ложь по умолчанию).

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

ПараметрыФормы = Новый Структура("Отбор, РежимРедактирования", Новый Структура("ВидыНоменклатуры", ВидыНоменклатуры.Товар), Ложь);

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

⚠️ Внимание: В тонком клиенте метод ОткрытьФорму() выполняется асинхронно. Если вам нужно дождаться завершения работы формы, используйте ОткрытьФормуМодально() или обрабатывайте событие ПриЗакрытии.

2. Программное создание объекта формы

Для более гибкой работы с формами можно создать объект формы вручную, настроить его свойства и только потом открыть. Этот подход полезен, когда требуется:

  • 🎨 Динамически изменять элементы управления до отображения.
  • 🔗 Передавать сложные параметры, включая объекты и коллекции.
  • 🔒 Контролировать права доступа на уровне формы.

Пример создания и открытия формы документа РеализацияТоваровУслуг:

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

ФормаДокумента.Параметры.НовыйДокумент = Истина;

ФормаДокумента.Параметры.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

ФормаДокумента.Открыть();

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

ФормаДокумента.ЭлементыФормы.КоманднаяПанель.Видимость = Ложь;

ФормаДокумента.Заголовок = "Новый заказ для " + ФормаДокумента.Параметры.Контрагент.Наименование;

☑️ Подготовка к программному открытию формы

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

3. Передача параметров между формами

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

Типичные ошибки при передаче параметров:

  • 🚫 Использование несериализуемых объектов (например, ДокументОбъект вместо ссылки).
  • 🔄 Забывают проверять существование параметров в принимающей форме.
  • 📦 Передача больших массивов данных, что тормозит открытие формы.

Пример безопасной передачи параметров:

// В исходной форме:

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

Параметры.Вставить("ИдентификаторЗаказа", ТекущийДокумент.Ссылка.УникальныйИдентификатор());

Параметры.Вставить("ДатаСоздания", ТекущаяДата());

ОткрытьФорму("Документ.ЗаказПокупателя.Форма.ФормаПечати", Параметры);

// В форме-приёмнике (модуль формы):

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

Если ЗначениеЗаполнено(Параметры.ИдентификаторЗаказа) Тогда

ДокументОбъект = Параметры.ИдентификаторЗаказа.ПолучитьОбъект();

ДатаПечати = Параметры.ДатаСоздания;

КонецЕсли;

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

⚠️ Внимание: При передаче ссылок на объекты (например, ДокументСсылка.ЗаказПокупателя) убедитесь, что у пользователя есть права на чтение этих объектов. В противном случае форма откроется с ошибкой доступа.
Тип параметра Пример значения Особенности передачи
Простые типы 123, "Текст", Истина Передаются без ограничений
Ссылки на объекты Справочники.Номенклатура.Ссылка Требуют проверки прав доступа
Коллекции (Массив, СписокЗначений) Новый Массив(1, 2, 3) Могут тормозить форму при большом объёме
Структуры Новый Структура("Ключ, Значение") Удобны для группировки параметров
Объекты (ДокументОбъект, СправочникОбъект) Документы.ЗаказПокупателя.СоздатьДокумент() Не рекомендуется передавать напрямую — лучше передавать ссылку и получать объект на сервере

4. Открытие форм в управляемом приложении

В управляемых формах (тонкий клиент, веб-клиент) есть свои нюансы. Например, нельзя напрямую обращаться к элементам формы из другого модуля. Вместо этого используют:

  • 🔗 ПолучитьФорму() + настройка параметров.
  • 📋 Команды формы для открытия связанных объектов.
  • 🖼️ Клиентские и серверные процедуры для обмена данными.

Пример открытия формы списка справочника Контрагенты с отбором по группе:

Команда = Команды.ОткрытьСписокКонтрагентов();

ПараметрыВыполнения = Новый Структура("Группа", Справочники.ГруппыКонтрагентов.Покупатели);

Команда.Выполнить(ПараметрыВыполнения);

Для создания модальных диалогов в управляемом приложении используют ОткрытьФормуМодально():

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

Если Результат = Неопределено Тогда

Сообщить("Подбор отменён пользователем");

Иначе

// Обработка результата

КонецЕсли;

💡

В управляемых формах избегайте длительных операций в клиентских процедурах. Переносите тяжелую логику на сервер с помощью функции ВыполнитьНаСервере()

5. Распространённые ошибки и их решения

Даже опытные разработчики сталкиваются с проблемами при открытии форм. Вот самые частые ошибки и способы их исправления:

Ошибка 1: Форма не открывается без сообщений

  • 🔍 Причина: Неверное имя формы или отсутствие прав.
  • Решение: Проверьте имя формы в конфигураторе (Все функции → Формы). Убедитесь, что у пользователя есть роль с правом на открытие этой формы.

Ошибка 2: Параметры не передаются

  • 🔍 Причина: Ошибка в имени параметра или попытка передать несериализуемый объект.
  • Решение: Используйте Сообщить(Параметры) в принимающей форме для отладки. Передавайте только ссылки или простые типы.

Ошибка 3: Форма открывается дважды

  • 🔍 Причина: Параметр Уникальность установлен в Ложь или двойной вызов ОткрытьФорму().
  • Решение: Установите Уникальность = Истина или добавьте проверку на существование формы.
Как отладить открытие формы?

1. Включите режим отладки в конфигураторе (Отладка → Начать отладку).

2. Поставьте точку останова в модуле формы на процедуре ПриОткрытии.

3. Проверьте значение Параметры через Сообщить() или отладчик.

4. Убедитесь, что форма не блокируется антивирусом или групповой политикой (актуально для толстого клиента).

6. Оптимизация и лучшие практики

Чтобы код открытия форм был поддерживаемым и эффективным, следуйте этим рекомендациям:

1. Используйте константы для имён форм

Заведите в общем модуле константы с именами часто используемых форм:

Перем ИменаФорм Export;

ИменаФорм.ФормаЭлементаНоменклатура = "Справочник.Номенклатура.Форма.ФормаЭлемента";

ИменаФорм.ФормаСпискаКонтрагентов = "Справочник.Контрагенты.Форма.ФормаСписка";

2. Разделяйте клиентскую и серверную логику

В управляемых формах выносите подготовку параметров на сервер:

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

Параметры = ПодготовитьПараметрыПодбораНаСервере();

ОткрытьФорму(ИменаФорм.ФормаПодбораТоваров, Параметры);

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

&НаСервере

Функция ПодготовитьПараметрыПодбораНаСервере()

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

Параметры.Вставить("Склад", ТекущийДокумент.Склад);

Параметры.Вставить("Контрагент", ТекущийДокумент.Контрагент);

Возврат Параметры;

КонецФункции

3. Обрабатывайте закрытие формы

Если вам нужно получить данные из закрываемой формы, используйте событие ПриЗакрытии:

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

Если ЗначениеЗаполнено(РезультатФормы) Тогда

ВладелецФормы.ОбработатьРезультатПодбора(РезультатФормы);

КонецЕсли;

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

💡

Всегда проверяйте существование параметров в принимающей форме через ЗначениеЗаполнено(). Это предотвратит ошибки, если форма будет открыта без параметров (например, вручную через меню).

FAQ: Частые вопросы по работе с формами в 1С

Можно ли открыть форму из фонового задания?

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

  1. Создать уведомление для пользователя с предложением открыть форму.
  2. Использовать ПоказатьОповещениеПользователя() с кнопкой, которая вызовет открытие формы.

Пример:

ТекстОповещения = Новый ОписаниеОповещения("Подбор товаров завершён", "Открыть форму подбора?", Новый Структура("Действие, Параметры", "ОткрытьФормуПодбора", Параметры));

ПоказатьОповещениеПользователя(ТекстОповещения);

Как открыть форму с заданным отбором?

Для формы списка передайте отбор через параметр Отбор:

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

Параметры.Отбор = Новый Структура("ВидыНоменклатуры, Поставщик", ВидыНоменклатуры.Товар, Справочники.Контрагенты.Поставщик1);

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

В форме-приёмнике отбор применяется автоматически, если параметр назван Отбор.

Почему форма открывается медленно?

Основные причины:

  • 🐢 Передача больших массивов данных в параметрах (например, таблица значений с тысячами строк).
  • 🔄 Сложная логика в процедуре ПриОткрытии формы.
  • 📡 Медленное сетевое соединение (актуально для тонкого клиента).

Решения:

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

Для закрытия формы программно используйте метод Закрыть(). Если нужно закрыть форму из другой формы, передайте ссылку на объект формы через параметры:

// В исходной форме:

Параметры = Новый Структура("РодительскаяФорма", ЭтаФорма);

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

// В дочерней форме:

Процедура ЗакрытьРодительскуюФорму(Результат)

Параметры.РодительскаяФорма.Закрыть(Результат);

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

В управляемом приложении альтернативный способ — использовать ЗакрытьМодальноеОкно() для модальных форм.

Работает ли ОткрытьФорму() в мобильном приложении 1С?

Да, но с ограничениями:

  • ✅ Поддерживаются только управляемые формы.
  • ❌ Не работают формы, требующие Толстого клиента.
  • ⚠️ Открытие форм может блокироваться настройками безопасности мобильного устройства.

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

Параметры = Новый Структура("Режим", "Мобильный");

ОткрытьФорму("Обработка.СканерШтрихкодов.Форма.ФормаОбработки", Параметры, , Истина);