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