Документооборот ПРОФ, КОРП, ДГУ
30.03.2016

Переопределение превью документа

Что такое "превью" документа

В 1С: "Документообороте" под "превью" понимается HTML-поле для предварительного просмотра информации о документе. Поле содержит в себе идентификационные данные (например, наименование и регистрационные данные) и основные реквизиты документа.

Превью отображается:

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

При открытии карточки пользователь видит закладку "Обзор" первой. Отображение закладки "Обзор" регулируется персональной настройкой (Настройка и администрирование – Сервис – Персональные настройки – Документы – Использовать обзор документов) и по умолчанию включено. Для каждого типа документа закладка обзор содержит таблицу файлов и превью с реквизитами данного документа.

Тексты превью карточек документов формируются в функциях общего модуля ОбзорДокумента. Для внутреннего документа это ПолучитьОбзорВнутреннегоДокумента(Форма), для входящего документа – ПолучитьОбзорВходящегоДокумента(Форма), для исходящего – ПолучитьОбзорИсходящегоДокумента(Форма). В качестве параметра в функции передаются соответствующие управляемые формы. Также данный модуль содержит и все сопутствующие процедуры и функции, которые помогают формировать превью карточки документа.

Для форм списков документа созданы отдельные общие модули ОбзорСпискаДокументов и ОбзорСпискаДокументовКлиент. Первый содержит процедуры и функции, которые подготавливают данные и формируют превью документа. Второй – общие процедуры, которые выводят данные на формы списков.

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

Переопределяемые модули для подмены превью документа

Сформировать собственное превью карточки или списка документов можно с помощью одноименных функций в переопределяемых модулях. Для карточки документа это общий модуль ОбзорДокументаПереопределяемый, для списка документов – ОбзорСпискаДокументовПереопределяемый.

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

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

Данная процедура вызывается в начале построения стандартного превью документа ОбзорДокумента.ПолучитьОбзорИсходящегоДокумента. Если она возвращает не пустую строку, то программа считает, что превью документа переопределено, и показывает его. При этом стандартное отображение превью игнорируется.

Пример переопределения превью в карточке документа

Рассмотрим такой пример: заказчик просит, чтобы у документов на сумму более 100 000 рублей в превью сумма выделялась красным цветом. Это удобно для быстрой идентификации таких документов сотрудниками.
Для реализации просьбы необходимо сделать следующее:

  1. Разрешить редактирование объекта метаданных общий модуль ОбзорДокументаПереопределяемый.
  2. Из модуля ОбзорДокумента скопировать процедуры ПолучитьОбзорВнутреннегоДокументаСКорреспондентом, ПолучитьКонтактнуюИнформацияОбъекта, ДобавитьДопРеквизит, ДобавитьРеквизит, ДобавитьЗначение, ДобавитьПодпись, СостояниеДела.
  3. В начале процедуры ПолучитьОбзорВнутреннегоДокументаСКорреспондентом сделать проверку включения учета суммы у данного вида документа и проверить сумму (что она больше 100 000 рублей). Если условия не выполняются, то вернуть пустую строку, которая будет означать отображение стандартного превью.
  4. Далее в код, который выводит сумму документа, добавить указание цвета реквизита.
Копировать в буфер обмена
Функция ПолучитьОбзорВнутреннегоДокументаСКорреспондентом(Форма)
	
	Объект = Форма.Объект;
	
	Если Не ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ВидДокумента, "УчитыватьСуммуДокумента")
		Или Объект.Сумма < 100000 Тогда
		Возврат "";
	КонецЕсли;
……
Если РеквизитыВида.УчитыватьСуммуДокумента Тогда
		ДобавитьРеквизит(HTMLТекст, НСтр("ru = 'Сумма:'"), 
			Формат(Объект.Сумма, "ЧДЦ=2; ЧН=0") + " " + Объект.Валюта.Наименование, "FF0303");
……

Тогда превью документа будет выглядеть так:

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

Для реализации просьбы в процедуру ПолучитьОбзорВнутреннегоДокументаСКорреспондентом необходимо добавить следующий код:

Копировать в буфер обмена
Функция ПолучитьОбзорВнутреннегоДокументаСКорреспондентом(Форма)
	……
Если ПолучитьФункциональнуюОпцию("ИспользоватьСостоянияДокументов") Тогда
		ДобавитьПодпись(HTMLТекст, НСтр("ru = 'Состояние:'"));
		HTMLТекст = HTMLТекст + СтрШаблон(
			""<A href="v8doc:%1">%2</A><BR>",
			"status",
			Форма.СостояниеТекст);
	КонецЕсли;

ТаблицаВизДокумента = РаботаСВизамиСогласования.ПолучитьВизыДокумента(Объект.Ссылка);
	Если ТаблицаВизДокумента.Количество() > 0 Тогда 
		ДобавитьПодпись(HTMLТекст, НСтр("ru = 'Визы согласования:'"));	КонецЕсли;	
	Для Каждого Виза Из ТаблицаВизДокумента Цикл 
		Если Виза.РезультатСогласования = Перечисления.РезультатыСогласования.НеСогласовано Тогда 
			ДобавитьЗначение(HTMLТекст, СокрЛП(Виза.Исполнитель) + ": " + СокрЛП(Виза.РезультатСогласования) + ";",
				"B22222");		Иначе 
			ДобавитьЗначение(HTMLТекст, СокрЛП(Виза.Исполнитель) + ": " + СокрЛП(Виза.РезультатСогласования) + ";",
				"008000");		КонецЕсли;	
		
		HTMLТекст = HTMLТекст + "<br>";
	КонецЦикла;
		HTMLТекст = HTMLТекст + "<p>";; 
	…… 

Тогда превью будет выглядеть следующим образом:

Пример переопределения превью в списке документов

Рассмотрим пример переопределения превью в списке внутренних документов: заказчик просит добавить в превью списка информацию о состоянии документа.

Для реализации просьбы необходимо выполнить следующее:

  1. Разрешить редактирование объекта метаданных общий модуль ОбзорСпискаДокументовПереопределяемый.
  2. Из модуля ОбзорСпискаДокументов скопировать в него процедуры ПолучитьОбзорВнутреннегоДокументаСКорреспондентом, ДобавитьДопРеквизит, ДобавитьРеквизит, ДобавитьЗначение, ДобавитьПодпись.
  3. В процедуру ПолучитьОбзорДокумента скопировать часть кода из процедуры ОбзорСпискаДокументов .ПолучитьДанныеОбзора и доработать его.
  4. Вывести в превью Состояние документа.
Копировать в буфер обмена
// Переопределяемая функция получения обзора документа
Функция ПолучитьОбзорДокумента(Документ) ЭкспортЕсли ПолучитьФункциональнуюОпцию("ИспользоватьСостоянияДокументов") Тогда
	ДобавитьПодпись(HTMLТекст, НСтр("ru = 'Состояние:'"));
	HTMLТекст = HTMLТекст + СтрШаблон(
		""<A href="v8doc:%1">%2</A><BR>",
		"status",	
	Делопроизводство.ПолучитьСтроковоеПредставлениеСостояний(Выборка.Ссылка));
КонецЕсли;Возврат HTMLТекст;
КонецФункции

Результат работы процедуры изображен на рисунке:

Таким образом, переопределяя работу указанных модулей, разработчик может довольно быстро изменить работу стандартного превью документа. Он может как добавлять/убирать нужные или ненужные реквизиты, так и полностью менять содержимое и назначение превью того или иного документа.