Как получить данные из формы обработки после ее закрытия в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Основной способ: Использование объекта «СписокЗначений» в качестве параметра

В платформе 1С 7.7 функция ОткрытьФормуМодально() не возвращает значения, сформированные внутри формы (она возвращает числовой статус успешности открытия). Однако второй параметр этого метода позволяет передать в открываемое окно ссылку на объект 1С. Поскольку передача сложных типов (таких как СписокЗначений или ТаблицаЗначений) происходит по ссылке, любые изменения содержимого этого объекта, сделанные внутри модальной формы, остаются доступными в исходном модуле после закрытия окна.

Разберем реализацию этого механизма по шагам.

Шаг 1. Код в вызывающей форме (модуль формы документа):

Создадим объект СписокЗначений, наполним его начальными параметрами и передадим в метод ОткрытьФормуМодально(). После завершения модального режима считаем измененные значения обратно:


// Создаем контейнер параметров
СпПарам = СоздатьОбъект("СписокЗначений");
СпПарам.ДобавитьЗначение("", "Реквизит");
СпПарам.ДобавитьЗначение(ТекущаяДата(), "ДатаЗагрузки");

// Открываем форму обработки модально
ОткрытьФормуМодально("Обработка.Загрузить", СпПарам);

// Извлекаем заполненные пользователем данные
ЗначениеРеквизита = СпПарам.Получить("Реквизит");
ВыбраннаяДата = СпПарам.Получить("ДатаЗагрузки");

Если ПустоеЗначение(ЗначениеРеквизита) = 0 Тогда
    // Выполняем дальнейшую обработку полученных данных
    Сообщить("Получены данные: " + СокрЛП(ЗначениеРеквизита));
КонецЕсли;

Шаг 2. Код в открываемой форме (модуль формы обработки):

В вызываемой форме обратимся к переданному объекту через предопределенное свойство Форма.Параметр. При закрытии формы запишем в список актуальные значения реквизитов диалога:


// Процедура обработки нажатия кнопки «ОК» или «Закрыть» на форме
Процедура ПоКнопкеОК()
    // Проверяем корректность переданного параметра
    Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
        Форма.Параметр.Установить("Реквизит", РеквизитДиалога);
        Форма.Параметр.Установить("ДатаЗагрузки", ДатаДиалога);
    КонецЕсли;
    
    // Закрываем модальную форму
    Форма.Закрыть(1);
КонецПроцедуры

Особенности и важные правила работы с модальными формами в 1С 7.7

  1. Свойство Форма.Параметр доступно только для чтения как ссылка. Мы не можем переназначить сам параметр выражением вида Форма.Параметр = "НовоеЗначение";. Допускается только модификация внутреннего содержимого переданного агрегатного объекта (вызовы методов Установить(), ДобавитьЗначение() и т.д.).
  2. Обработка закрытия формы по системному крестику или клавише Esc. Если пользователь закроет окно нажатием на крестик в заголовке окна или клавишей Esc, код процедуры пользовательской кнопки не сработает. Чтобы гарантированно отработать закрытие или заблокировать некорректный выход, разместим проверку в предопределенной процедуре ПриЗакрытии():

Процедура ПриЗакрытии()
    // Если требуется запретить закрытие при незаполненных полях
    Если ПустоеЗначение(РеквизитДиалога) = 1 Тогда
        Предупреждение("Заполните обязательные реквизиты перед закрытием!");
        СтатусВозврата(0); // Отменяет закрытие формы
    КонецЕсли;
КонецПроцедуры

Передача сложных табличных данных через «ТаблицуЗначений»

Если из формы обработки необходимо вернуть не отдельные переменные, а целый массив строк (например, перечень подобранных товаров с количеством и ценами), аналогичным образом передадим объект ТаблицаЗначений:


// В модуле вызывающего документа:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Товар");
ТЗ.НоваяКолонка("Количество");

ОткрытьФормуМодально("Обработка.ПодборНоменклатуры", ТЗ);

// Обходим полученную и заполненную в обработке таблицу
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    НоваяСтрока();
    Товар = ТЗ.Товар;
    Количество = ТЗ.Количество;
КонецЦикла;

Альтернативные способы обмена данными

Посмотрим на другие варианты передачи данных, которые применяются в типовых конфигурациях 1С 7.7 в зависимости от архитектурной задачи:

  1. Глобальные переменные. В Глобальном модуле объявим экспортную переменную (например, Перем глБуферОбмена Экспорт;). В таком случае открываемая форма напрямую записывает в нее данные, а вызывающий модуль считывает значение сразу после метода ОткрытьФормуМодально(). Этот способ прост, но ухудшает читаемость и изолированность кода.
  2. Системные функции СохранитьЗначение() и ВосстановитьЗначение(). Позволяют передать данные через сохранение во временное хранилище настроек пользователя по уникальному строковому ключу.
  3. Механизм подбора (немодальный режим). Если форма открывается в режиме подбора через ОткрытьФорму("Обработка.Подбор", Контекст), передача выбранных позиций обратно в документ выполняется через вызов метода Форма.ВыполнитьВыбор(Значение) с последующей обработкой в предопределенной процедуре документа ОбработкаПодбора(ЗначениеВыбора).
← На главную