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

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

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

Постановка задачи и основные инструменты

Представим ситуацию: у нас есть форма списка документов ЗаказКлиента. Мы хотим добавить на эту форму поле табличного документа, в котором при перемещении по списку будет автоматически отображаться печатная форма «Счет на оплату». Для реализации нам понадобятся:

  1. Динамический список на управляемой форме.
  2. Реквизит формы с типом Результат (тип ТабличныйДокумент).
  3. Элемент формы Поле табличного документа, связанный с этим реквизитом.
  4. Событие ПриАктивизацииСтроки элемента формы (таблицы списка).

Проблема производительности и «серверный вызов»

Прежде чем переходить к коду, проанализируем ситуацию с точки зрения производительности. Событие ПриАктивизацииСтроки срабатывает каждый раз, когда пользователь переходит от одной строки к другой. Если мы будем формировать печатную форму (которая требует запросов к БД и работы с макетом) напрямую в этом событии, интерфейс будет «тормозить», а сервер — испытывать колоссальную нагрузку при быстром пролистывании списка стрелками на клавиатуре.

Для решения этой проблемы мы применим механизм отложенного выполнения с помощью обработчика ожидания.

Шаг 1. Настройка формы и обработчик ожидания

Рассмотрим, как правильно настроить вызов обновления печатной формы. Вместо прямого серверного вызова мы будем подключать обработчик ожидания с небольшой задержкой (например, 0.5 секунды). Если пользователь быстро пролистает 10 строк, обработчик сработает только на последней, когда движение прекратится.


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

Шаг 2. Реализация обновления данных

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


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

Шаг 3. Формирование печатной формы на сервере

Проанализируем способы получения табличного документа. Если ваша конфигурация построена на базе БСП (Библиотеки стандартных подсистем), крайне рекомендуется использовать встроенные механизмы печати. Это гарантирует, что предпросмотр будет идентичен реальной печатной форме.


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

КонецПроцедуры

Эргономика и дополнительные настройки

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

Альтернативные варианты (PDF и HTML)

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

  1. Документ PDF: Современная платформа позволяет отображать PDF-файлы внутри формы. Это удобно, если счета уже хранятся в присоединенных файлах в формате PDF.
  2. Поле HTML-документа: Табличный документ можно сохранить в HTML. Этот вариант работает крайне быстро, однако может незначительно искажать сложные макеты со вложенными рисунками или специфическими шрифтами.

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

← На главную