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

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

Как получить данные открытой формы 1С

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

Задача получить данные открытой формы возникает в 1С постоянно: пользователь выбрал элемент в форме выбора, заполнил данные в подчинённой форме или открыл отчёт — и вызывающему коду нужно забрать результат. Главная сложность в том, что в управляемом приложении формы существуют на клиенте, а данные объекта — на сервере, и напрямую «залезть» в чужую форму извне нельзя.

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

Ниже разобраны рабочие способы с примерами кода, ограничения каждого подхода и типичные ошибки, из-за которых данные теряются или форма падает с ошибкой.

Как устроен обмен данными между формами в управляемом приложении

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

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

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

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

В форме выбора платформа при стандартном выборе сама вызывает ОповеститьОВыборе(ВыбранноеЗначение). В форме-владельце нужно реализовать обработчик ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора), который и получит данные. Если форма выбора нестандартная, вызовите ОповеститьОВыборе() вручную перед закрытием.

// Форма-владелец: открытие формы выбора

&НаКлиенте

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

ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", , ЭтотОбъект);

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

// Обработчик получения данных

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Контрагенты") Тогда

Объект.Контрагент = ВыбранноеЗначение;

КонецЕсли;

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

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

Получение результата через ОписаниеОповещения при закрытии формы

Когда форма не просто выбирает ссылку, а возвращает структуру данных — например, введённые пользователем параметры, — удобнее передать обработчик результата явно через ОписаниеОповещения. Оно передаётся последним параметром в ОткрытьФорму().

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

// Открывающая сторона

&НаКлиенте

Процедура НастроитьОтбор(Команда)

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

ОткрытьФорму("Обработка.Подбор.Форма.НастройкаОтбора", , ЭтотОбъект, , , , Оповещение);

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

&НаКлиенте

Процедура ПослеНастройкиОтбора(Результат, ДопПараметры) Экспорт

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

Возврат; // пользователь закрыл форму без результата

КонецЕсли;

ПрименитьОтбор(Результат);

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

Получение данных из уже открытой формы через глобальный контекст

Иногда форма уже открыта не вашим кодом, а данные из неё нужны — например, из внешней обработки или другой формы того же сеанса. Прямого API «дай мне форму документа №…» нет, но можно использовать то, что открытые формы доступны как свойства глобального контекста через их ключ уникальности, либо организовать обмен через Оповестить() и ОбработкаОповещения().

Более надёжный вариант — широковещательное оповещение. Форма-источник вызывает Оповестить("ПередатьДанные", Данные, УникальныйИдентификатор), а все формы, реализовавшие ОбработкаОповещения(ИмяСобытия, Параметр, Источник), получают данные и фильтруют их по имени события. Так работает и обратный запрос: форма-получатель шлёт оповещение «ЗапроситьДанные», форма-источник в ответ шлёт оповещение с данными.

// Форма-источник: ответ на запрос

&НаКлиенте

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

Если ИмяСобытия = "ЗапроситьДанныеДокумента" Тогда

Данные = Новый Структура("Номер, Дата, Контрагент",

Объект.Номер, Объект.Дата, Объект.Контрагент);

Оповестить("ДанныеДокумента", Данные, ЭтотОбъект.УникальныйИдентификатор);

КонецЕсли;

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

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

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

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

Порядок действий при передаче через параметры
  1. 1
    Сформируйте структуру с параметрами в вызывающем коде
  2. 2
    Передайте её вторым аргументом в ОткрытьФорму()
  3. 3
    В открываемой форме прочитайте Параметры в ПриСозданииНаСервере
  4. 4
    Проверьте наличие каждого параметра через Параметры.Свойство() — отсутствующий параметр вызовет ошибку
  5. 5
    Для возврата результата добавьте ОписаниеОповещения или ОповеститьОВыборе

Альтернативы: когда оповещения не подходят

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

Сравнение вариантов обмена

ОповеститьОВыборе / ОбработкаВыбора

Подходит для форм выбора и подбора. Ограничение: работает только между формой-владельцем и открытой из неё формой.

ОписаниеОповещения + Закрыть(Результат)

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

Оповестить / ОбработкаОповещения

Широковещательный обмен между любыми открытыми формами сеанса. Ограничение: нужна дисциплина имён событий, иначе формы начнут реагировать на чужие оповещения.

Регистры сведений / параметры сеанса

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

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

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

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

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

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

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

Срабатывание обработчика
Норма

Точка останова в ОбработкаВыбора или процедуре оповещения срабатывает после действия в открытой форме

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

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

Состав данных
Норма

Структура результата содержит все ожидаемые ключи с корректными типами

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

Часть ключей отсутствует или значения имеют неожиданный тип — источник формирует данные иначе

Отмена действия
Норма

При закрытии формы крестиком результат равен Неопределено и код корректно это обрабатывает

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

При отмене возникает ошибка обращения к полям результата

FAQ

Можно ли получить данные формы, открытой другим пользователем?

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

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

Табличную часть нельзя передать напрямую. На сервере выгрузите её в массив структур или таблицу значений, поместите результат в структуру результата и передайте через Закрыть(Результат) или ОповеститьОВыборе.

Почему ОбработкаВыбора не вызывается, хотя форма выбора открывается?

Чаще всего форма открыта без указания владельца — третий параметр ОткрытьФорму() пуст. Укажите ЭтотОбъект или элемент формы владельцем. Вторая причина: в нестандартной форме выбора не вызывается ОповеститьОВыборе — добавьте вызов вручную.

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

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

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

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

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

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

Итог

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

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