К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как передать данные из одной формы в другую в 1С

Способы передачи данных между формами в 1С: параметры открытия, ОписаниеОповещения, Оповестить, временное хранилище. Примеры кода и типичные ошибки.

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

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

Ниже разобраны рабочие способы с примерами кода, условиями применения и типичными ошибками. Примеры приведены для управляемых форм, как наиболее востребованного сценария.

Как выбрать способ передачи данных

Прежде чем писать код, определите направление передачи. Если данные нужны форме в момент открытия (например, отбор, ключ записи, режим работы), используются параметры формы. Если данные появляются позже — в результате действий пользователя в открытой форме — нужен механизм оповещений.

Второй критерий — объём данных. Ссылки, строки, числа и небольшие структуры спокойно передаются через параметры. Таблицы значений, результаты запросов и другие объёмные данные лучше помещать во временное хранилище и передавать только адрес.

Третий критерий — время жизни связи между формами. Если форма-источник закрывается сразу после передачи, оповещение сработает корректно. Если нужна постоянная связь между двумя открытыми формами, потребуется либо владелец формы, либо глобальные оповещения с уникальными именами событий.

Маршрут решения

Как выбрать действие

Данные известны в момент открытия формыПередайте их через структуру параметров в ОткрытьФорму
Данные появляются после действий пользователя в открытой формеИспользуйте ОписаниеОповещения или Оповестить
Передаётся таблица значений или большой набор данныхПоместите данные во временное хранилище и передайте адрес
Нужен обмен между двумя независимыми открытыми формамиИспользуйте Оповестить с уникальным именем события и ОбработкаОповещения

Передача данных через параметры при открытии формы

Самый простой и надёжный способ — передать данные в момент вызова ОткрытьФорму. Вторым параметром метода указывается структура, где ключи — имена параметров, а значения — передаваемые данные.

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Организация", ТекущаяОрганизация);

ПараметрыФормы.Вставить("ДатаНачала", НачалоМесяца(ТекущаяДата()));

ОткрытьФорму("Обработка.ПодборТоваров.Форма.ФормаПодбора",

ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("Организация") Тогда

Организация = Параметры.Организация;

КонецЕсли;

КонецПроцедуры

Обратите внимание: проверка Свойство() обязательна. Если форма открывается из разных мест (в том числе стандартными командами интерфейса), часть параметров может отсутствовать, и прямое обращение вызовет ошибку.

Для форм объектов (документов, справочников) можно объявить собственные параметры в конфигураторе на закладке «Параметры» формы. Тогда платформа сама контролирует их тип, а неизвестные параметры будут отсекаться.

Возврат данных из открытой формы через оповещение

Когда пользователь что-то выбрал в открытой форме (товар в подборе, период в диалоге, настройки в окне параметров), результат нужно вернуть в форму-источник. Для этого при открытии передаётся ОписаниеОповещения — указание, какую процедуру вызвать при закрытии формы.

&НаКлиенте

Процедура ПодобратьТовары(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеВыбораТовара", ЭтаФорма);

ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", , ЭтаФорма, , , ,

Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте

Процедура ПослеВыбораТовара(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = Результат;

КонецЕсли;

КонецПроцедуры

В открываемой форме результат возвращается методом Закрыть(Результат). Значение, переданное в Закрыть(), попадёт в первый параметр процедуры оповещения. Если пользователь закрыл форму крестиком без выбора, результат будет Неопределено — это нужно обрабатывать.

Второй параметр описания оповещения — произвольные дополнительные параметры. Через них удобно передавать контекст: например, идентификатор строки табличной части, для которой выполнялся подбор.

Порядок действий для возврата значения
  1. 1
    Создайте в форме-источнике экспортную клиентскую процедуру-обработчик с двумя параметрами: Результат и ДополнительныеПараметры
  2. 2
    Сформируйте ОписаниеОповещения с именем этой процедуры
  3. 3
    Передайте описание оповещения в ОткрытьФорму
  4. 4
    В открываемой форме по команде выбора вызовите Закрыть(ВыбранноеЗначение)
  5. 5
    В обработчике проверьте Результат на Неопределено и обработайте значение

Передача данных между открытыми формами через Оповестить

Метод Оповестить позволяет отправить сообщение всем открытым формам без закрытия текущей. Это подходит для сценариев, когда форма подбора остаётся открытой и пользователь многократно переносит позиции в документ.

&НаКлиенте

Процедура Выбрать(Команда)

ОповеститьОВыборе(ТекущаяНоменклатура);

// или для произвольного события:

Оповестить("ПодобранТовар", ТекущаяНоменклатура, "ФормаПодбора");

КонецПроцедуры

Форма-приёмник получает данные в обработчике ОбработкаОповещения:

&НаКлиенте

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "ПодобранТовар" Тогда

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = Параметр;

КонецЕсли;

КонецПроцедуры

Критически важно фильтровать события по имени и источнику: ОбработкаОповещения срабатывает на множество системных событий (запись элементов справочников, проведение документов). Без проверки ИмяСобытия ваша логика будет выполняться на каждое чужое событие, что приведёт к ошибкам и лишним серверным вызовам.

Передача больших данных через временное хранилище

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

&НаСервере

Функция ПодготовитьДанныеДляПередачи()

ТаблицаДанных = Объект.Товары.Выгрузить();

Адрес = ПоместитьВоВременноеХранилище(ТаблицаДанных,

Новый УникальныйИдентификатор);

Возврат Адрес;

КонецФункции

В форме-приёмнике данные извлекаются методом ПолучитьИзВременногоХранилища:

&НаСервере

Процедура ЗагрузитьДанные(АдресХранилища)

ТаблицаДанных = ПолучитьИзВременногоХранилища(АдресХранилища);

Объект.Товары.Загрузить(ТаблицаДанных);

КонецПроцедуры

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

Типичные ошибки
01
Передача таблицы значений через параметры формы без хранилища — платформа не сериализует такие данные, возникает ошибка
02
Обращение к Параметры вне ПриСозданииНаСервере — коллекция уже очищена, значения потеряны
03
Отсутствие проверки Результат на Неопределено в обработчике оповещения — ошибка при закрытии формы крестиком
04
ОбработкаОповещения без фильтра по ИмяСобытия — логика срабатывает на чужие системные события
05
Помещение в хранилище без идентификатора формы — данные удаляются раньше, чем их успевают прочитать

Обращение к форме через владельца и открытые окна

Если форма открыта с указанием владельца (третий параметр ОткрытьФорму), то внутри неё доступно свойство ВладелецФормы. Через него можно обратиться к реквизитам и экспортным процедурам родительской формы напрямую.

&НаКлиенте

Процедура ПередатьВДокумент(Команда)

ВладелецФормы.УстановитьСклад(ВыбранныйСклад);

КонецПроцедуры

Этот способ создаёт жёсткую связность: форма подбора «знает» о существовании конкретной процедуры в форме документа. При изменении имени процедуры или открытии подбора из другого места код сломается. Поэтому прямое обращение через владельца допустимо для простых внутренних форм, а для переиспользуемых форм лучше подходят оповещения.

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

Сравнение способов передачи

Параметры формы

Для данных, известных при открытии. Просто и надёжно, но работает только в момент создания формы

ОписаниеОповещения

Для возврата результата при закрытии формы. Требует экспортной процедуры-обработчика

Оповестить

Для обмена между открытыми формами без закрытия. Требует фильтрации событий

Временное хранилище

Для таблиц и больших данных. Передаётся только адрес, нужен контроль времени жизни

ВладелецФормы

Для тесно связанных форм. Быстро, но создаёт жёсткую зависимость между формами

Проверка результата и отладка

После внедрения передачи данных проверьте три сценария: штатную передачу, закрытие формы без выбора и повторное открытие формы. Чаще всего ошибки проявляются именно во втором и третьем случаях.

Для отладки используйте вывод значений через Сообщить или точку останова в конфигураторе в обработчиках ПриСозданииНаСервере и ОбработкаОповещения. Убедитесь, что параметры доходят в неизменном виде, а типы данных на приёмной стороне соответствуют ожиданиям.

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

Контрольные точки

Как проверить результат

Значения параметров в ПриСозданииНаСервере
Норма

Параметры содержат переданные значения нужных типов

Тревожный признак

Параметр отсутствует или имеет тип Неопределено

Закрытие формы без выбора
Норма

Обработчик получает Неопределено и корректно завершается

Тревожный признак

Ошибка при попытке обратиться к свойствам результата

Повторное открытие формы
Норма

Каждый раз передаются актуальные данные, старое состояние не мешает

Тревожный признак

Форма показывает устаревшие значения из прошлого открытия

События оповещения
Норма

ОбработкаОповещения срабатывает только на ваше имя события

Тревожный признак

Логика выполняется при записи любых объектов в системе

Частые вопросы

Можно ли передать данные в уже открытую форму без её закрытия?

Да, для этого используется метод Оповестить с уникальным именем события. Форма-приёмник получает данные в обработчике ОбработкаОповещения. Альтернатива — экспортная процедура формы-приёмника, вызванная через ссылку на форму, но такой подход создаёт жёсткую связность.

Почему в открываемой форме параметры пустые?

Чаще всего параметры читаются не в ПриСозданииНаСервере, а позже — коллекция Параметры к этому моменту уже очищена. Вторая причина: несовпадение имён ключей структуры при передаче и чтении, регистр букв при этом не важен, но опечатки критичны. Третья — форма открыта стандартной командой интерфейса, а не вашим вызовом ОткрытьФорму.

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

Напрямую таблицу значений через параметры передать нельзя. Поместите её во временное хранилище на сервере методом ПоместитьВоВременноеХранилище, передайте полученный адрес строкой, а в форме-приёмнике извлеките данные через ПолучитьИзВременногоХранилища. Укажите идентификатор формы-приёмника, чтобы данные не удалились раньше времени.

Чем отличается ОповеститьОВыборе от Оповестить?

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

Работает ли передача через параметры в обычных формах?

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

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

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

Итог

Что важно запомнить

Данные в открываемую форму передаются параметрами, обратно — через ОписаниеОповещения и Закрыть(Результат), между открытыми формами — через Оповестить. Большие данные передают адресом временного хранилища. Всегда проверяйте результат на Неопределено и фильтруйте оповещения по имени события.