Разработка и Конфигурация · 11 мин
Как получить данные открытой формы 1С
Способы получить данные открытой формы 1С: через ОповеститьОВыборе, ОписаниеОповещения, глобальный контекст и параметры формы. Примеры кода и типичные ошибки.
Задача получить данные открытой формы возникает в 1С постоянно: пользователь выбрал элемент в форме выбора, заполнил данные в подчинённой форме или открыл отчёт — и вызывающему коду нужно забрать результат. Главная сложность в том, что в управляемом приложении формы существуют на клиенте, а данные объекта — на сервере, и напрямую «залезть» в чужую форму извне нельзя.
Правильный подход зависит от того, кто инициатор обмена. Если ваша форма открыла другую форму и ждёт от неё результат — используются механизмы оповещения о выборе и описания оповещений. Если нужно получить данные уже открытой формы «снаружи», например из другой формы или расширения — применяются обходные пути: общие модули, параметры сеанса, регистры сведений или поиск формы через глобальный контекст.
Ниже разобраны рабочие способы с примерами кода, ограничения каждого подхода и типичные ошибки, из-за которых данные теряются или форма падает с ошибкой.
Как устроен обмен данными между формами в управляемом приложении
В управляемых формах 1С действует строгое разделение: каждая форма — изолированный объект со своим контекстом. Реквизиты формы, табличные части и элементы недоступны извне напрямую. Платформа намеренно не даёт обратиться к произвольной открытой форме, чтобы избежать непредсказуемых зависимостей между окнами.
Поэтому обмен строится по модели «издатель — подписчик». Форма, у которой есть данные, сама отправляет их через ОповеститьОВыборе(), Оповестить() или возвращает результат при закрытии. Форма-получатель заранее регистрирует обработчик — процедуру, которая будет вызвана при получении данных. Это единственный поддерживаемый платформой сценарий для интерактивного обмена.
Получение данных через ОповеститьОВыборе при открытии формы выбора
Классический сценарий: ваша форма открывает форму выбора справочника или документа и должна получить выбранное значение. Для этого у команды открытия указывается владелец формы — элемент или форма, которым придёт оповещение о выборе.
В форме выбора платформа при стандартном выборе сама вызывает ОповеститьОВыборе(ВыбранноеЗначение). В форме-владельце нужно реализовать обработчик ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора), который и получит данные. Если форма выбора нестандартная, вызовите ОповеститьОВыборе() вручную перед закрытием.
// Форма-владелец: открытие формы выбора
&НаКлиенте
Процедура ВыбратьКонтрагента(Команда)
ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", , ЭтотОбъект);
КонецПроцедуры
// Обработчик получения данных
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Контрагенты") Тогда
Объект.Контрагент = ВыбранноеЗначение;
КонецЕсли;
КонецПроцедуры
Проверка результата простая: после выбора значения в открытой форме поле в форме-владельце заполняется без перезаписи объекта и без ошибок в журнале регистрации.
Получение результата через ОписаниеОповещения при закрытии формы
Когда форма не просто выбирает ссылку, а возвращает структуру данных — например, введённые пользователем параметры, — удобнее передать обработчик результата явно через ОписаниеОповещения. Оно передаётся последним параметром в ОткрытьФорму().
Открываемая форма при закрытии вызывает Закрыть(Результат), и указанная вами процедура получает этот результат первым параметром. Это основной способ для модальных по смыслу диалогов: ввод периода, настройка отбора, подтверждение действия.
// Открывающая сторона
&НаКлиенте
Процедура НастроитьОтбор(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеНастройкиОтбора", ЭтотОбъект);
ОткрытьФорму("Обработка.Подбор.Форма.НастройкаОтбора", , ЭтотОбъект, , , , Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеНастройкиОтбора(Результат, ДопПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // пользователь закрыл форму без результата
КонецЕсли;
ПрименитьОтбор(Результат);
КонецПроцедуры
Получение данных из уже открытой формы через глобальный контекст
Иногда форма уже открыта не вашим кодом, а данные из неё нужны — например, из внешней обработки или другой формы того же сеанса. Прямого API «дай мне форму документа №…» нет, но можно использовать то, что открытые формы доступны как свойства глобального контекста через их ключ уникальности, либо организовать обмен через Оповестить() и ОбработкаОповещения().
Более надёжный вариант — широковещательное оповещение. Форма-источник вызывает Оповестить("ПередатьДанные", Данные, УникальныйИдентификатор), а все формы, реализовавшие ОбработкаОповещения(ИмяСобытия, Параметр, Источник), получают данные и фильтруют их по имени события. Так работает и обратный запрос: форма-получатель шлёт оповещение «ЗапроситьДанные», форма-источник в ответ шлёт оповещение с данными.
// Форма-источник: ответ на запрос
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ЗапроситьДанныеДокумента" Тогда
Данные = Новый Структура("Номер, Дата, Контрагент",
Объект.Номер, Объект.Дата, Объект.Контрагент);
Оповестить("ДанныеДокумента", Данные, ЭтотОбъект.УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
Передача и чтение данных через параметры формы
Если данные нужны форме при открытии, а не после, используйте параметры. В ОткрытьФорму() вторым аргументом передаётся структура параметров. В открываемой форме они доступны через свойство Параметры в обработчике ПриСозданииНаСервере.
Обратная задача — прочитать параметры уже открытой формы — решается через ключевые параметры: если форма открыта с уникальным набором ключевых параметров, повторный вызов ОткрытьФорму() с теми же параметрами не создаст новую форму, а активирует существующую. Это позволяет «найти» открытую форму и, например, передать ей новые данные оповещением.
- 1Сформируйте структуру с параметрами в вызывающем коде
- 2Передайте её вторым аргументом в ОткрытьФорму()
- 3В открываемой форме прочитайте Параметры в ПриСозданииНаСервере
- 4Проверьте наличие каждого параметра через Параметры.Свойство() — отсутствующий параметр вызовет ошибку
- 5Для возврата результата добавьте ОписаниеОповещения или ОповеститьОВыборе
Альтернативы: когда оповещения не подходят
Оповещения работают только внутри одного сеанса и только пока обе формы открыты. Если данные нужно передать между сеансами, пользователями или сохранить между запусками — нужны серверные механизмы хранения.
Сравнение вариантов обмена
Подходит для форм выбора и подбора. Ограничение: работает только между формой-владельцем и открытой из неё формой.
Лучший вариант для диалогов с результатом любой структуры. Ограничение: обработчик должен быть экспортным и существовать на момент закрытия.
Широковещательный обмен между любыми открытыми формами сеанса. Ограничение: нужна дисциплина имён событий, иначе формы начнут реагировать на чужие оповещения.
Для обмена между сеансами и фоновыми заданиями. Ограничение: требует записи в базу и продуманной очистки устаревших данных.
Типичные ошибки и как их диагностировать
Большинство проблем при получении данных из формы сводится к нескольким повторяющимся причинам. Их легко распознать по симптомам.
Для диагностики включите отладку клиентского приложения и поставьте точки останова в обработчиках ОбработкаВыбора и ОбработкаОповещения. Если управление туда не приходит — проблема в том, как открыта форма (нет владельца или оповещение не вызывается). Если приходит, но данные пустые — проблема на стороне формы-источника.
Как проверить результат
Точка останова в ОбработкаВыбора или процедуре оповещения срабатывает после действия в открытой форме
Управление в обработчик не попадает — форма открыта без владельца или без ОписаниеОповещения
Структура результата содержит все ожидаемые ключи с корректными типами
Часть ключей отсутствует или значения имеют неожиданный тип — источник формирует данные иначе
При закрытии формы крестиком результат равен Неопределено и код корректно это обрабатывает
При отмене возникает ошибка обращения к полям результата
FAQ
Можно ли получить данные формы, открытой другим пользователем?
Нет, оповещения работают только внутри одного сеанса. Для межсеансового обмена используйте запись данных в регистр сведений или справочник с последующим чтением, либо механизм взаимодействий/обсуждений, если он подключён.
Как передать табличную часть из открытой формы?
Табличную часть нельзя передать напрямую. На сервере выгрузите её в массив структур или таблицу значений, поместите результат в структуру результата и передайте через Закрыть(Результат) или ОповеститьОВыборе.
Почему ОбработкаВыбора не вызывается, хотя форма выбора открывается?
Чаще всего форма открыта без указания владельца — третий параметр ОткрытьФорму() пуст. Укажите ЭтотОбъект или элемент формы владельцем. Вторая причина: в нестандартной форме выбора не вызывается ОповеститьОВыборе — добавьте вызов вручную.
Чем отличается ОповеститьОВыборе от Оповестить?
ОповеститьОВыборе адресное: его получает только форма-владелец через ОбработкаВыбора. Оповестить — широковещательное: его получают все открытые формы через ОбработкаОповещения, фильтруя по имени события.
Как получить данные из формы внешней обработки, открытой из конфигурации?
Механизм тот же: передайте ОписаниеОповещения при открытии формы обработки или укажите вызывающую форму владельцем. Внешность обработки не влияет на механику оповещений.
Можно ли обратиться к реквизитам открытой формы напрямую по имени?
Штатного способа нет — платформа изолирует контексты форм. Попытки найти форму через окна и прочитать реквизиты не поддерживаются и ломаются при обновлении платформы. Используйте оповещения или параметры.
Что важно запомнить
Данные открытой формы 1С получают не прямым доступом, а через механизмы обмена: ОповеститьОВыборе для форм выбора, ОписаниеОповещения с Закрыть(Результат) для диалогов, широковещательные Оповестить/ОбработкаОповещения для произвольных форм сеанса. Всегда обрабатывайте отмену (Неопределено), передавайте только сериализуемые типы и делайте обработчики экспортными.