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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке конфигураций на управляемых формах часто возникает задача открытия дополнительного окна, в котором пользователь должен выбрать или обработать данные, а затем вернуть результат обратно в основную форму. Давайте разберем, как реализовать этот процесс правильно, учитывая архитектурные особенности платформы 1С:Предприятие.

Понимание ограничений архитектуры

Важно помнить, что в управляемом приложении работа с формами разделена на клиентскую и серверную части. Сервер отвечает за работу с базой данных и вычисления, а клиент — за взаимодействие с пользователем. Основная проблема, с которой сталкиваются разработчики, заключается в попытке открыть форму непосредственно из серверного кода. Это невозможно, так как сервер «не знает» о контексте текущего окна пользователя. Для решения задачи мы будем использовать асинхронный вызов формы с ОписаниеОповещения.

Реализация передачи данных в вызывающей форме

Рассмотрим по шагам, как подготовить данные и инициировать открытие второй формы. Весь код должен исполняться на клиенте.

  1. Подготавливаем параметры (данные, которые нужно передать во вторую форму).
  2. Создаем ОписаниеОповещения, которое укажет системе, какую процедуру вызвать после закрытия второй формы.
  3. Вызываем метод ОткрытьФорму, передавая туда параметры и ссылку на объект оповещения.

// В основной форме
&НаКлиенте
Процедура ОткрытьВторуюФорму(Команда)
    ПараметрыФормы = Новый Структура("КлючПараметра", МоиДанные);
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВторойФормы", ЭтотОбъект);
    ОткрытьФорму("Обработка.МояОбработка.Форма.ВтораяФорма", ПараметрыФормы, ЭтаФорма, , , , Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияВторойФормы(Результат, ДополнительныеПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        // Здесь мы обрабатываем полученные из второй формы данные
        ДанныеИзФормы = Результат.Данные;
    КонецЕсли;
КонецПроцедуры

Как передать и вернуть данные во второй форме

Во второй форме нам нужно принять параметры, обработать их, а при закрытии — передать результат обратно. В методе ПриСозданииНаСервере мы извлекаем переданные параметры.


// Во второй форме
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Получаем переданные данные
    Если Параметры.Свойство("КлючПараметра") Тогда
        МоиДанные = Параметры.КлючПараметра;
    КонецЕсли;
КонецПроцедуры

// При закрытии возвращаем результат
&НаКлиенте
Процедура КомандаЗакрыть(Команда)
    Результат = Новый Структура("Данные", МоиОбработанныеДанные);
    ЭтаФорма.Закрыть(Результат);
КонецПроцедуры

Передача сложных структур данных

Если вам нужно передать не просто одно значение, а список или таблицу, используйте стандартные коллекции 1С. Для табличных данных эффективно использовать Массив или СписокЗначений.

Рассмотрим, как выгрузить колонку из таблицы значений для передачи:


// Пример выгрузки данных перед передачей
СписокНоменклатуры = ТаблицаТоваров.ВыгрузитьКолонку("Номенклатура");
ПараметрыФормы = Новый Структура("СписокТоваров", СписокНоменклатуры);

Если же необходимо передать целую таблицу, можно использовать ЗначениеВСтрокуВнутр (для небольших объемов) или поместить данные во ВременноеХранилище, передав второй форме только адрес этого хранилища. Это лучший способ для передачи больших объемов данных между формами.

Почему это лучший способ?

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

Совет: Всегда проверяйте возвращаемый Результат на Неопределено. Пользователь может просто закрыть окно крестиком, и в этом случае форма вернет именно это значение, что предотвратит ошибки в вашем коде.

← На главную