← Назад к вопросам

Как вернуть таблицу значений из второй формы в первую?

1.0 Junior🔥 161 комментариев
#Объекты метаданных#Формы и интерфейс

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Возврат таблицы значений из второй формы в первую

Суть проблемы

При работе с модальными формами в 1С часто возникает необходимость получить результаты работы (модифицированную таблицу значений) из второй формы обратно в первую форму. Это классический паттерн для редактирования данных в отдельном окне.

Способ 1: Использование ОткрытьФорму с параметром

Это самый простой и рекомендуемый способ — передача таблицы через параметры формы.

Первая форма (главная):

// Процедура открытия второй формы
&НаКлиенте
Процедура КнопкаРедактировать()
    
    // Создаём или получаем таблицу значений
    ТаблицаДанных = Новая ТаблицаЗначений();
    ТаблицаДанных.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
    ТаблицаДанных.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    ТаблицаДанных.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    
    // Добавим тестовые данные
    НоваяСтрока = ТаблицаДанных.Добавить();
    НоваяСтрока.Артикул = "АРТ-001";
    НоваяСтрока.Количество = 10;
    НоваяСтрока.Цена = 1000;
    
    // Открываем форму и передаём таблицу
    ПараметрыФормы = Новый Структура();
    ПараметрыФормы.Вставить("ТаблицаДанных", ТаблицаДанных.Скопировать());
    
    ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаРедактирования", 
                  ПараметрыФормы, 
                  ЭтотОбъект);
    
КонецПроцедуры

Вторая форма (редактирование):

// В разделе глобальных переменных формы добавляем:
Переменная ТаблицаДанных;
Переменная ФормаОткрывателя;

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

&НаКлиенте
Процедура ОбновитьТабличнуюЧасть()
    
    // Очищаем табличную часть
    Таблица.Очистить();
    
    // Заполняем из переданной таблицы
    Для Каждого Строка Из ТаблицаДанных Цикл
        НоваяСтрока = Таблица.Добавить();
        НоваяСтрока.Артикул = Строка.Артикул;
        НоваяСтрока.Количество = Строка.Количество;
        НоваяСтрока.Цена = Строка.Цена;
    КонецЦикла;
    
КонецПроцедуры

// При нажатии кнопки ОК
&НаКлиенте
Процедура КнопкаОК()
    
    // Обновляем данные из табличной части
    ТаблицаДанных.Очистить();
    
    Для Каждого Строка Из Таблица Цикл
        НоваяСтрока = ТаблицаДанных.Добавить();
        НоваяСтрока.Артикул = Строка.Артикул;
        НоваяСтрока.Количество = Строка.Количество;
        НоваяСтрока.Цена = Строка.Цена;
    КонецЦикла;
    
    // Закрываем форму
    ЭтаФорма.Закрыть();
    
КонецПроцедуры

Возвращение результата (в первой форме):

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

// Процедура-обработчик закрытия формы
&НаКлиенте
Процедура ОбработкаРезультата(Результат, Параметры) Экспорт
    
    Если Результат <> Неопределено Тогда
        // Получаем результат и обновляем данные в первой форме
        ТаблицаДанныхОбновленная = Результат;
        
        // Обновляем отображение или сохраняем данные
        Сообщение("Данные обновлены успешно");
    КонецЕсли;
    
КонецПроцедуры

Способ 2: Использование возвращаемого значения

// Вторая форма — возвращаем таблицу через ОкончаниеРаботы
&НаКлиенте
Процедура КнопкаОК()
    
    // Подготавливаем результат
    ТаблицаДанныхРезультат = ТаблицаДанных.Скопировать();
    
    // Закрываем форму с результатом
    ЭтаФорма.Закрыть(ТаблицаДанныхРезультат);
    
КонецПроцедуры

Способ 3: Обмен через глобальный объект/переменную

Менее рекомендуемый способ, но иногда применяется:

// На клиенте в модуле формы первой
&НаКлиенте
Переменная ПоследняяТаблица;

Процедура КнопкаРедактировать()
    ПараметрыФормы = Новый Структура("ВходнаяТаблица", ТаблицаДанных);
    ОткрытьФорму("...", ПараметрыФормы);
КонецПроцедуры

Процедура ПолучитьРезультат() Экспорт
    Возврат ПоследняяТаблица;
КонецПроцедуры

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

Рекомендации по выбору способа

СпособПлюсыМинусыКогда использовать
Параметры + ОповещениеБезопасно, асинхронно, стандартноБолее сложный кодРекомендуется — стандартный подход
Возвращаемое значениеПросто и понятноМодальное окно блокируетПростые случаи, модальные формы
Глобальная переменнаяБыстроСложно отлаживать, конфликтыНе рекомендуется

Практические советы

  • Всегда копируй таблицу при передаче, чтобы избежать неожиданных изменений
  • Используй модальный режим для синхронизации данных
  • Обрабатывай отказ пользователя (закрытие без сохранения)
  • Для больших таблиц передавай ссылку на объект БД, а не саму таблицу
  • Используй ОповещениеОЗавершении для асинхронной обработки результатов

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