Как организовать взаимодействие между формами на рабочей области начальной страницы в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов в «1С:Предприятие 8.3» часто возникает задача создания удобной рабочей области (РО) на начальной странице. Типичный сценарий: слева располагается список записей (например, динамический список регистра сведений), а справа — форма с детальной информацией или ресурсами выбранной записи. В этой статье мы подробно разберем, как реализовать автоматическое обновление правой части при перемещении по строкам в левой части, рассмотрим механизмы оповещения и способы оптимизации производительности.

Механизм взаимодействия через «Оповестить» и «ОбработкаОповещения»

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

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

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


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

Во-вторых, в форме деталей (правая колонка) необходимо настроить прием этого сообщения. Для этого используется стандартное событие формы ОбработкаОповещения. Разберем, как это реализовать:


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

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

Оптимизация производительности: использование обработчика ожидания

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

Чтобы избежать этого, применим метод «дребезга» (debouncing) через ПодключитьОбработчикОжидания. Идея в том, чтобы обновлять правую часть только тогда, когда пользователь задержится на строке более чем на 0.2 секунды.

Рассмотрим обновленный код для левой формы:


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    // Сначала отключаем предыдущий обработчик, если он был запущен
    ОтключитьОбработчикОжидания("ВыполнитьОповещениеОбОбновлении");
    // Запускаем новый таймер на 0.2 секунды
    ПодключитьОбработчикОжидания("ВыполнитьОповещениеОбОбновлении", 0.2, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьОповещениеОбОбновлении()
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        Оповестить("ОбновитьДетализациюРабочегоСтола", ТекущиеДанные.Ключ);
    КонецЕсли;
КонецПроцедуры

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

Альтернативный подход: создание единой формы

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

Рассмотрим преимущества этого метода:

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

Для реализации этого метода создадим форму, в которой:

Использование метода «ОповеститьОбИзменении»

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

В правой форме мы можем перехватывать системные изменения объектов. Если левая форма выполняет запись в базу данных, вызов ОповеститьОбИзменении(ТипЗнч(Ссылка)) заставит все заинтересованные формы (включая нашу правую часть) обновиться. Это более «нативный» для платформы 1С путь, когда речь идет о целостности отображаемых данных.

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

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

1. Временное хранилище: Левая форма записывает структуру данных во временное хранилище и передает в оповещении только Адрес. Правая форма читает данные по этому адресу. Это полезно, если нужно передать, например, массив или сложную таблицу.

2. Клиентские переменные общего модуля: Если данные нужны только на клиенте, можно создать общий модуль с флагом «Клиент (управляемое приложение)» и объявить там экспортную переменную. Это позволит избежать серверных вызовов при передаче идентификаторов между формами, так как данные остаются в памяти клиентского сеанса.

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

← На главную