В современной разработке на платформе 1С:Предприятие 8.3 пользователи всё чаще запрашивают интерфейсы, напоминающие почтовые клиенты или современные CRM-системы. Одним из таких запросов является разделение экрана на две части: в левой части располагается Динамический список документов, а в правой — полноценная Форма документа или его детальный просмотр. Это позволяет быстро переключаться между документами без необходимости постоянно открывать и закрывать новые окна.
Рассмотрим подробнее, как реализовать такой механизм в управляемом приложении, сохранив при этом производительность системы и удобство работы. Разберем основные технические подходы, от простого встраивания реквизитов до использования HTML-шаблонов.
Первым шагом проанализируем структуру нашей формы. Нам необходимо создать общую форму (или использовать форму списка), в которой мы визуально разделим пространство. Для этого выполним следующие действия:
ДинамическийСписок.Важно понимать, что просто «вставить» готовую типовую форму другого объекта внутрь текущей формы напрямую через конфигуратор невозможно. Нам придется использовать программные методы управления окнами или имитацию формы.
Для того чтобы правая часть обновлялась при перемещении курсора по списку, мы будем использовать событие ПриАктивизацииСтроки таблицы списка. Однако здесь кроется главная ловушка производительности: если пользователь начнет быстро скроллить список стрелками на клавиатуре, система попытается мгновенно открыть или обновить десятки форм, что приведет к «зависанию» интерфейса.
Выясним причину этой проблемы: каждое обращение к серверу для получения данных формы занимает время. Чтобы этого избежать, применим Обработчик ожидания. Рассмотрим пример кода для формы списка:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
// Отключаем предыдущий обработчик, если пользователь нажал кнопку быстро
ОтключитьОбработчикОжидания("ОбновитьПредпросмотрДокумента");
// Запускаем новый обработчик с задержкой 0.3 - 0.5 секунды
ПодключитьОбработчикОжидания("ОбновитьПредпросмотрДокумента", 0.3, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьПредпросмотрДокумента()
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Здесь вызывается логика обновления правой панели
ОтобразитьДанныеДокумента(ТекущиеДанные.Ссылка);
КонецПроцедуры
Разберем по шагам: метод ПодключитьОбработчикОжидания с параметром Истина (однократно) позволяет дождаться паузы в действиях пользователя. Только когда скроллинг остановится на 300 миллисекунд, сработает процедура ОбновитьПредпросмотрДокумента.
Как показывает практика внедрения в крупных конфигурациях (например, в модулях ЭДО), отображение полноценной тяжелой формы документа в правой панели не всегда оправдано. Типовая форма содержит множество процедур ПриСозданииНаСервере, ПриОткрытии, проверки прав и сложные расчеты. Вместо этого эффективнее использовать поле HTML-документа.
Проанализируем преимущества этого метода:
Посмотрим на пример формирования простого макета:
&НаСервере
Функция ПолучитьHTMLТекстДокумента(СсылкаДокумента)
// Получаем данные через запрос для максимального быстродействия
Данные = СсылкаДокумента.ПолучитьОбъект();
HTML = "<html><body>";
HTML = HTML + "<h1>" + Строка(СсылкаДокумента) + "</h1>";
HTML = HTML + "<p>Контрагент: " + Данные.Контрагент + "</p>";
HTML = HTML + "<table border='1'>";
Для Каждого СтрокаТЧ Из Данные.Товары Цикл
HTML = HTML + "<tr><td>" + СтрокаТЧ.Номенклатура + "</td><td>" + СтрокаТЧ.Сумма + "</td></tr>";
КонецЦикла;
HTML = HTML + "</table></body></html>";
Возврат HTML;
КонецФункции
Если задача стоит максимально жестко — использовать именно созданную типовую форму без рисования макетов — мы можем воспользоваться механизмом блокировки оповещений и режимом «Только просмотр». Однако помните, что стандартная платформа 1С не позволяет «вклеить» одну управляемую форму внутрь другой как элемент управления Группа.
В этом случае программисты часто прибегают к использованию Вспомогательной формы. В правой части основной формы размещаются реквизиты, которые программно заполняются данными из выбранного документа. Чтобы имитировать форму элемента, можно создать отдельную упрощенную форму «ДляПросмотра» в самом документе и программно вызывать её открытие в отдельном блокирующем окне или рядом, используя метод ПоказатьВместеС().
Рассмотрим пример использования метода для открытия окна рядом:
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ФормаДокумента = ПолучитьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
ФормаДокумента.ТолькоПросмотр = Истина;
// Этот метод доступен в некоторых специфических режимах работы окон
ФормаДокумента.Открыть();
При реализации такого интерфейса крайне важно учитывать режим доступа к данным. Если вы открываете реальную форму документа, 1С может попытаться установить объектную блокировку. Это недопустимо для простого списка просмотра. Поэтому:
ТолькоПросмотр = Истина для открываемой справа формы.ReadOnly на уровне данных, если это возможно.ПолучитьОбъект(), чтобы не тянуть в память весь объект со всеми его табличными частями и обработчиками.Разберем, как сделать такой интерфейс по-настоящему удобным для пользователя:
Подводя итог, можно сказать, что наиболее стабильным и профессиональным решением для реализации интерфейса «список слева — форма справа» является сочетание Динамического списка с обработчиком ожидания и HTML-поля для отображения сводной информации о документе. Это обеспечивает молниеносный отклик интерфейса и предоставляет пользователю всю необходимую информацию без лишних кликов.