Работа с формами в 1С:Предприятие 8.3 — одна из самых востребованных задач среди разработчиков. Часто требуется не просто открыть форму, а передать в неё данные из другой формы, отчёта или обработки. Например, при открытии карточки номенклатуры из списка товаров, при передаче фильтров в отчёт или при настройке модального окна с предзаполненными полями. Без правильной передачи параметров форма либо откроется пустой, либо потребует ручного ввода данных — что недопустимо в автоматизированных системах.
В этой статье разберём все актуальные способы передачи параметров в формы 1С 8.3: от стандартного метода ОткрытьФорму() до работы с событиями и глобальными переменными. Каждый метод проиллюстрирован практическим примером, а также указаны ограничения и нюансы, которые важно учитывать. Если вы только начинаете работать с формами или сталкиваетесь с ошибками при передаче данных — здесь найдёте решения.
Особое внимание уделим проблеме потери параметров при повторном открытии формы (например, через историю навигации) и способам её обхода. Также разберём, как передавать сложные структуры данных (таблицы значений, массивы, объекты) и обеспечивать типобезопасность.
1. Стандартный метод: ОткрытьФорму() с параметрами
Самый распространённый и рекомендуемый способ — использование метода ОткрытьФорму() с передачей параметров во втором аргументе. Этот метод подходит для большинства сценариев: открытия форм элементов справочников, документов, обработок и отчётов.
Синтаксис метода:
ОткрытьФорму(<ИмяФормы>, <Параметры>, <РежимОткрытия>, <Уникальность>, <Родитель>);
Где:
- 📌
<ИмяФормы>— строка с именем формы (например,"Справочник.Номенклатура.ФормаЭлемента"). - 📌
<Параметры>— структура или таблица значений с передаваемыми данными. - 📌
<РежимОткрытия>— необязательный параметр (например,РежимДиалога.Обычный). - 📌
<Уникальность>— управляет созданием нового экземпляра формы (Уникальность.ПоИмениилиУникальность.ПоИмениИПараметрам).
Пример передачи параметров в форму элемента справочника:
Параметры = Новый Структура();
Параметры.Вставить("Ключ", Справочники.Номенклатура.НайтиПоНаименованию("Монитор 24''"));
Параметры.Вставить("Режим", "Просмотр");
ОткрытьФорму("Справочник.Номенклатура.ФормаЭлемента", Параметры);
⚠️ Внимание: Если не указать параметр Уникальность.ПоИмениИПараметрам, при повторном открытии формы с теми же параметрами система может вернуть уже существующий экземпляр формы, а не создать новый. Это приводит к потере актуальных данных.
Чтобы избежать конфликтов при передаче параметров с одинаковыми именами, используйте уникальные префиксы (например, "Фильтр_ДатаНачала" вместо просто "Дата").
2. Получение параметров в форме: событие ПриСозданииНаСервере
Передать параметры — половина дела. Нужно их правильно принять и обработать в целевой форме. Для этого используется событие ПриСозданииНаСервере, которое срабатывает один раз при создании формы на сервере.
Пример обработчика в модуле формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем параметры из свойства формы
Параметры = ЭтотОбъект.Параметры;
// Проверяем наличие обязательных параметров
Если НЕ Параметры.Свойство("Ключ") Тогда
Сообщить("Не передан обязательный параметр 'Ключ'!");
Отказ = Истина;
КонецЕсли;
// Используем параметры для заполнения формы
ЭтотОбъект.Объект = Параметры.Ключ;
ЭтотОбъект.Режим = Параметры.Режим;
КонецПроцедуры
Важные моменты:
- 🔹 Параметры доступны через свойство формы
ЭтотОбъект.Параметры. - 🔹 Всегда проверяйте наличие обязательных параметров, чтобы избежать ошибок.
- 🔹 Для сложных структур (таблиц значений) используйте метод
Скопировать(), чтобы избежать ссылочных проблем.
⚠️ Внимание: Если форма открывается в модальном режиме (например, через ОткрытьФормуМодально()), параметры передаются аналогично, но доступ к ним возможен только после закрытия модального окна через возвращаемое значение.
3. Передача параметров через командную панель
Если форма открывается через командную панель (например, кнопка "Открыть карточку" в списке документов), параметры можно передать через свойство команды Параметр. Этот способ удобен для стандартных интерфейсов, где формы открываются через действия.
Пример настройки команды в конфигураторе:
- Откройте форму списка (например,
Документ.РеализацияТоваровУслуг.ФормаСписка). - Найдите команду открытия элемента (обычно
"Открыть"или"Изменить"). - В свойствах команды укажите
Параметр = "ТекущийЭлемент". - В обработчике команды добавьте код передачи параметров:
&НаКлиенте
Процедура ОткрытьЭлемент(Команда)
Параметры = Новый Структура();
Параметры.Вставить("Документ", Команда.Параметр);
Параметры.Вставить("ТолькоПросмотр", Ложь);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаЭлемента", Параметры);
КонецПроцедуры
Преимущества метода:
- 🎯 Не требует изменения стандартных обработчиков.
- 🎯 Легко интегрируется в типовой функционал.
- 🎯 Параметры автоматически привязываются к текущему элементу списка.
Как передать несколько параметров через командную панель?
Можно использовать структуру в свойстве Параметр команды. Например, в конфигураторе задайте Параметр = "Новый Структура(""Ключ, Режим"", ТекущийЭлемент, ""Просмотр"")", а в обработчике разберите её на составляющие.
4. Использование глобальных переменных и общих модулей
В некоторых случаях удобно передавать параметры через глобальные переменные или общие модули. Этот способ подходит для:
- 🌍 Передачи данных между независимыми формами (например, из отчёта в обработку).
- 🌍 Хранения временных данных, которые нужны нескольким формам.
- 🌍 Обхода ограничений стандартных механизмов (например, при работе с внешними обработками).
Пример с общим модулем:
// В общем модуле "ГлобальныеПараметры" (сервер, вызов сервера)
Переменная Экспорт ФильтрПоДате; // Структура с датами начала и конца
// Установка параметров перед открытием формы
ГлобальныеПараметры.ФильтрПоДате = Новый Структура("С, По", НачалоДня(ТекущаяДата()), КонецДня(ТекущаяДата()));
// Использование в форме
&НаСервере
Процедура ПриСозданииНаСервере(Отказ)
Фильтр = ГлобальныеПараметры.ФильтрПоДате;
ЭтотОбъект.Элементы.Период.Значение = Фильтр.С;
КонецПроцедуры
⚠️ Внимание: Глобальные переменные не очищаются автоматически после использования. Это может привести к утечкам данных или конфликтам при одновременной работе нескольких пользователей. Всегда сбрасывайте значения после использования:ГлобальныеПараметры.ФильтрПоДате = Неопределено;5. Передача сложных данных: таблицы значений, массивы, объекты
Иногда требуется передать в форму не просто примитивные значения (числа, строки), а сложные структуры: таблицы значений, массивы, объекты документов или справочников. Здесь важно учитывать сериализацию данных и возможные ошибки при копировании ссылок.
Примеры передачи разных типов данных:
Тип данных Пример передачи Нюансы Таблица значений Параметры.Вставить("Таблица",ТЗ.Скопировать());
Всегда используйте .Скопировать(), чтобы избежать изменения исходной таблицы.Массив Параметры.Вставить("Массив",Новый Массив().Добавить(1).Добавить(2));
Массивы передаются по ссылке. Изменения в форме отразятся на исходном массиве. Объект документа Параметры.Вставить("Документ",Документы.ЗаказПокупателя.СоздатьДокумент());
Объект должен быть незаписанным, иначе возможны блокировки. Структура Параметры.Вставить("Фильтр",Новый Структура("Поле1, Поле2", Знач1, Знач2));
Самый безопасный способ для передачи набора данных. Особое внимание уделите передаче объектов ссылочных типов (справочники, документы). Если передать ссылку на объект, который уже заблокирован другим пользователем, форма может не открыться или данные не сохранятся. В таких случаях:
- 🔄 Передавайте ключ объекта (например,
Ссылка.УникальныйИдентификатор()) и загружайте объект заново в форме.- 🔄 Используйте
ПолучитьОбъект()с обработкой исключений.Использовать .Скопировать() для таблиц значений|Проверить объекты на блокировки|Передавать ключи вместо ссылок|Обработать исключения при получении объектов-->
6. Альтернативные способы: события и расширения
Для гибкой передачи параметров можно использовать события формы или расширения конфигурации. Эти методы полезны, когда:
- 🛠 Нужно передать данные в стандартную форму без изменения её модуля.
- 🛠 Требуется динамическая обработка параметров в зависимости от контекста.
- 🛠 Необходимо интегрировать передачу параметров с бизнес-логикой.
Способ 1: Подписка на событие формы
Создайте обработчик события
ПриОткрытииилиПриАктивизациив расширении:&НаКлиентеПроцедура ФормаПриОткрытии(Форма) Экспорт
Если ЗначениеЗаполнено(Форма.Параметры.Свойство("ДополнительныеДанные")) Тогда
Форма.Элементы.Поле1.Значение = Форма.Параметры.ДополнительныеДанные.Поле1;
КонецЕсли;
КонецПроцедуры
Способ 2: Переопределение метода открытия формы
В расширении конфигурации можно переопределить метод
ОткрытьФорму()для конкретного объекта:&НаКлиентеПроцедура ОткрытьФормуЭлемента(Объект, Режим = Неопределено) Экспорт
Параметры = Новый Структура();
Параметры.Вставить("Объект", Объект);
Параметры.Вставить("Режим", Режим);
Параметры.Вставить("Дополнительно", ПолучитьДополнительныеПараметры());
Возврат СтандартныеПодсистемыКлиентСервер.ОткрытьФорму(
"Справочник.Номенклатура.ФормаЭлемента",
Параметры,
ЭтотОбъект
);
КонецПроцедуры
Расширения конфигурации позволяют модифицировать поведение стандартных форм без изменения их исходного кода, что критично для типового решения.
7. Типичные ошибки и их решения
При передаче параметров в формы разработчики часто сталкиваются с типичными ошибками. Рассмотрим самые распространённые и способы их исправления.
Ошибка 1: Параметры не передаются при повторном открытии формы
Причина: Форма открывается из истории навигации, и параметры не обновляются.
Решение: Используйте
Уникальность.ПоИмениИПараметрамили обрабатывайте событиеПриАктивизации:ОткрытьФорму("Документ.ЗаказПокупателя.ФормаЭлемента", Параметры, , Уникальность.ПоИмениИПараметрам);Ошибка 2: "Неопределённое значение параметра" при открытии формы
Причина: В структуре параметров отсутствует обязательное поле, на которое ссылается форма.
Решение: Всегда проверяйте наличие параметров в
ПриСозданииНаСервере:Если НЕ Параметры.Свойство("Объект") ТогдаВызватьИсключение "Не передан обязательный параметр 'Объект'!";
КонецЕсли;
Ошибка 3: Изменения в таблице значений отражаются в исходной таблице
Причина: Таблица значений передаётся по ссылке, а не копируется.
Решение: Используйте метод
.Скопировать():Параметры.Вставить("Таблица", Источник.Скопировать());Ошибка 4: Форма не открывается с ошибкой "Объект заблокирован"
Причина: Передан объект, который уже редактирует другой пользователь.
Решение: Передавайте ключ объекта (например,
Ссылка.УникальныйИдентификатор()) и загружайте объект заново в форме:Объект = Ссылка.ПолучитьОбъект();Если Объект.ЭтоГруппа() Тогда
ВызватьИсключение "Передан групповой элемент!";
КонецЕсли;
Как отладить передачу параметров?
Используйте отладочную печать в
ПриСозданииНаСервере:Сообщить(Строка(Параметры)); // Выведет структуру параметров в сообщенияхЭто поможет увидеть, какие данные реально передаются в форму.
FAQ: Частые вопросы по передаче параметров в формы 1С
Можно ли передать параметры в форму отчёта?
Да, параметры передаются аналогично. Например, для отчёта
"Продажи.Отчёт":Параметры = Новый Структура("Период, Организация", ТекущийМесяц(), Справочники.Организации.НашаФирма);ОткрытьФорму("Отчёт.Продажи.ФормаОтчёта", Параметры);
В модуле отчёта параметры доступны через
ЭтотОбъект.Параметры.Как передать параметры в модальную форму и получить результат?
Используйте метод
ОткрытьФормуМодально(). Параметры передаются во втором аргументе, а результат возвращается после закрытия формы:Параметры = Новый Структура("Вопрос", "Подтвердите удаление?");Результат = ОткрытьФормуМодально("ОбщийМакет.Подтверждение", Параметры);
Если Результат = Неопределено Тогда
Сообщить("Действие отменено");
Иначе
Сообщить("Пользователь выбрал: " + Результат.Выбор);
КонецЕсли;
В модальной форме результат возвращается через
Закрыть(Результат).Почему параметры теряются при обновлении формы (F5)?
При обновлении формы (клавиша
F5) происходит повторное чтение данных с сервера, но параметры не передаются заново. Чтобы сохранить параметры:
- Храните их в реквизитах формы (например,
ЭтотОбъект.ХранимыеПараметры = Параметры;).- Используйте событие
ПриЧтенииНаСервередля повторной инициализации.Как передать параметры в форму, открываемую из внешней обработки?
При открытии формы из внешней обработки используйте тот же метод
ОткрытьФорму(), но убедитесь, что:
- Обработка имеет права на открытие целевой формы.
- Параметры сериализуемы (не содержат неэкспортируемых объектов).
Пример:
Параметры = Новый Структура();Параметры.Вставить("ВнешнийИдентификатор", "123-456");
ОткрытьФорму("Справочник.Контрагенты.ФормаЭлемента", Параметры);
Можно ли передать в форму объект запроса или результат запроса?
Нет, объект запроса (
Запрос) и результат запроса (РезультатЗапроса) несериализуемы и не могут быть переданы в параметрах. Вместо этого:
- Выгрузите данные в таблицу значений и передавайте её.
- Используйте временные таблицы на сервере.
Пример:
Результат = Запрос.Выполнить();ТЗ = Результат.Выгрузить();
Параметры.Вставить("Данные", ТЗ);