Как реализовать интерфейс со списком документов слева и формой просмотра справа в 1С

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

В современной разработке на платформе 1С:Предприятие 8.3 пользователи всё чаще запрашивают интерфейсы, напоминающие почтовые клиенты или современные CRM-системы. Одним из таких запросов является разделение экрана на две части: в левой части располагается Динамический список документов, а в правой — полноценная Форма документа или его детальный просмотр. Это позволяет быстро переключаться между документами без необходимости постоянно открывать и закрывать новые окна.

Рассмотрим подробнее, как реализовать такой механизм в управляемом приложении, сохранив при этом производительность системы и удобство работы. Разберем основные технические подходы, от простого встраивания реквизитов до использования HTML-шаблонов.

Архитектура формы: Группировка элементов

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

  1. Добавим на форму основную группу типа Группа — Страницы или Группа — Колонки.
  2. В левой части разместим таблицу, связанную с ДинамическийСписок.
  3. В правой части создадим группу, которая будет служить контейнером для отображения данных текущего документа.

Важно понимать, что просто «вставить» готовую типовую форму другого объекта внутрь текущей формы напрямую через конфигуратор невозможно. Нам придется использовать программные методы управления окнами или имитацию формы.

Реализация через событие ПриАктивизацииСтроки

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

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


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

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

Разберем по шагам: метод ПодключитьОбработчикОжидания с параметром Истина (однократно) позволяет дождаться паузы в действиях пользователя. Только когда скроллинг остановится на 300 миллисекунд, сработает процедура ОбновитьПредпросмотрДокумента.

Вариант 1: Использование облегченного HTML-превью

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

Проанализируем преимущества этого метода:

  1. Скорость: На сервере генерируется только нужный нам HTML-код с ключевыми реквизитами и табличной частью.
  2. Гибкость: Мы можем стилизовать документ как угодно, выделив цветом важные статусы или итоги.
  3. Безопасность: Мы не создаем лишних блокировок данных, так как это просто «снимок» информации.

Посмотрим на пример формирования простого макета:


&НаСервере
Функция Получить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;
КонецФункции

Вариант 2: Программное открытие типовой формы в панели

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

В этом случае программисты часто прибегают к использованию Вспомогательной формы. В правой части основной формы размещаются реквизиты, которые программно заполняются данными из выбранного документа. Чтобы имитировать форму элемента, можно создать отдельную упрощенную форму «ДляПросмотра» в самом документе и программно вызывать её открытие в отдельном блокирующем окне или рядом, используя метод ПоказатьВместеС().

Рассмотрим пример использования метода для открытия окна рядом:


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

Оптимизация и блокировки

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

Рекомендации по интерфейсу (UX)

Разберем, как сделать такой интерфейс по-настоящему удобным для пользователя:

  1. Разделитель (Splitter): Используйте группы с возможностью изменения размера, чтобы пользователь мог сам решить, какая часть экрана ему важнее — список или детали.
  2. Кнопки быстрого действия: Прямо над областью просмотра добавьте кнопки «Печать», «Провести» или «Создать на основании». Это избавит пользователя от необходимости заходить внутрь документа.
  3. Индикатор загрузки: Если документ «тяжелый», добавьте визуальную декорацию (картинку или текст «Загрузка...»), которая появляется в момент срабатывания обработчика ожидания.

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

← На главную