По умолчанию в отчетах на базе системы компоновки данных (СКД) документы-регистраторы выводятся в полном системном формате, например: Списание с расчетного счета 0000-007328 от 04.08.2017 16:12:49. На практике пользователям часто требуется более компактное представление без времени, префиксов и лидирующих нулей, например: Списание № 007328 от 04.08.2017.
Рассмотрим подробнее способы форматирования документа-регистратора, их плюсы, минусы и особенности реализации.
Самый правильный и удобный способ — переопределить представление поля непосредственно в схеме компоновки данных на вкладке «Наборы данных» (или «Вычисляемые поля») в колонке «Выражение представления».
Главный плюс этого подхода заключается в том, что сам реквизит сохраняет ссылочный тип данных (ДокументСсылка). Пользователь получает красивый текст в отчете, но при этом сохраняется стандартная расшифровка 1С — по двойному клику на ячейку можно открыть сам документ.
Проанализируем пример выражения для поля Регистратор:
"Списание № " + ПОДСТРОКА(Регистратор.Номер, 6, 6) + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
Разберем, как работают используемые функции:
ПОДСТРОКА(Регистратор.Номер, 6, 6) — обрезает первые 5 символов префикса и преобразует номер к нужному виду.Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy") — приводит дату к каноничному формату без вывода времени.Если регистратор может принимать значения разных типов документов, используем условную конструкцию ВЫБОР:
ВЫБОР
КОГДА Регистратор ССЫЛКА Документ.СписаниеСРасчетногоСчета
ТОГДА "Списание № " + ПОДСТРОКА(Регистратор.Номер, 6, 6) + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
КОГДА Регистратор ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
ТОГДА "Поступление № " + ПОДСТРОКА(Регистратор.Номер, 6, 6) + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
ИНАЧЕ Строка(Регистратор)
КОНЕЦ
Если алгоритм форматирования документа сложен или используется в нескольких отчетах, вычисления можно вынести в экспортную функцию общего модуля.
1. Создадим функцию в серверном общем модуле (например, МойМодульОтчетов):
Функция СформироватьПредставлениеДокумента(Регистратор) Экспорт
Если Не ЗначениеЗаполнено(Регистратор) Тогда
Возврат "";
КонецЕсли;
НомерДок = Сред(Регистратор.Номер, 6);
ДатаДок = Формат(Регистратор.Дата, "ДЛФ=D");
Возврат "Списание № " + НомерДок + " от " + ДатаДок;
КонецФункции
2. В СКД в поле «Выражение представления» для регистратора прописываем вызов функции:
МойМодульОтчетов.СформироватьПредставлениеДокумента(Регистратор)
Формировать итоговое представление можно и на уровне языка запросов. Однако следует учитывать: при преобразовании документа в строку в самом запросе поле теряет ссылочный тип, и стандартная расшифровка (открытие документа из отчета) перестает работать.
Пример построения строки с помощью подстрок и параметра-массива чисел:
ВЫБОР
КОГДА АР_РасходыПоСобственникам.Регистратор ССЫЛКА Документ.СписаниеСРасчетногоСчета
ТОГДА "Списание №"
ИНАЧЕ ""
КОНЕЦ
+ ПОДСТРОКА(АР_РасходыПоСобственникам.Регистратор.Номер, 6, 6)
+ " от "
+ ПОДСТРОКА(&ЧислоСтрокой, (ГОД(АР_РасходыПоСобственникам.Регистратор.Дата) - 2000) * 2 + 1, 2)
+ "/"
+ ПОДСТРОКА(&ЧислоСтрокой, МЕСЯЦ(АР_РасходыПоСобственникам.Регистратор.Дата) * 2 + 1, 2)
+ "/"
+ ПОДСТРОКА(&ЧислоСтрокой, ДЕНЬ(АР_РасходыПоСобственникам.Регистратор.Дата) * 2 + 1, 2) КАК РегистраторДок
Выясним важную техническую деталь: поле Регистратор в регистрах сведений и накопления имеет составной тип данных. Любое прямое обращение к его реквизитам через точку (Регистратор.Номер, Регистратор.Дата) приводит к неявному левому соединению (LEFT JOIN) со всеми таблицами документов, являющихся регистраторами данного регистра.
Для оптимизации скорости выполнения отчета на больших объемах данных рекомендуется явно ограничивать тип документа с помощью функции ВЫРАЗИТЬ в запросе:
ВЫРАЗИТЬ(Регистратор КАК Документ.СписаниеСРасчетногоСчета).Номер
Это исключит лишние соединения с таблицами других документов на стороне СУБД и позволит отчету формироваться значительно быстрее.