Как настроить красивое представление регистратора в СКД?

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

По умолчанию в отчетах на базе системы компоновки данных (СКД) документы-регистраторы выводятся в полном системном формате, например: Списание с расчетного счета 0000-007328 от 04.08.2017 16:12:49. На практике пользователям часто требуется более компактное представление без времени, префиксов и лидирующих нулей, например: Списание № 007328 от 04.08.2017.

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

Способ 1. Настройка свойства «Выражение представления» в СКД (Рекомендуемый)

Самый правильный и удобный способ — переопределить представление поля непосредственно в схеме компоновки данных на вкладке «Наборы данных» (или «Вычисляемые поля») в колонке «Выражение представления».

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

Проанализируем пример выражения для поля Регистратор:


"Списание № " + ПОДСТРОКА(Регистратор.Номер, 6, 6) + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")

Разберем, как работают используемые функции:

  1. ПОДСТРОКА(Регистратор.Номер, 6, 6) — обрезает первые 5 символов префикса и преобразует номер к нужному виду.
  2. Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy") — приводит дату к каноничному формату без вывода времени.

Если регистратор может принимать значения разных типов документов, используем условную конструкцию ВЫБОР:


ВЫБОР
    КОГДА Регистратор ССЫЛКА Документ.СписаниеСРасчетногоСчета
        ТОГДА "Списание № " + ПОДСТРОКА(Регистратор.Номер, 6, 6) + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
    КОГДА Регистратор ССЫЛКА Документ.ПоступлениеНаРасчетныйСчет
        ТОГДА "Поступление № " + ПОДСТРОКА(Регистратор.Номер, 6, 6) + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
    ИНАЧЕ Строка(Регистратор)
КОНЕЦ

Способ 2. Использование экспортной функции общего модуля

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

1. Создадим функцию в серверном общем модуле (например, МойМодульОтчетов):


Функция СформироватьПредставлениеДокумента(Регистратор) Экспорт
    
    Если Не ЗначениеЗаполнено(Регистратор) Тогда
        Возврат "";
    КонецЕсли;
    
    НомерДок = Сред(Регистратор.Номер, 6);
    ДатаДок  = Формат(Регистратор.Дата, "ДЛФ=D");
    
    Возврат "Списание № " + НомерДок + " от " + ДатаДок;
    
КонецФункции

2. В СКД в поле «Выражение представления» для регистратора прописываем вызов функции:

МойМодульОтчетов.СформироватьПредставлениеДокумента(Регистратор)

Способ 3. Преобразование строки в тексте запроса

Формировать итоговое представление можно и на уровне языка запросов. Однако следует учитывать: при преобразовании документа в строку в самом запросе поле теряет ссылочный тип, и стандартная расшифровка (открытие документа из отчета) перестает работать.

Пример построения строки с помощью подстрок и параметра-массива чисел:


ВЫБОР
    КОГДА АР_РасходыПоСобственникам.Регистратор ССЫЛКА Документ.СписаниеСРасчетногоСчета
        ТОГДА "Списание №"
    ИНАЧЕ ""
КОНЕЦ 
+ ПОДСТРОКА(АР_РасходыПоСобственникам.Регистратор.Номер, 6, 6) 
+ " от " 
+ ПОДСТРОКА(&ЧислоСтрокой, (ГОД(АР_РасходыПоСобственникам.Регистратор.Дата) - 2000) * 2 + 1, 2) 
+ "/" 
+ ПОДСТРОКА(&ЧислоСтрокой, МЕСЯЦ(АР_РасходыПоСобственникам.Регистратор.Дата) * 2 + 1, 2) 
+ "/" 
+ ПОДСТРОКА(&ЧислоСтрокой, ДЕНЬ(АР_РасходыПоСобственникам.Регистратор.Дата) * 2 + 1, 2) КАК РегистраторДок

Оптимизация производительности при работе с регистратором

Выясним важную техническую деталь: поле Регистратор в регистрах сведений и накопления имеет составной тип данных. Любое прямое обращение к его реквизитам через точку (Регистратор.Номер, Регистратор.Дата) приводит к неявному левому соединению (LEFT JOIN) со всеми таблицами документов, являющихся регистраторами данного регистра.

Для оптимизации скорости выполнения отчета на больших объемах данных рекомендуется явно ограничивать тип документа с помощью функции ВЫРАЗИТЬ в запросе:

ВЫРАЗИТЬ(Регистратор КАК Документ.СписаниеСРасчетногоСчета).Номер

Это исключит лишние соединения с таблицами других документов на стороне СУБД и позволит отчету формироваться значительно быстрее.

← На главную