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