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