Передача данных между формами — одна из самых частых задач при разработке в среде «1С:Предприятие 8». Несмотря на кажущуюся простоту, начинающие разработчики часто сталкиваются с тем, что переданные параметры «теряются» или вовсе не попадают в форму из-за синтаксических ошибок. В этой статье мы подробно разберем, как правильно формировать структуру параметров, где именно их нужно перехватывать и как обеспечить их доступность на протяжении всей работы пользователя с формой.
Рассмотрим ситуацию, с которой столкнулся автор темы. Попытка создать структуру параметров следующим образом является ошибочной:
ПараметрыНовойФормы = Новый Структура("Ключ", "Создание", ТекСтрока.ВтулкиВПроизводстве, Истина);
В чем здесь проблема? Проанализируем работу конструктора Структура. Согласно синтаксису платформы 1С, первым параметром конструктора должна идти строка, содержащая имена ключей, перечисленные через запятую. Все последующие аргументы конструктора — это значения для этих ключей в соответствующем порядке.
Правильный вариант написания конструктора для двух параметров выглядит так:
// Все имена ключей пишем в одной строке через запятую
ПараметрыНовойФормы = Новый Структура("Ключ, Создание", ТекСтрока.ВтулкиВПроизводстве, Истина);
Если же мы используем вариант автора, платформа воспринимает «Ключ» как имя единственного свойства, а остальные аргументы либо игнорируются, либо вызывают ошибку исполнения в зависимости от контекста и версии платформы. Чтобы избежать путаницы с запятыми внутри строки, мы рекомендуем использовать более наглядный метод Вставить().
Когда параметров много, легко ошибиться в последовательности запятых внутри конструктора. Рассмотрим более "чистый" подход, который повышает читабельность кода и упрощает отладку:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", ТекСтрока.ВтулкиВПроизводстве);
ПараметрыФормы.Вставить("Создание", Истина);
ПараметрыФормы.Вставить("ТолькоПросмотр", Ложь);
// Теперь открываем форму
ОткрытьФорму("Документ.ХХХ_ВтулкиВПроизводстве.Форма.ФормаДокументаУпрощенная", ПараметрыФормы);
Использование метода Вставить гарантирует, что каждый параметр будет четко сопоставлен со своим значением. Это особенно важно в больших проектах, где количество передаваемых настроек может исчисляться десятками.
Выясним причину, по которой параметры могут быть "не видны" в коде формы. Важно помнить о жизненном цикле формы и области видимости коллекции Параметры. Основная точка входа для обработки переданных данных — это серверный обработчик события ПриСозданииНаСервере.
Проанализируем пример получения данных в модуле формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие нашего пользовательского параметра
Если Параметры.Свойство("Создание") Тогда
Если Параметры.Создание = Истина Тогда
// Выполняем логику для режима создания
Сообщить("Форма открыта в режиме создания!");
КонецЕсли;
КонецЕсли;
// Работа со стандартным параметром "Ключ"
Если ЗначениеЗаполнено(Параметры.Ключ) Тогда
// Платформа сама найдет объект по ссылке в Параметры.Ключ
КонецЕсли;
КонецПроцедуры
Важный нюанс: коллекция Параметры доступна только в момент инициализации формы. Если вы попытаетесь обратиться к ней позже (например, в клиентском обработчике нажатия кнопки или в серверном методе ПриЧтенииНаСервере), ваших кастомных параметров там может не оказаться, если они не являются системно зарезервированными.
Что делать, если значение параметра Создание нужно использовать не только при инициализации, но и, например, при записи документа или при совершении интерактивных действий на клиенте? Для этого нам необходимо "приземлить" параметр в данные формы.
Рассмотрим пошаговый алгоритм сохранения параметров:
РежимСоздания с типом Булево).ПриСозданииНаСервере запишите значение из параметров в этот реквизит.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Сохраняем значение во внутренний реквизит формы для доступа из других методов
Параметры.Свойство("Создание", ЭтаФорма.РежимСоздания);
КонецПроцедуры
Теперь значение реквизита РежимСоздания будет доступно как в серверном, так и в клиентском коде формы на протяжении всего времени её существования.
Проанализируем ситуацию с системными параметрами. Платформа 1С имеет ряд зарезервированных имен в структуре параметров, которые обрабатываются автоматически:
Ключ — используется для передачи ссылки на существующий объект. Если он передан, форма откроется для редактирования именно этого объекта.ЗначенияЗаполнения — структура, данные из которой автоматически подставляются в реквизиты нового объекта.РежимВыбора — булево значение, определяющее, открывается ли форма для выбора значения.Если вы передаете параметр с собственным именем (как в нашем примере Создание), платформа не будет предпринимать никаких автоматических действий. Вся ответственность за его обработку лежит на разработчике в процедуре ПриСозданииНаСервере.
В тексте обсуждения упоминался метод ПолучитьФорму. Рассмотрим, почему в современной разработке (особенно на управляемых формах) предпочтительнее использовать ОткрытьФорму.
Метод ОткрытьФорму является более высокоуровневым и безопасным. Он сразу создает форму, выполняет инициализацию на сервере и открывает её на клиенте. Метод ПолучитьФорму возвращает объект формы, с которым можно выполнить дополнительные манипуляции перед открытием, однако это часто приводит к избыточным вызовам между клиентом и сервером, что негативно сказывается на производительности тонкого клиента.
Посмотрим на рекомендуемый стандарт вызова:
// Рекомендуемый способ открытия
ПараметрыОткрытия = Новый Структура("Ключ", СсылкаНаОбъект);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыОткрытия);
В сообщениях форума упоминались ДополнительныеСвойства. Важно не путать их с параметрами формы. ДополнительныеСвойства принадлежат самому объекту (документу или справочнику) и используются для передачи служебной информации в модули объекта (например, из формы в процедуру ПередЗаписью модуля объекта). Параметры формы же живут только в контексте экранного интерфейса. Используйте параметры формы для управления визуальной логикой, а дополнительные свойства — для управления логикой проведения и записи данных.
Подводя итог нашему разбору, отметим: корректный синтаксис структуры и понимание серверного контекста ПриСозданииНаСервере — это залог успешной передачи данных между объектами системы. Всегда проверяйте типы передаваемых данных и не забывайте сохранять важные параметры в реквизиты формы, если они потребуются вам в дальнейшем.