При разработке интерфейсов в «1С:Предприятие 8.3» часто возникает задача создания удобной рабочей области (РО) на начальной странице. Типичный сценарий: слева располагается список записей (например, динамический список регистра сведений), а справа — форма с детальной информацией или ресурсами выбранной записи. В этой статье мы подробно разберем, как реализовать автоматическое обновление правой части при перемещении по строкам в левой части, рассмотрим механизмы оповещения и способы оптимизации производительности.
Самый распространенный и гибкий метод взаимодействия между двумя независимыми формами на начальной странице — это использование системы глобальных оповещений. Рассмотрим этот процесс по шагам. Суть метода заключается в том, что одна форма «кричит» о событии, а вторая «слушает» и реагирует на него.
Во-первых, в форме списка (левая колонка) нам необходимо отследить момент, когда пользователь выбирает другую строку. Для этого используется событие таблицы ПриАктивизацииСтроки. В обработчике этого события мы будем вызывать метод Оповестить.
Важный нюанс: Чтобы не вызывать конфликтов с другими формами системы, в качестве имени события следует использовать уникальную строку. Проанализируем пример кода для левой формы:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("КлючЗаписи", ТекущиеДанные.Ключ);
// Отправляем оповещение всей системе
Оповестить("ОбновитьДетализациюРабочегоСтола", ПараметрыОповещения);
КонецЕсли;
КонецПроцедуры
Во-вторых, в форме деталей (правая колонка) необходимо настроить прием этого сообщения. Для этого используется стандартное событие формы ОбработкаОповещения. Разберем, как это реализовать:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОбновитьДетализациюРабочегоСтола" Тогда
// Получаем данные и обновляем реквизиты формы
ОбновитьДанныеНаФорме(Параметр.КлючЗаписи);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьДанныеНаФорме(КлючЗаписи)
// Здесь происходит чтение ресурсов из регистра по ключу записи
Запись = РегистрыСведений.НашРегистр.СоздатьКлючЗаписи(КлючЗаписи);
// Заполнение реквизитов формы...
КонецПроцедуры
Проанализируем ситуацию: если пользователь начинает быстро пролистывать список с помощью стрелок на клавиатуре, событие ПриАктивизацииСтроки будет срабатывать мгновенно для каждой строки. Это приведет к лавинообразному количеству вызовов Оповестить и, как следствие, к серверным вызовам в правой форме. Интерфейс начнет «подтормаживать».
Чтобы избежать этого, применим метод «дребезга» (debouncing) через ПодключитьОбработчикОжидания. Идея в том, чтобы обновлять правую часть только тогда, когда пользователь задержится на строке более чем на 0.2 секунды.
Рассмотрим обновленный код для левой формы:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
// Сначала отключаем предыдущий обработчик, если он был запущен
ОтключитьОбработчикОжидания("ВыполнитьОповещениеОбОбновлении");
// Запускаем новый таймер на 0.2 секунды
ПодключитьОбработчикОжидания("ВыполнитьОповещениеОбОбновлении", 0.2, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьОповещениеОбОбновлении()
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
Оповестить("ОбновитьДетализациюРабочегоСтола", ТекущиеДанные.Ключ);
КонецЕсли;
КонецПроцедуры
Такой подход значительно повышает отзывчивость интерфейса начальной страницы, делая работу пользователя более комфортной.
Хотя платформа 1С позволяет размещать несколько форм в рабочей области начальной страницы, наиболее стабильным и производительным решением часто является создание **одной общей формы**. Вместо того чтобы настраивать связи между разными объектами метаданных, мы проектируем одну форму, разделенную на группы.
Рассмотрим преимущества этого метода:
Оповестить. Вы можете напрямую обращаться к реквизитам формы в одном контексте.Для реализации этого метода создадим форму, в которой:
ПриАктивизацииСтроки будем вызывать серверную процедуру для заполнения этих реквизитов.Если данные в правой части должны обновляться не только при навигации, но и при изменении самих данных в базе (например, другим пользователем или фоновым заданием), выясним, как работает механизм ОповеститьОбИзменении. Этот метод позволяет системе автоматически уведомлять все формы, работающие с определенным типом данных.
В правой форме мы можем перехватывать системные изменения объектов. Если левая форма выполняет запись в базу данных, вызов ОповеститьОбИзменении(ТипЗнч(Ссылка)) заставит все заинтересованные формы (включая нашу правую часть) обновиться. Это более «нативный» для платформы 1С путь, когда речь идет о целостности отображаемых данных.
Иногда передача больших объемов данных через параметры Оповестить может быть неэффективной. В таких случаях программисты используют вспомогательные механизмы:
1. Временное хранилище: Левая форма записывает структуру данных во временное хранилище и передает в оповещении только Адрес. Правая форма читает данные по этому адресу. Это полезно, если нужно передать, например, массив или сложную таблицу.
2. Клиентские переменные общего модуля: Если данные нужны только на клиенте, можно создать общий модуль с флагом «Клиент (управляемое приложение)» и объявить там экспортную переменную. Это позволит избежать серверных вызовов при передаче идентификаторов между формами, так как данные остаются в памяти клиентского сеанса.
Подводя итог, можно сказать, что выбор метода зависит от сложности вашей задачи. Для простых интерфейсов идеально подходит Оповестить с обязательным использованием ПодключитьОбработчикОжидания для оптимизации. Для сложных и высоконагруженных рабочих столов лучше рассмотреть вариант объединения логики в одну форму.