← Назад к вопросам
Как вернуть таблицу значений из второй формы в первую?
1.0 Junior🔥 161 комментариев
#Объекты метаданных#Формы и интерфейс
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Возврат таблицы значений из второй формы в первую
Суть проблемы
При работе с модальными формами в 1С часто возникает необходимость получить результаты работы (модифицированную таблицу значений) из второй формы обратно в первую форму. Это классический паттерн для редактирования данных в отдельном окне.
Способ 1: Использование ОткрытьФорму с параметром
Это самый простой и рекомендуемый способ — передача таблицы через параметры формы.
Первая форма (главная):
// Процедура открытия второй формы
&НаКлиенте
Процедура КнопкаРедактировать()
// Создаём или получаем таблицу значений
ТаблицаДанных = Новая ТаблицаЗначений();
ТаблицаДанных.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
ТаблицаДанных.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТаблицаДанных.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
// Добавим тестовые данные
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.Артикул = "АРТ-001";
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 1000;
// Открываем форму и передаём таблицу
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("ТаблицаДанных", ТаблицаДанных.Скопировать());
ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаРедактирования",
ПараметрыФормы,
ЭтотОбъект);
КонецПроцедуры
Вторая форма (редактирование):
// В разделе глобальных переменных формы добавляем:
Переменная ТаблицаДанных;
Переменная ФормаОткрывателя;
// При открытии формы (процедура ПриОткрытии)
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Получаем параметры
ТаблицаДанных = Параметры.ТаблицаДанных.Скопировать();
// Заполняем табличную часть формы
ОбновитьТабличнуюЧасть();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьТабличнуюЧасть()
// Очищаем табличную часть
Таблица.Очистить();
// Заполняем из переданной таблицы
Для Каждого Строка Из ТаблицаДанных Цикл
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Артикул = Строка.Артикул;
НоваяСтрока.Количество = Строка.Количество;
НоваяСтрока.Цена = Строка.Цена;
КонецЦикла;
КонецПроцедуры
// При нажатии кнопки ОК
&НаКлиенте
Процедура КнопкаОК()
// Обновляем данные из табличной части
ТаблицаДанных.Очистить();
Для Каждого Строка Из Таблица Цикл
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.Артикул = Строка.Артикул;
НоваяСтрока.Количество = Строка.Количество;
НоваяСтрока.Цена = Строка.Цена;
КонецЦикла;
// Закрываем форму
ЭтаФорма.Закрыть();
КонецПроцедуры
Возвращение результата (в первой форме):
// После открытия формы нужно обработать результат
&НаКлиенте
Процедура КнопкаРедактировать()
// ... код из примера выше ...
// Открываем форму и обрабатываем результат
ОповещениеОЗавершении = Новый ОповещениеОЗавершении("ОбработкаРезультата", ЭтотОбъект);
ОткрытьФорму("Обработка.МояОбработка.Форма.ФормаРедактирования",
ПараметрыФормы,
ЭтотОбъект,
,
,
,
ОповещениеОЗавершении,
РежимОткрытияОкна.Модальное);
КонецПроцедуры
// Процедура-обработчик закрытия формы
&НаКлиенте
Процедура ОбработкаРезультата(Результат, Параметры) Экспорт
Если Результат <> Неопределено Тогда
// Получаем результат и обновляем данные в первой форме
ТаблицаДанныхОбновленная = Результат;
// Обновляем отображение или сохраняем данные
Сообщение("Данные обновлены успешно");
КонецЕсли;
КонецПроцедуры
Способ 2: Использование возвращаемого значения
// Вторая форма — возвращаем таблицу через ОкончаниеРаботы
&НаКлиенте
Процедура КнопкаОК()
// Подготавливаем результат
ТаблицаДанныхРезультат = ТаблицаДанных.Скопировать();
// Закрываем форму с результатом
ЭтаФорма.Закрыть(ТаблицаДанныхРезультат);
КонецПроцедуры
Способ 3: Обмен через глобальный объект/переменную
Менее рекомендуемый способ, но иногда применяется:
// На клиенте в модуле формы первой
&НаКлиенте
Переменная ПоследняяТаблица;
Процедура КнопкаРедактировать()
ПараметрыФормы = Новый Структура("ВходнаяТаблица", ТаблицаДанных);
ОткрытьФорму("...", ПараметрыФормы);
КонецПроцедуры
Процедура ПолучитьРезультат() Экспорт
Возврат ПоследняяТаблица;
КонецПроцедуры
// Во второй форме
&НаКлиенте
Процедура КнопкаОК()
ФормаОткрывателя = Параметры.Владелец;
ФормаОткрывателя.ПоследняяТаблица = ТаблицаДанных.Скопировать();
ЭтаФорма.Закрыть();
КонецПроцедуры
Рекомендации по выбору способа
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Параметры + Оповещение | Безопасно, асинхронно, стандартно | Более сложный код | Рекомендуется — стандартный подход |
| Возвращаемое значение | Просто и понятно | Модальное окно блокирует | Простые случаи, модальные формы |
| Глобальная переменная | Быстро | Сложно отлаживать, конфликты | Не рекомендуется |
Практические советы
- Всегда копируй таблицу при передаче, чтобы избежать неожиданных изменений
- Используй модальный режим для синхронизации данных
- Обрабатывай отказ пользователя (закрытие без сохранения)
- Для больших таблиц передавай ссылку на объект БД, а не саму таблицу
- Используй ОповещениеОЗавершении для асинхронной обработки результатов
Правильный обмен данными между формами критичен для удобства пользователя и стабильности приложения.